socketserver实现并发
2018-11-27 08:31:25来源:博客园 阅读 ()
一、socketserver
基于tcp,使用socketserver,可以实现一个服务端与多个客户端通信。
- 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环
- socketserver模块中分为两大类:server类(解决链接问题)和request类(解决通信问题)
- 链接循环:循环建立连接,每个客户都可以连接成功
- 通迅循环:每个客户端链接成功后,循环的和客户端进行通信
完整的socketserver代码示例:
服务端:
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): while 1: from_client_msg = self.request.recv(1024) print(from_client_msg.decode("utf-8")) server_msg = input("服务端>>>") self.request.send(server_msg.encode("utf-8")) if __name__ == '__main__': ip_port = ("127.0.0.1", 8001) server = socketserver.ThreadingTCPServer(ip_port, Myserver) server.serve_forever()
客户端:
import socket client = socket.socket() client.connect(("127.0.0.1", 8001)) while 1: client_data = input("客户端>>>") client.send(client_data.encode("utf-8")) from_server_msg = client.recv(1024) print(from_server_msg.decode("utf-8"))
此时即可在一个服务端下,运行多次客户端程序,实现同时与服务端通信。
二、socketserver源码分析
1. server = socket.ThreadingTCPServer(ip_port, Myserver)
创建ThreadingTCPServer对象server
- 根据MRO,查找顺序为:ThreadingTCPServer -> ThreadingMixIn -> TCPServer -> BaseServer
- 执行TCPServer __init__方法,进而执行server.bind(),server.listen(5)
2. server.serve_forever()
BaseServer中找到serve_forever()
进而执行self._handle_request_noblock()
- request, client_address = self.get_request(), 在TCPServer中找到get_request(),返回self.socket.accept(),即执行利等待连接代码,request为管道,client_address为客户端地址。
- 执行self.process_request(request, client_address)
- 在ThreadingMixIn中找到process_request,开启多线程应对并发,进而执行process_request_thread,执行self.finish_request(request, client_address)
- 在BaseServer中找到self.finish_request(request, client_address), 执行RequestHandlerClass(request, client_address, self)
至此,链接循环已完成,接下来完成通信循环:
- RequestHandlerClass(request, client_address, self)即Myserver(request, client_address, self),创建对象
- 在BaseRequestHandler找到 __init__(),完成初始化,执行self.handle(),BaseRequestHandler中handle()方法内容为pass,即通信内容根据需求我们自己实现。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:python常量和变量
下一篇:python用户交互
- python day2-爬虫实现github登录 2019-08-13
- python 之 并发编程(线程理论,开启线程的两种方式,进程 2019-07-24
- 基于tornado---异步并发接口 2019-07-24
- python 之 并发编程(生产者消费者模型、守护进程的应用) 2019-07-24
- python+selenium实现自动化百度搜索关键词 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash