使用Python SocketServer快速实现多线程网络服务器
Python SocketServer使用介绍
1、简介:
SocketServer是python的一个网络服务器框架,可以减少开发人员编写网络服务器程序的工作量。
SocketServer总共有4个server基类。
TCPServer:负责处理TCP协议。
UDPServer:负责处理UDP协议。
UnixStreamServer:只适用于类unix平台,不常用。
UnixDatagramServer:只适用于类unix平台,不常用。
这4个类会同步处理每一个request,也就是说只有当前的request处理完才会处理下一个request,这种方式显然很不合理,如果当前的request处理过慢的话就会导致“堵塞”。正确的处理方式应该是开辟新的进程或线程去处理不同的request,通过混合继承ForkingMixIn或ThreadingMixIn类即可解决此问题。
2、创建SocketServer
使用SocketServer创建一个网络服务程序只需要几个简单的步骤:
(1)、创建处理request的类,创建方法为:继承BaseRequestHandler类,并重载handle()方法。该方法将被回调用做处理当前接收到的request。
注意:一般的做法是直接继承StreamRequestHandler或者DatagramRequestHandler。比如:
class MyTCPHandler(SocketServer.StreamRequestHandler):
(2)、实例化一个server基类(比如TCPServer)的对象,并发服务器地址和处理request的类作为参数传入。
(3)、使用server基类对象调用handle_request()或serve_forever()方法,即可处理一个或多个request。
(4)、如果需要创建多进程或多线程的服务器程序,则可以通过混合继承ForkingMixIn或ThreadingMixIn类来实现,比如:
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass //创建一个多线程的TCP服务器。
注意:ThreadingMixIn必须要放在TCPServer前面。
3、server类方法说明:
(1)、class SocketServer.BaseServer
这是所有类的超类,只定义接口,大部分均在子类中实现。
(2)、BaseServer.handle_request()
该方法用于处理单一的request。按顺序调用get_request(), verify_request()和 process_request().
(3)、BaseServer.serve_forever(poll_interval=0.5)
循环轮询处理request
(4)、BaseServer.address_family
协议簇信息,比如socket.AF_INET and socket.AF_UNIX
(5)、BaseServer.RequestHandlerClass
开发者自定义的用于处理request的类,每个request都会对应实例化一个request handle 类进行处理。
(6)、BaseServer.server_address
服务器要监听的地址和端口的二元组,比如(0.0.0.0,8080)
(7)、BaseServer.finish_request()
实例化开发者自定义request handle类,然后调用handle()方法处理当前的request。
(8)、
4、request handler类方法说明:
由用户自定义并传入SocketServer,由server类实例化来处理当前的request。需要注意的是:Request handler类必须要复写handle()方法,其它方法也可以复写,但不做强制。
(1)、RequestHandler.handle()
开发者必须在此方法里面实现对当前request的所有处理,在该方法里面有几个实例化的属性可以直接使用:self.request代表当前的request对象,self.client_address代表客户端地址,self.server代表服务器对象。对于TCP链接,self.request是当前request的socket。self.rfile和self.wfile可分别用于读取客户端数据和向客户端返回数据。
5、样例代码:
5.1、创建TCP类型的SocketServer:
import SocketServer class MyTCPHandler(SocketServer.BaseRequestHandler): #定义request handler类,从BaseRequestHandler类继承def handle(self): #复写handle()方法,注意:该方法必须复写,用于处理当前的requestself.data = self.request.recv(1024).strip() #self.request是和客户端连接的套接字,可直接使用print "{} wrote:".format(self.client_address[0])print self.dataself.request.sendall(self.data.upper())class MyTCPHandler(SocketServer.StreamRequestHandler): #定义request handler类,从StreamRequestHandler类继承def handle(self):self.data = self.rfile.readline().strip() #self.rfile/self.wfile是文件格式类型的socket,相当于对原始socket的封装,让读写网络数据向读写文件一样容易print "{} wrote:".format(self.client_address[0])print self.dataself.wfile.write(self.data.upper()) if __name__ == "__main__":HOST, PORT = "localhost", 9999server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) #传入监听地址、端口号和request handler类server.serve_forever() #启动监听处理request
5.2、创建UDP类型的SocketServer:
import SocketServerclass MyUDPHandler(SocketServer.BaseRequestHandler):def handle(self):data = self.request[0].strip()socket = self.request[1]print "{} wrote:".format(self.client_address[0])print datasocket.sendto(data.upper(), self.client_address) if __name__ == "__main__":HOST, PORT = "localhost", 9999server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler) server.serve_forever()
5.3、创建多线程类型的TCP SocketServer:
import socket import threading import SocketServer class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):def handle(self):data = self.request.recv(1024)cur_thread = threading.current_thread()response = "{}: {}".format(cur_thread.name, data)self.request.sendall(response)class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):#继承ThreadingMixIn表示使用多线程处理request,注意这两个类的继承顺序不能变passdef client(ip, port, message):sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((ip, port))try:sock.sendall(message)response = sock.recv(1024)print "Received: {}".format(response)finally:sock.close()if __name__ == "__main__":HOST, PORT = "localhost", 0server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)ip, port = server.server_addressserver_thread = threading.Thread(target=server.serve_forever)server_thread.daemon = Trueserver_thread.start()print "Server loop running in thread:", server_thread.nameclient(ip, port, "Hello World 1")client(ip, port, "Hello World 2")client(ip, port, "Hello World 3")server.shutdown()
转载于:https://www.cnblogs.com/anningwang/p/9052633.html
使用Python SocketServer快速实现多线程网络服务器相关推荐
- python 网络服务器框架_Django是Python下的一款网络服务器框架
Django是Python下的一款网络服务器框架.Python下有许多款不同的框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django.虽然Django之于Pytho ...
- python应用系列教程——python使用SocketServer实现网络服务器,socket实现客户端
全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用SocketServer实现网络服务器 SocketServer简化了网络服务器的编写.在进行socket创建时,使用Sock ...
- 无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages)
无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages) # 在windows上打开anaconda,进入环境tab页,在base环境处单击,然后点开te ...
- 利用python编写设计多线程web服务器(计算机网络_自顶向下第六版_第二章1和4的编程作业)
今天翻看自己以前的博客时,发现了这则博客,距今大约也有一年多的时间了,觉得还是蛮有趣的一个作业,于是跟着博客又做了一遍,觉得之前的排版有点不大好,所以此番用markdown 稍微重做些修改更新一下博客 ...
- 27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器
基本概念叫协议 什么叫协议? 协议是一个大家共同遵守的一个规则, 那么在这个网络通信当中,其实就是双方通信和解释数据的一个规则,这个概念 你也不用记,你只要心里明白就可以了, 分层模型, 物数网传会表 ...
- python tcp服务器 多线程_Python中的多线程TCP服务器
我使用python的threding模块创建了一个简单的多线程tcp服务器.每次连接新客户端时,该服务器都会创建一个新线程. #!/usr/bin/env python import socket, ...
- python网络平台_python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...
- 用 python 快速搭建网游服务器
赖勇浩(http://laiyonghao.com) 今天(2009年5月31日) OurPNP.org 搞了个聚会活动,弄了十几二十个人在广州海珠广场的堂会呆了五个小时,创下了我在 K 房呆的最长时 ...
- 【Linux服务器开发系列】详解多线程网络编程丨百分百干货分享丨学到就是赚到
90分钟搞懂多线程网络编程模型 1. 网络编程关注的问题 2. 网络编程的几种模型reactor,one loop per thread及其变种 3. skynet,redis,nginx,memca ...
最新文章
- HTML5背后的故事
- 机器学习中 True Positives(真正例TP)、False Positives(假正例FP)、True Negatives(真负例TN)和 False Negatives(假负例FN)指什么
- SpringSecurity OAuth2在项目中使用完成的功能说明
- 大话数据结构02 :线性表链式存储 C++
- 敏捷武士:看敏捷高手交付卓越软件pdf
- 去掉“搜一搜”后,让“查看新贴”等按钮居中
- 面向对象2(待补充)
- 05_DecisionTree_统计学习方法
- Know more about Oracle Latches
- python django开发新闻聚合检索推荐_Django之聚合查询、分组查询、查询优化以及F、Q查询...
- 易我电脑迁移 2022
- xt5 连接android auto,2021年凯迪拉克XT6将添加无线Apple CarPlay和Android Auto
- 【排队模型】基于粒子群优化核酸检测排队问题附matlab代码
- C#RSACryptoServiceProvider加密
- 组合数递推的计算方法 c语言,组合数公式的递推公式
- c语言中求圆台体积公式,圆台体积公式_圆台体积计算公式(附计算器)
- 教学小结:我这样帮助学生提出疑问
- 支付宝-电脑网站支付并跳转页面
- SpringBoot整合Mybatis-Plus入门案例
- 【差分约束系统】【强连通分量缩点】【拓扑排序】【DAG最短路】CDOJ1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。...