利用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映射列表实例分析
Jan 26 Python
Python正则简单实例分析
Mar 21 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
值得收藏的10道python 面试题
Apr 15 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python如何将函数值赋给变量
Apr 28 Python
如何在Python3中使用telnetlib模块连接网络设备
Sep 21 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
分享3个非常实用的 Python 模块
Mar 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
如何开始收听短波广播
2021/03/01 无线电
简单的页面缓冲技术
2006/10/09 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
利用php输出不同的心形图案
2016/04/22 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
Python编程之Re模块下的函数介绍
2017/10/28 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python实现俄罗斯方块游戏
2020/03/25 Python
python实现键盘控制鼠标移动
2020/11/27 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
Django视图扩展类知识点详解
2019/10/25 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
python的pip有什么用
2020/06/17 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
法警的竞聘演讲稿
2014/01/02 职场文书
求职意向书
2014/04/01 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
护士感人事迹
2014/05/01 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
人民调解协议书
2016/03/21 职场文书