利用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 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
Python找出list中最常出现元素的方法
Jun 14 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
用Pygal绘制直方图代码示例
Dec 07 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python实现远程控制电脑
May 23 Python
Python中asyncio模块的深入讲解
Jun 10 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
python import 上级目录的导入
Nov 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时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
PHP 8新特性简介
2020/08/18 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
Angularjs的键盘事件的绑定
2017/07/27 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
python抓取京东商城手机列表url实例代码
2013/12/18 Python
初步理解Python进程的信号通讯
2015/04/09 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
魅力教师事迹材料
2014/01/10 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers