day8 socketserver
一、概述
我们之前的用户都是不支持并发的,所以我们现在需要一个支持多用户,实现一个并发处理,我们接下来就不能不接触socketserver这个模块,前面讲的socket都是铺垫,后面需要真正使用的socketserver
二、socketserver
2.1 TCPServer、UDPServer、UnixStreamServer和UnixDatagramServerUnixDatagramServer
TCPserver说明:这个是用于TPC协议的,它在客户端和服务器之间提供连续的数据流。
英文解释:This uses the Internet TCP protocol, which provides for continuous streams of data between the client and server.
UDP协议:用于UDP协议的,并非连续的数据包,中间传输可能会丢失。传入的参数和TCPServer是一样的
英文解释:This uses datagrams, which are discrete packets of information that may arrive out of order or be lost while in transit. The parameters are the same as for TCPServer.
UnixStreamServer 和UnixDatagramServer
说明:这个很少用在TCP和UDP类中,但是用正在Unix领域里的sockets;传入的参数和TCPServer是一样的。
英文解释:These more infrequently used classes are similar to the TCP and UDP classes, but use Unix domain sockets; they’re not available on non-Unix platforms. The parameters are the same as for TCPServer.

三、创建socketserver 步骤
3.1中文解释
- 必须自己创建一个请求处理类,并且这个类要继承BaseRequestHandlerclass,并且还有重写父类里的handle()
- 你必须实例化TCPServer,并且传递server ip和你在第一步创建的请求处理类给这个TCPServer
- 接下来调server.handle_request()(只处理一个请求)或者server.serve_forever()(处理多个客户端请求,永远执行)
- 调用server_close()去关闭socket
3.2、简单的socketserver 例子
服务器端
1 import socketserver 2 3 class MyTCPServer(socketserver.BaseRequestHandler): 4 5 def handle(self): 6 while True: 7 try: 8 self.data =self.request.recv(1024) 9 print("{0} write:".format(self.client_address[0])) 10 print(self.data) 11 self.request.send(self.data.upper()) 12 except ConnectionRefusedError as e: 13 print("error:",e) 14 break 15 16 if __name__ == '__main__': 17 Host,port="localhost",9001 18 server=socketserver.TCPServer((Host,port),MyTCPServer) #使用 TCPserver 在同一时间依然只能有一个连接连进来,
# server=socketserver.ThreadingTCPServer((Host,port),MyTCPServer) 使用ThreadingTCPServer 就能实现多连接 19 server.serve_forever() 20 server.server_close()
客户端;
import socket client=socket.socket() client.connect(("localhost",9001)) while True: cmd= input("pls input cmd").strip() if len(cmd) == 0 :continue client.send(cmd.encode()) cmd_res=client.recv(1024) print(cmd_res.decode()) client.close()

浙公网安备 33010602011771号