利用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使用新浪微博API发送微博的例子
Apr 10 Python
浅析Python中的序列化存储的方法
Apr 28 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
python 执行终端/控制台命令的例子
Jul 12 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
Python超越函数积分运算以及绘图实现代码
Nov 20 Python
Python+redis通过限流保护高并发系统
Apr 15 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
python中复数的共轭复数知识点总结
Dec 06 Python
python 指定源路径来解决import问题的操作
Mar 04 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 表单数据的获取代码
2009/03/10 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
jQuery操作cookie
2016/08/08 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
python获取文件扩展名的方法
2015/07/06 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
django settings.py 配置文件及介绍
2019/07/15 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
介绍一下gcc特性
2012/01/20 面试题
教书育人演讲稿
2014/09/11 职场文书
整改通知书格式
2015/04/22 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
python 详解turtle画爱心代码
2022/02/15 Python
Python安装使用Scrapy框架
2022/04/12 Python
python高温预警数据获取实例
2022/07/23 Python