简单服务器通信 模型socketserver
硬件服务器:主机 集群
厂商 :IBM HP 联想 浪潮
软件服务器 :编写的服务端应用程序,在硬件服务器上运行,一般依托于操作系统,给用户提供一套完整的服务
httpserver --> 处理http 请求
webserver -->网站的后端应用服务器程序
邮箱服务器 -->邮件处理
ftp 文件服务器 -->文件上传下载
功能 :网络连接 | 逻辑处理 | 数据交互 | 数据传输 | 协议的实现
结构 : c / s 客户端服务器模型
b/ s 浏览器服务器模型
服务器目标 : 处理速度更快,并发量更高,安全性更强
硬件 : 更高的配置,更好的集成分布技术,更好的优化和网络安全技术
软件 : 占用资源更少,运行更稳定,算法更优良,安全性更好,并发性更高,更容易扩展
基础服务端模型
循环模型 :循环接收客户端请求,处理请求,同一时刻只能处理一个请求,处理完毕后再处理下一个
优点 : 实现简单,占用资源少
缺点 :无法同时处理多个客户端任务
适用情况 : 处理的任务可以短时间完成,不需要建立并发,更适合UDP使用
并发模型:能够同时处理多个客户端请求
IO并发 : IO多路复用
优点 : 资源消耗少,IO处理速度快
缺点 : 不能适用CPU密集型程序
多进程/多线程并发: 为每个客户端创建单独的进程线程,执行请求
优点:每个客户端可以长期占有服务器运行程序,能够使用多核资源,可以处理IO或者CPU运算
缺点:消耗系统资源高
多进程并发模型:
使用fork()实现多进程并发
1 创建套接字,绑定,监听
2 等待接收客户端请求
3 创建新的进程处理客户端请求
4 原有进程继续等待接收新的客户端连接
5 如果客户端退出则关闭子进程
import socket,signal
import os,sys
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(('127.0.0.1',6666))
s.listen()
print('%s等待客户端连接'%os.getpid())
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
def client_(c):
print(c)
try:
while True:
date=c.recv(1024)
if not date:
break
print(date.decode())
c.send(date)
except (KeyboardInterrupt,SyntaxError):
sys.exit()
except Exception as e:
print(e)
c.close()
sys.exit(0) while True:
try:
c,addr = s.accept()
except KeyboardInterrupt:
sys.exit('服务器退出')
except Exception as e:
print(e)
continue #为客户端创建新的进程,处理请求
pid = os.fork()
if pid == 0:
s.close()
client_(c) #父进程或者创建失败都继续等待下一个客户端连接
else:
c.close()
continue
--用OS创建多进程
集成模块的使用
python2 SocketServer
python3 SocketServer
功能:
通过模块的不同类的组合完成多进程/多线程的TCP/UDP并发
StreamRequestHandler 处理TCP套接字请求类
DatagramRequestHandler 处理UDP套接字请求类
TCPServer 创建TCP Server
UDPServer 创建UDP Server
ForkingMixIn 创建多进程
ForkingTCPServer ---> ForkingMixIn + TCPServer
ForkingUDPServer ---> ForkingMixIn + UDPServer
ThreadingMixIn 创建多线程
ThreadingTCPServer ---> ThreadingMixIn + TCPServer
ThreadingUDPServer ---> ThreadingMixIn + UDPServer
# import socketserver
# class Server(socketserver.ForkingMixIn,socketserver.TCPServer):
# pass
#
# class Hand(socketserver.BaseRequestHandler):#继承BaseRequestHandler类,覆盖handle方法
# def handle(self):
# print(self.request.getpeername())
# while True:
# data = self.request.recv(1024)
# if not data:
# break
# print(data.decode())
# self.request.send(b'1111')
# if __name__ == '__main__':
# host = ('127.0.0.1',6666)
#
# server = Server(host,Hand)
# server.serve_forever()
---模块创建TCP--server
import socketserver
class Server(socketserver.ForkingMixIn,socketserver.UDPServer):
pass
#
class Hand(socketserver.DatagramRequestHandler):#继承BaseRequestHandler类,覆盖handle方法
def handle(self):
#print(self.request.getpeername())
print(self.server)
print(self.request)
print(self.client_address)
while True:
data= self.rfile.readline()
if not data:
break
print(data.decode())
self.wfile.write(b'')
if __name__ == '__main__':
host = ('127.0.0.1',6666)
server = Server(host,Hand)
server.serve_forever()
---模块创建UDP-server
简单服务器通信 模型socketserver的更多相关文章
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- 通信服务器群集——跨服务器通信Demo(源码)
对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...
- Android操作HTTP实现与服务器通信(转)
Android操作HTTP实现与服务器通信 本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方 ...
- Pomelo实现最简单的通信-egret。
昨天因为需要开始学习Pomelo 做H5游戏的服务端. 因为个人学习习惯,我从来不适合去跟着文档看.一般我直接是看下大概的API,但是Pomelo的API全部都是英文的. 昨天我就告诉自己用一下午时间 ...
- Android操作HTTP实现和服务器通信
众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HT ...
- 【netty】(2)---搭建一个简单服务器
netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...
- .NET Core微服务之路:利用DotNetty实现一个简单的通信过程
上一篇我们已经全面的介绍过<基于gRPC服务发现与服务治理的方案>,我们先复习一下RPC的调用过程(笔者会在这一节的几篇文章中反复的强调这个过程调用方案),看下图
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- Android操作HTTP实现与服务器通信
(转自http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html) 本示例以Servlet为例,演示Android与Servlet ...
随机推荐
- centos 7 gitlab安装服务器
详情见 https://blog.csdn.net/duyusean/article/details/80011540
- GPIO相关寄存器描述和怎么配置
总寄存器图
- Nginx负载均衡高可用---架构
1. Nginx负载均衡高可用 首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现w ...
- 如何通过Exchange2010 OWA更改过期密码
很多Exchange 2003管理员都通过IISADMPWD虚拟目录为员工提供用户密码修改功能,这大大方便了移动用户和非加入域用户在密码到期时的更改操作.您也许已经注意到:Windows Server ...
- 使用C++11原子量实现自旋锁
一.自旋锁 自旋锁是一种基础的同步原语,用于保障对共享数据的互斥访问.与互斥锁的相比,在获取锁失败的时候不会使得线程阻塞而是一直自旋尝试获取锁.当线程等待自旋锁的时候,CPU不能做其他事情,而是一直处 ...
- [CF707D]Persistent Bookcase_主席树_bitset
Persistent Bookcase 题目链接:http://codeforces.com/contest/707/problem/D 注释:略. 题解: 发现虽然$q\le 10^5$但是网格是$ ...
- [转帖]Docker 更新版本 以及 data-root
Docker 更新版本 https://www.cnblogs.com/operationhome/archive/2019/08/11/11322150.html 园友说 docker 使用了 da ...
- 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据
利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...
- Mac安装postgresql和卸载PostgreSQL
1.homebrew安装 brew install postgresql 2.初始化 initdb /usr/local/var/postgres 3.创建数据库及查看数据库 (1)先创建db. cr ...
- 对称加密、非对称加密、数字签名、数字证书、SSL是什么
非对称密钥加解密 对于一份数据,通过一种算法,基于传入的密钥(一串由数字或字符组成的字符串,也称key),将明文数据转换成了不可阅读的密文,这就是“加密”,同样的,密文到达目的地后,需要再以相应的算法 ...