Python学习笔记15(socketservre)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记15(socketservre)相关的知识,希望对你有一定的参考价值。
利用socket模块创建socket通信服务,但发现利用socket模块创建的服务无法进行多线程的处理,当需要进行大量请求处理时,请求就会阻塞在队列中,甚至发生请求丢弃。并且如果我们需要大量的socket时,就需要重复创建许多socket、绑定端口..... ,对于程序员来说意味着重复书写大量无意义代码。
那有没有一种方式既能简化书写流程又能实现多线程开发呢 ? 答案是肯定的,这就是SocketServer模块。
SocketServer简化了网络服务器的编写。在进行socket创建时,使用SocketServer会大大减少创建的步骤,并且SocketServer使用了select它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步。
该模块在python3中已经更名为socketserver。
使用ThreadingTCPServer:
- 创建一个继承自 SocketServer.BaseRequestHandler 的类
- 类中必须定义一个名称为 handle 的方法
- 启动ThreadingTCPServer
服务端:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while True: self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) if not self.data: print("断开了") break self.request.sendall(self.data.upper()) if __name__ == "__main__": HOST, PORT = "localhost", 9999 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) server.serve_forever()
客户端和socket的一样:
import socket ip_port = (‘127.0.0.1‘,9999) client = socket.socket() client.connect(ip_port) while True: data = input("客户端输入:").strip() if len(data) == 0: continue client.sendall(data.encode("utf-8")) server_reply = client.recv(1024) print("客户端收到:",server_reply.decode())
以上是关于Python学习笔记15(socketservre)的主要内容,如果未能解决你的问题,请参考以下文章