用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-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
Python及PyCharm下载与安装教程
Nov 18 Python
简单了解Django模板的使用
Dec 20 Python
python操作redis方法总结
Jun 06 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
python简单的三元一次方程求解实例
Apr 02 Python
Python 绘制可视化折线图
Jul 22 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动态图像的创建
2006/10/09 PHP
PHP HTML代码串截取代码
2008/12/29 PHP
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
javascript 三种编解码方式
2010/02/01 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
详解微信小程序input标签正则初体验
2018/08/18 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
详解Python函数作用域的LEGB顺序
2016/05/14 Python
python 动态加载的实现方法
2017/12/22 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
django允许外部访问的实例讲解
2018/05/14 Python
Python构建图像分类识别器的方法
2019/01/12 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
python创建n行m列数组示例
2019/12/02 Python
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
十八届三中全会报告学习材料
2014/02/17 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
海弦WR-800F
2022/04/05 无线电
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript