Python TCPServer 多线程多客户端通信的实现
最简单、原始的TCP通信demo
服务端Http请求:
importsocket #创建一个servicesocke serviceSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #给服务器绑定地址(ip地址,端口号) serviceSocket.bind(("192.168.171.1",80)) print("等待客户端接入") #sock是客户端的socket信息 #addr是客户端的地址(ip,端口) sock,addr=serviceSocket.accept() print(f"sockfromclient:{sock}") print(f"addrofclient:{addr}") whileTrue: #接收客户端的请求 recvData=sock.recv(1024) print("客户端说:%s"%(recvData.decode("utf-8"))) sendData=input("服务器说:") #发送(回复)数据给客户端 sock.send(sendData.encode("utf-8"))
客户端Http请求:
importsocket #创建客户端socket clientSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #连接服务器 clientSocket.connect(("192.168.171.1",80)) whileTrue: #发送消息给服务器 sendData=input("客户端说:") ifsendData=="bye": clientSocket.send(sendData.encode("utf-8"))#编码:将数据装换成二进制形式 break clientSocket.send(sendData.encode("utf-8")) recvData=clientSocket.recv(1024) print("服务器说:%s"%(recvData.decode("utf-8")))#解码:将二进制转换成字符
1、在TCP中,客户端的实现流程:
创建客户端的socket对象建立与服务器之间的联系发送请求接收数据关闭连接
2、服务端的实现流程:
创建服务端的socket对象绑定服务端的地址设置监听器等待客户端的连接接收客户端的请求返回处理的结果到客户端
ThreadingTCPServer多线程多客户端通信自动重连demo
socketserver继承图:
TCPServer
#fromsocketserverimportTCPServer,BaseRequestHandler,ThreadingTCPServer fromsocketserverimportTCPServer,StreamRequestHandler,ThreadingMixIn importtraceback #classMyBaseRequestHandler(BaseRequestHandler): classMyBaseRequestHandler(StreamRequestHandler): defhandle(self): self.addr=self.request.getpeername() self.server.users[self.addr[1]]=self.request message="IP"+self.addr[0]+":"+str(self.addr[1])+"Connected..." print(message) whileTrue: try: data=self.request.recv(1024).decode('UTF-8','ignore').strip() print(f'receivefrom{self.client_address}:{data}') back_data=(f"response\""+data+"\":\n").encode("utf8") self.request.sendall(back_data) except: traceback.print_exc() break #源码:classThreadingTCPServer(ThreadingMixIn,TCPServer):pass #从ThreadingMixIn和TCPServer继承,实现多线程 classMyThreadingTCPServer(ThreadingMixIn,TCPServer): def__init__(self,server_address,RequestHandlerClass): TCPServer.__init__(self,server_address,RequestHandlerClass) self.users={} classMyTCPserver(): def__init__(self,server_addr='192.168.1.109',server_port=23): self.server_address=server_addr self.server_port=server_port self.server_tuple=(self.server_address,self.server_port) defrun(self): #server=TCPServer(self.server_tuple,MyBaseRequestHandler) server=MyThreadingTCPServer(self.server_tuple,MyBaseRequestHandler) server.serve_forever() if__name__=='__main__': myserver=MyTCPserver() myserver.run()
在telnet下开启开启两个客户端,本电脑的IP为192.168.1.109,开两个客户端后,TCPServer的终端出现同一个IP但是不同端口的连接:
TCPClient
importsocket importtime classMyClient: host='192.168.1.109' port=23 bufsiz=1024 addr=None skt=None def__init__(self,host=None,port=None): ifhost!=None: self.host=host ifport!=None: self.port=port ifself.addr==None: self.addr=(self.host,self.port) self.doConnection() defdoConnection(self): try: self.skt=socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.skt.setsockopt(socket.SOL_SOCKET,socket.SO_KEEPALIVE,1) print(self.addr) self.skt.connect(self.addr) except: pass defrun(self): whileTrue: try: _time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime()) self.skt.sendall(f'{_time}:iamclent1'.encode('utf-8')) data=self.skt.recv(self.bufsiz) print(data.decode('utf-8','ignore')) ifnotdata: break print(data.strip()) time.sleep(5) exceptsocket.error: print('socketerror,reconnection')#自动重连 time.sleep(3) self.doConnection() except: print('othererror') self.skt.close() myclient=MyClient() myclient.run()
上面用的是telnet工具来作为客户端,这里是用代码实现模拟的客户端。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。