虽然Python内置的socket和threading模块能实现简单的多线程服务器,在非正式环境,随便用用仍是能够的,可是若是要在生产环境中使用,那是万万不够的。服务器
Python考虑得很周到,为了知足咱们对多线程网络服务器的需求,提供了"socketserver"模块。socketserver在内部使用IO多路复用以及多线程/进程机制,实现了并发处理多个客户端请求的socket服务端。每一个客户端请求链接到服务器时,socketserver服务端都会建立一个“线程”或者“进程” 专门负责处理当前客户端的全部请求。网络
import socketserver # 1.必须继承socketserver.BaseRequestHandler类,后台自动创建双工通讯,等待客户端链接 class MySockServer(socketserver.BaseRequestHandler): def handle(self):
# 2.进行收发数据 # request对象进行接收和发送数据 request = self.request request.send('欢迎访问socketserver服务器'.encode()) # 发送数据send() while True: data = request.recv(1024).decode() # 接收数据recv() if data == 'exit': print('断开与%s的链接!' % (self.client_address,)) break elif data: print('来自%s客户端向你发来数据:%s' % (self.client_address, data)) request.send('服务器已收到数据'.encode()) # 发送数据 if __name__ == '__main__': # 3.建立一个多线程TCP服务器对象,绑定IP和端口 tcp_server = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), MySockServer) print('启动服务器!') # 4.启动服务器,服务器将一直保持运行状态 tcp_server.serve_forever()
分析一下服务器端的代码,核心要点有这些:多线程
import socket # 客户端依然使用socket模块就能够了,不须要导入socketserver模块 IP_PORT = ('127.0.0.1', 8888) # 1.建立socket对象
sock = socket.socket()
# 2.与服务端链接,创建双工通讯 sock.connect(IP_PORT) sock.settimeout(0.5)
# 3.进行收发数据 data = sock.recv(1024).decode() # 接收数据recv() print('接收返回数据:%s' % data) while True: inp = input('输入要发送的数据:').strip() if not inp: continue sock.send(inp.encode()) # 发送数据send() if inp == 'exit': print('谢谢使用,再见!') break data = sock.recv(1024).decode() print('接收返回数据:%s' % data)
# 4.断开链接 sock.close()
客户端的代码很好理解,依然使用socket模块就能够了,不须要导入socketserver模块。并发
至此,转载请注明出处。socket