利用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 检查数组元素是否存在类似PHP isset()方法
Oct 14 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
关于Django显示时间你应该知道的一些问题
Dec 25 Python
Python学生成绩管理系统简洁版
Apr 05 Python
python生成圆形图片的方法
Mar 25 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
python uuid生成唯一id或str的最简单案例
Jan 13 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 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使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python 算法 排序实现快速排序
2012/06/05 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
高级方案规划工程师岗位职责
2013/11/29 职场文书
大学生职业规划论文
2014/01/11 职场文书
作风建设演讲稿
2014/05/23 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
董事长致辞
2015/07/29 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript