python3實現socket客戶端通訊demo
阿新 • • 發佈:2018-12-25
1.建立server.py檔案作為服務端,程式碼如下:
#服務端 import socketserver client_list=[] class TCPHandler(socketserver.BaseRequestHandler): # 所有請求的互動都是在handle裡執行的, def handle(self): while True: try: # 每一個請求都會例項化TCPHandler(socketserver.BaseRequestHandler): self.data = self.request.recv(80000).strip() client_ip=self.client_address[0] client_num=self.client_address[1] if client_num not in client_list: client_list.append(client_num) print("來訪客戶端IP:{} 編號:{}".format(client_ip,client_num)) print("客戶端資料:",self.data.decode()) #傳送回客戶端的資料 self.request.sendall(self.data) print("-------當前線上客戶端編號列表-----------") print(client_list) except ConnectionResetError as e: print("----斷開的客戶端------") print("客戶端:{} 已經斷開".format(client_num)) #如果有客戶端掉線,則將它從線上列表中刪除 client_list.remove(client_num) break if __name__ == "__main__": HOST, PORT = "127.0.0.1", 9999 server = socketserver.ThreadingTCPServer((HOST, PORT), TCPHandler) #執行緒 server.serve_forever()
2.建立client.py檔案作為客戶端,程式碼如下:
#客戶端 import socket class Client(): def send_info(self): try: client = socket.socket() #定義協議型別,相當於生命socket型別,同時生成socket連線物件 client.connect(('127.0.0.1',9999)) while True: msg = input(">>>").strip() if len(msg) ==0:continue client.send(msg.encode("utf-8")) data = client.recv(1024)#這裡是位元組1k print("recv:>",data.decode()) client.close() except ConnectionError as ex: print(ex) if __name__ == "__main__": client=Client() client.send_info()
3.測試。啟動服務端,執行server.py檔案,如下圖:
啟動服務之後,我們可以將client.py多複製幾份更改為不同的名字,模擬多個客戶端。如我複製了兩份,分別為client.py和client2.py,然後執行這個兩個客戶端檔案。如下圖:
啟動客戶端之後,可以在客戶端輸入文字內容傳送到服務端,如下圖,我在client輸入 hello
切換到server端面板,如圖:
可以看到,它已經收到了客戶端1所傳送的資料,並將它返回了回去,接著在client2中也輸入文字內容,如圖:
再次切換到server端面板,如圖:
可以看到,線上客戶端有兩個了。