用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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
Django开发中复选框用法示例
Mar 20 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
Python 复平面绘图实例
Nov 21 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
Django REST Swagger实现指定api参数
Jul 07 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中使用反射技术的架构插件使用说明
2010/05/18 PHP
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
浅谈django orm 优化
2018/08/18 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
为什么称python为胶水语言
2020/06/16 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
大专计算机个人求职的自我评价
2013/10/21 职场文书
大学生入党自我鉴定
2013/10/31 职场文书
士兵突击观后感
2015/06/16 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis