1. 程式人生 > >多執行緒TCP伺服器

多執行緒TCP伺服器

1.模組
TCP多執行緒伺服器的建立也很簡單!需要引進模組threading。threading模組用於提供執行緒相關的操作,執行緒是應用程式中工作的最小單元。
2.程式碼

import socket
import threading

bind_ip = "127.0.0.1"                   
bind_port = 1234

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind((bind_ip,bind_port))        #確定伺服器需要監聽的IP地址和埠

server.listen(5)						#設定最大連線數為5
data = input("請輸入資料:")

print("[*] Listening on %s:%d" % (bind_ip,bind_port))

def handle_client(client_socket):       #客戶處理執行緒
    
    request = client_socket.recv(1024)  
    
    print("[*] Received: ",request.decode("UTF-8"))    #打印出客戶端傳送得到的內容
  
    client_socket.send(data.encode("UTF-8"))          #輸入返還一個數據
    
    client_socket.close()
    
    
while True:
    client,addr = server.accept()
    
    print("[*] Accepted connection from: %s:%d" % (addr[0],addr[1]))
    
    client_handler = threading.Thread(target=handle_client,args=(client,))   
    client_handler.start()    #掛起客戶端執行緒,處理傳入資料

在while迴圈中當有一個客戶端成功連線後,我們將接收到的客戶端套接字物件儲存到client變數中,將遠端連線的細節儲存到addr變數中。接著我們以handle_client函式為回撥函式建立了一個新的執行緒物件,將客戶端套接字物件作為一個控制代碼傳遞給它。然後我們啟動執行緒開始處理客戶端連線。為了讓客戶端和伺服器端能做一個簡單的資料傳輸我們改進上一篇中的客戶端程式碼!

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket

s = input("輸入資料:")
target_host = "127.0.0.1"
target_port = 1234

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect((target_host,target_port))
client.send(s.encode("UTF-8"))            #增加一個向伺服器傳送資料的函式

response = client.recv(4096)                   
print(response.decode("UTF-8"))

先執行伺服器端程式碼再執行客戶端程式碼。進行簡單的資料傳輸,結果如下圖:
在這裡插入圖片描述
在這裡插入圖片描述