利用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 相关文章推荐
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
python 删除非空文件夹的实例
Apr 26 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
Python3中详解fabfile的编写
Jun 24 Python
python仿evething的文件搜索器实例代码
May 13 Python
DataFrame.to_excel多次写入不同Sheet的实例
Dec 02 Python
Django中使用MySQL5.5的教程
Dec 18 Python
Python中断多重循环的几种方式详解
Feb 10 Python
python实现批量命名照片
Jun 18 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 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
第七节 类的静态成员 [7]
2006/10/09 PHP
PHP $_FILES函数详解
2011/03/09 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
JavaScript中AOP的实现与应用
2019/05/06 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
详解Python爬虫的基本写法
2016/01/08 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
numpy中的高维数组转置实例
2018/04/17 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
Linux如何为某个操作添加别名
2015/02/05 面试题
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL
各种货币符号快捷输入
2022/02/17 杂记