利用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访问类中docstring注释的实现方法
May 04 Python
python中set常用操作汇总
Jun 30 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
DataFrame中的object转换成float的方法
Apr 10 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
Python学习小技巧总结
Jun 10 Python
Python设计模式之备忘录模式原理与用法详解
Jan 15 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
Python 求数组局部最大值的实例
Nov 26 Python
python实现字符串和数字拼接
Mar 02 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
python3访问字典里的值实例方法
Nov 18 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语言构造器介绍
2013/07/08 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Element Dialog对话框的使用示例
2020/07/26 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
python drf各类组件的用法和作用
2021/01/12 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
平面设计岗位职责
2013/12/14 职场文书
外联部演讲稿
2014/05/24 职场文书
汽修专业自荐信
2014/07/07 职场文书
超级礼物观后感
2015/06/15 职场文书
体育委员竞选稿
2015/11/21 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
Html5调用企业微信的实现
2021/04/16 HTML / CSS
redis中lua脚本使用教程
2021/11/01 Redis