简单服务器通信 模型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 ...
随机推荐
- 2018.04.03 ABAP OLE操作整理
OLE整理: 1.定义,分别对应EXCEL,workbook(工作簿),sheet(页),单元格 DATA: EXCEL_OBJ TYPE OLE2_OBJECT, BOOK_OBJ TYPE OLE ...
- http://www.cda.cn/view/25735.html
通过实例浅析Python对比C语言的编程思想差异 我一直使用 Python,用它处理各种数据科学项目. Python 以易用闻名.有编码经验者学习数天就能上手(或有效使用它). 听起来很不错,不过,如 ...
- Python字符串逐字符或逐词反转方法
Python字符串逐字符或逐词反转方法 这篇文章主要介绍了Python字符串逐字符或逐词反转方法,本文对逐字符或逐词分别给出两种方法,需要的朋友可以参考下 目的 把字符串逐字符或逐词反转过来,这个蛮有 ...
- 跨域form下载方式 批量下载
downloadFileForm:function(fid) { var url = "https://file.xxxx.com/fileDownload.do"; var in ...
- 配置Xmanager远程登录
1.修改/etc/gdm/custom.conf文件找到下面的语句:[security]AllowRemoteRoot=true[xdmcp]Enable=true修改custom.conf后,必须重 ...
- django 之(四) --- 级联|截流
登陆注册 登陆注册实现 settings.py # redis配置 CACHES = { "default": { "BACKEND": "djang ...
- SSRF小梳理
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正 ...
- VC 学习笔记 (持续更新)
基于windows的程序和基于MS-DOS的程序之间的一个最根本的差别,就在于MS-DOS程序是通过操作系统的功能来获得用户的输入的,而windows程序则是通过操作系统 发送的消息来处理用户输入的. ...
- [AT2062] ~K Perm Counting
AT2602 , Luogu 求对于 \(n\) 个数的排列 , 有多少种方案满足对于所有的 \(i\) , \(|P_i - i| != K\) , 答案对 \(924844033\) 取模 . \ ...
- vscode 安装一些快捷配置
Visual Studio Code 最好的功能.插件和设置 小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技 ...