利用Python中SocketServer 实现客户端与服务器间非阻塞通信


Posted in Python onDecember 15, 2016

利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。

首先,先了解下SocketServer模块中可供使用的类:

BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer。

TCPServer/UDPServer:基本的网络同步TCP/UDP服务器。

UnixStreamServer/ UnixDatagramServer:基本的基于文件同步TCP/UDP服务器。

ForkingMixIn/ ThreadingMixIn:实现了核心的进程化或线程化的功能;作为混合类,与服务器类一并使用以提供一些异步特性;这个类不会直接实例化。

ForkingTCPServer/ ForkingUDPServer:ForkingMixIn和TCPServer/UDPServer的组合。

BaseRequestHandler:包含处理服务请求的核心功能。这个类只用于派生,所以不会生成这个类的实例可以考虑使用StreamRequestHandler或DatagramRequestHandler。

StreamRequestHandler/ DatagramRequestHandler:用于TCP/UDP服务器的服务处理工具。

下面我们正式进入主题,这里我们采用StreamRequestHandler和ThreadingTCPServer来实现客户端与服务器并发连接非阻塞socket。

ThreadingTCPServer派生自ThreadingMixIn,主要实现核心的进程化合线程化功能。

StreamRequestHandler主要用于用于TCP/UDP服务器的服务处理工具。

一、创建SocketServerTCP服务端

[python] view plain copy
#创建SocketServerTCP服务器: 
import SocketServer 
from SocketServer import StreamRequestHandler as SRH 
from time import ctime 
host = 'xxx.xxx.xxx.xxx' 
port = 9999 
addr = (host,port) 
class Servers(SRH): 
 def handle(self): 
  print 'got connection from ',self.client_address 
  self.wfile.write('connection %s:%s at %s succeed!' % (host,port,ctime())) 
  while True: 
   data = self.request.recv(1024) 
   if not data: 
    break 
   print data 
   print "RECV from ", self.client_address[0] 
   self.request.send(data) 
print 'server is running....' 
server = SocketServer.ThreadingTCPServer(addr,Servers) 
server.serve_forever()

二、创建SocketServerTCP客户端

[python] view plain copy
from socket import * 
host = 'xxx.xxx.xxx.xxx' 
port = 9999 
bufsize = 1024 
addr = (host,port) 
client = socket(AF_INET,SOCK_STREAM) 
client.connect(addr) 
while True: 
 data = raw_input() 
 if not data or data=='exit': 
  break 
 client.send('%s\r\n' % data) 
 data = client.recv(bufsize) 
 if not data: 
  break 
 print data.strip() 
client.close()
Python 相关文章推荐
初学Python实用技巧两则
Aug 29 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
Python 支付整合开发包的实现
Jan 23 Python
Python3 log10()函数简单用法
Feb 19 Python
在Python中COM口的调用方法
Jul 03 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 Python
Python切图九宫格的实现方法
Oct 10 Python
python中sys模块是做什么用的
Aug 16 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 Python
python Django框架快速入门教程(后台管理)
Jul 21 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 #Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 #Python
python中快速进行多个字符替换的方法小结
Dec 15 #Python
Python制作简易注册登录系统
Dec 15 #Python
用yum安装MySQLdb模块的步骤方法
Dec 15 #Python
Python3.6正式版新特性预览
Dec 15 #Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 #Python
You might like
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
Python判断直线和矩形是否相交的方法
2015/07/14 Python
使用python实现rsa算法代码
2016/02/17 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
对Python实现累加函数的方法详解
2019/01/23 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
Python tkinter三种布局实例详解
2020/01/06 Python
python用什么编辑器进行项目开发
2020/06/17 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
生物化学研究助理员求职信
2013/10/09 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
《社戏》教学反思
2016/02/22 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle