利用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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
Django  ORM 练习题及答案
Jul 19 Python
如何用Python来搭建一个简单的推荐系统
Aug 07 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
Python工程师必考的6个经典面试题
Jun 28 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP中常用的转义函数
2014/02/28 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
Javascript 读书笔记索引贴
2010/01/11 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
python使用cPickle模块序列化实例
2014/09/25 Python
python字符串中的单双引
2017/02/16 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
物流专业大学生的自我鉴定
2013/11/13 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
相亲大会策划方案
2014/06/05 职场文书
军训口号
2014/06/13 职场文书
个人思想政治总结
2015/03/05 职场文书
2015年新农合工作总结
2015/03/30 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
python模板入门教程之flask Jinja
2022/04/11 Python