用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线程详解
Jun 24 Python
Python中字典的基础知识归纳小结
Aug 19 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
浅析使用Python操作文件
Jul 31 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
Python实现程序判断季节的代码示例
Jan 28 Python
Python3 max()函数基础用法
Feb 19 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
利用Python发送邮件或发带附件的邮件
Nov 12 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设计模式之命令模式的深入解析
2013/06/13 PHP
Yii实现简单分页的方法
2016/04/29 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
js 数组详细操作方法及解析合集
2018/06/01 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
Python 除法小技巧
2008/09/06 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
瑞士国际航空官网:SWISS
2016/07/21 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
专家推荐信模板
2014/05/09 职场文书
环卫工人节活动总结
2014/08/29 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
python 爬取天气网卫星图片
2021/06/07 Python
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis
Python基本的内置数据类型及使用方法
2022/04/13 Python