用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中的With语句
Feb 02 Python
Python yield 使用方法浅析
May 20 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
python版飞机大战代码分享
Nov 20 Python
对python中的argv和argc使用详解
Dec 15 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
python多进程使用函数封装实例
May 02 Python
Python爬取12306车次信息代码详解
Aug 12 Python
python两个list[]相加的实现方法
Sep 23 Python
M1芯片安装python3.9.1的实现
Feb 02 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 Memcache 中实现消息队列
2009/11/24 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
python利用datetime模块计算时间差
2015/08/04 Python
浅谈python中set使用
2016/06/30 Python
Python处理Excel文件实例代码
2017/06/20 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
戴森美国官网:Dyson美国
2016/09/11 全球购物
考试作弊被抓检讨书
2014/01/10 职场文书
美术学专业求职信
2014/07/23 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL