用Python实现一个简单的多线程TCP服务器的教程


Posted in Python onMay 05, 2015

 最近看《python核心编程》,书中实现了一个简单的1对1的TCPserver,但是在实际使用中1对1的形势明显是不行的,所以研究了一下如何在server端通过启动不同的线程(进程)来实现每个链接一个线程。

其实python在类的设计上已经考虑到了这一方面的需求,我们只要在自己的server上继承一下SocketServer.BaseRequestHandler就可以了。
server端代码如下:

#!/usr/bin/env python 
import SocketServer 
from time import ctime 
HOST = '' 
PORT = 21567 
ADDR = (HOST, PORT) 
class MyRequestHandler(SocketServer.BaseRequestHandler): 
  def handle(self): 
    print '...connected from:', self.client_address 
    while True: 
      self.request.sendall('[%s] %s' % (ctime(),self.request.recv(1024))) 
tcpServ = SocketServer.ThreadingTCPServer(ADDR, MyRequestHandler) 
print 'waiting for connection...' 
tcpServ.serve_forever()

客户端代码如下(基本和书中一模一样,只是把循环中的关闭链接注释掉了):

#!/usr/bin/env python 
from socket import * 
HOST = 'localhost' 
PORT = 21567 
BUFSIZ = 1024 
ADDR = (HOST, PORT) 
while True: 
  tcpCliSock = socket(AF_INET, SOCK_STREAM) 
  tcpCliSock.connect(ADDR) 
  data = raw_input('> ') 
  if not data: 
    break 
  tcpCliSock.send('%s\r\n' % data) 
  data = tcpCliSock.recv(BUFSIZ) 
  if not data: 
    break 
  print data.strip() 
#tcpCliSock.close()

从客户端的代码可以看出,每次输入都会建立一次新的请求。
测试一下,启动server和client之后,在client中输入测试: 

用Python实现一个简单的多线程TCP服务器的教程

用Python实现一个简单的多线程TCP服务器的教程

Python 相关文章推荐
Python实现子类调用父类的方法
Nov 10 Python
Python实现登录人人网并抓取新鲜事的方法
May 11 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
python的unittest测试类代码实例
Dec 07 Python
python3爬取淘宝信息代码分析
Feb 10 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
一文了解Python并发编程的工程实现方法
May 31 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
python标准库OS模块详解
Mar 10 Python
django orm模块中的 is_delete用法
May 20 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
简单介绍Python中的try和finally和with方法
May 05 #Python
python中的闭包用法实例详解
May 05 #Python
Python闭包实现计数器的方法
May 05 #Python
深入探究Python中变量的拷贝和作用域问题
May 05 #Python
Python使用metaclass实现Singleton模式的方法
May 05 #Python
python中查看变量内存地址的方法
May 05 #Python
Python中统计函数运行耗时的方法
May 05 #Python
You might like
php gzip压缩输出的实现方法
2013/04/27 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
php探针不显示内存解决方法
2019/09/17 PHP
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
轮播图组件js代码
2016/08/08 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
python笔记(2)
2012/10/24 Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
python使用marshal模块序列化实例
2014/09/25 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
学生实习介绍信
2014/01/15 职场文书
《争吵》教学反思
2014/02/15 职场文书
给校长的建议书600字
2014/05/15 职场文书
承诺书范文
2014/06/03 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
教师个人学习总结
2015/02/11 职场文书