一、SocketServer
简化了编写网络服务器的难度。
SocketServer一共有如下几个类型:
socketserver.TCPServer :提供一个TCP的socketserver。socketserver.UDServer :提供了一个UDP的socketserver,参数同TCPServer。socketserver.UnixStreamServer : 系统内部通讯用的基于TCP的socketserver。socketserver.UnixDatagramServer : 系统内部通讯用的基于UDP的socketserver。socketserver的继承结构:
使用Socketserver实现服务器:
socketserver端:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): #该类必须继承socketserver里的BaseRequestHandler类 def handle(self): while True: try: self.data = self.request.recv(1024).strip() except ConnectionResetError as err: print(err) break else: print("{} wrote".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) # 将接收到的数据全部大写再发送回client if __name__ == "__main__": HOST,PORT = "0.0.0.0",9999 server = socketserver.TCPServer((HOST,PORT),MyTCPHandler) #把MyTCPHandler类传进去,每次有client连接,都会创建一个MyTCPHandler的实例来处理 server.serve_forever() #永久运行使用client来测试连接:
client = socket.socket() client.connect(("localhost",9999)) while True: msg = input(">>:").strip() if len(msg) == 0:continue client.send(msg.encode("utf-8")) data = client.recv(1024) print("recv : ",data.decode()) client.close()当前还无法实现多客户端并行。
如果要实现多客户端并行,则需要多线程支持:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): #该类必须继承socketserver里的BaseRequestHandler类 def handle(self): while True: try: self.data = self.request.recv(1024).strip() except ConnectionResetError as err: print(err) break else: print("{} wrote".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) # 将接收到的数据全部大写再发送回client if __name__ == "__main__": HOST,PORT = "0.0.0.0",9999 server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) #把MyTCPHandler类传进去,每次有client连接,都会创建一个MyTCPHandler的实例来处理 server.serve_forever() #永久运行上述代码中,我们将TCPServer()替换成ThreadingTCPServer(),则可以支持多线程并发形式的服务器。在这种方式下,每一个client连接时,服务端都会开启一个新的线程来做处理。
ThreadingTCPServer继承了TCPServer类和ThreadingMinIn类,TCPServer类中实现了对单个请求的各种操作,ThreadingMinIn类中实现了对多线程的支持。具体可查看实现源码。
和多线程类似的还有多进程模式:
server = socketserver.ForkingTCPServer((HOST,PORT),MyTCPHandler)但是在Windows上会出错,在Linux上运行正常。
Socketserver.BaseRequestHandler源码方法解读:(可自行研究) fileno():文件描述符,一般用不到handle_request():处理单个请求,一般也用不到server_forever(poll_interval=0.5):永久运行server,直到一个明确的shutdown命令。poll_interval为每0.5秒检查一下有无shutdown命令。service_actions():接收到shutdown后清理zombie。shutdown():停止server_forever循环。等等
转载于:https://www.cnblogs.com/leokale-zz/p/8515192.html
相关资源:JAVA上百实例源码以及开源项目