用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数据库编程基础知识
Mar 16 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
django允许外部访问的实例讲解
May 14 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
详解Python3序列赋值、序列解包
May 14 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
python pyenv多版本管理工具的使用
Dec 23 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
Python代码中如何读取键盘录入的值
May 27 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
ES6 Generator基本使用方法示例
2020/06/06 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
python处理二进制数据的方法
2015/06/03 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
python和ruby,我选谁?
2017/09/13 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
工程总经理工作职责
2013/12/09 职场文书
房产继承公证书
2014/04/09 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏
利用Redis实现点赞功能的示例代码
2022/06/28 Redis