1. 程式人生 > >python3實現socket客戶端通訊demo

python3實現socket客戶端通訊demo

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端面板,如圖:

可以看到,線上客戶端有兩個了。