Python TCPServer 多線程多客戶端通信的實現(xiàn)
最簡單、原始的TCP通信demo
服務端Http請求:
import socket # 創(chuàng)建一個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"sock from client:{sock}") print(f"addr of client:{addr}") while True: # 接收客戶端的請求 recvData = sock.recv(1024) print("客戶端說:%s" % (recvData.decode("utf-8"))) sendData = input("服務器說:") # 發(fā)送(回復)數(shù)據(jù)給客戶端 sock.send(sendData.encode("utf-8"))
客戶端Http請求:
import socket # 創(chuàng)建客戶端socket clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 連接服務器 clientSocket.connect(("192.168.171.1", 80)) while True: # 發(fā)送消息給服務器 sendData = input("客戶端說:") if sendData == "bye": clientSocket.send(sendData.encode("utf-8")) # 編碼:將數(shù)據(jù)裝換成二進制形式 break clientSocket.send(sendData.encode("utf-8")) recvData = clientSocket.recv(1024) print("服務器說:%s" % (recvData.decode("utf-8"))) # 解碼:將二進制轉(zhuǎn)換成字符
1、在TCP中,客戶端的實現(xiàn)流程:
創(chuàng)建客戶端的socket對象建立與服務器之間的聯(lián)系發(fā)送請求接收數(shù)據(jù)關(guān)閉連接
2、服務端的實現(xiàn)流程:
創(chuàng)建服務端的socket對象綁定服務端的地址設置監(jiān)聽器等待客戶端的連接接收客戶端的請求返回處理的結(jié)果到客戶端
ThreadingTCPServer 多線程多客戶端通信自動重連demo
socketserver繼承圖:
TCPServer
# from socketserver import TCPServer, BaseRequestHandler, ThreadingTCPServer from socketserver import TCPServer, StreamRequestHandler, ThreadingMixIn import traceback # class MyBaseRequestHandler(BaseRequestHandler): class MyBaseRequestHandler(StreamRequestHandler): def handle(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) while True: try: data = self.request.recv(1024).decode('UTF-8', 'ignore').strip() print(f'receive from {self.client_address}:{data}') back_data = (f"response\"" + data + "\":\n").encode("utf8") self.request.sendall(back_data) except: traceback.print_exc() break # 源碼:class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass # 從ThreadingMixIn和TCPServer繼承,實現(xiàn)多線程 class MyThreadingTCPServer(ThreadingMixIn, TCPServer): def __init__(self, server_address, RequestHandlerClass): TCPServer.__init__(self, server_address, RequestHandlerClass) self.users = {} class MyTCPserver(): 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) def run(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的終端出現(xiàn)同一個IP但是不同端口的連接:
TCPClient
import socket import time class MyClient: host = '192.168.1.109' port = 23 bufsiz = 1024 addr = None skt = None def __init__(self, host=None, port=None): if host != None: self.host = host if port != None: self.port = port if self.addr == None: self.addr = (self.host, self.port) self.doConnection() def doConnection(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 def run(self): while True: try: _time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) self.skt.sendall(f'{_time}:i am clent1 '.encode('utf-8')) data = self.skt.recv(self.bufsiz) print(data.decode('utf-8', 'ignore')) if not data: break print(data.strip()) time.sleep(5) except socket.error: print('socket error, reconnection') # 自動重連 time.sleep(3) self.doConnection() except: print('other error') self.skt.close() myclient = MyClient() myclient.run()
上面用的是telnet工具來作為客戶端,這里是用代碼實現(xiàn)模擬的客戶端。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python+Pygame實現(xiàn)之見縫插針游戲的實現(xiàn)
這篇文章主要為大家介紹了如何利用Python中的Pygame模塊實現(xiàn)見縫插針游戲,文中的示例代碼講解詳細,對我們學習Python游戲開發(fā)有一定幫助,需要的可以參考一下2022-07-07Python如何在windows環(huán)境安裝pip及rarfile
這篇文章主要介紹了Python如何在windows環(huán)境安裝pip及rarfile,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06python轉(zhuǎn)換pkl模型文件為txt文件問題
這篇文章主要介紹了python轉(zhuǎn)換pkl模型文件為txt文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06Django中在xadmin中集成DjangoUeditor過程詳解
這篇文章主要介紹了Django中在xadmin中集成DjangoUeditor過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07Pytorch卷積神經(jīng)網(wǎng)絡resent網(wǎng)絡實踐
這篇文章主要為大家介紹了Pytorch卷積神經(jīng)網(wǎng)絡resent網(wǎng)絡實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05