利用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实现绘制树枝简单示例
Jul 24 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
如何在Python中编写并发程序
Feb 27 Python
Python中的日期时间处理详解
Nov 17 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 Python
利用python如何处理nc数据详解
May 23 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
python3让print输出不换行的方法
Aug 24 Python
python两种注释用法的示例
Oct 09 Python
Django如何重置migration的几种情景
Feb 24 Python
Python列表的索引与切片
Apr 07 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
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
快速排序 php与javascript的不同之处
2011/02/22 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
python映射列表实例分析
2015/01/26 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
django删除表重建的实现方法
2019/08/28 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
python实现小世界网络生成
2019/11/21 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
2015年妇女工作总结
2015/05/14 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
python编写函数注意事项总结
2021/03/29 Python
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
Python几种酷炫的进度条的方式
2022/04/11 Python
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS