Python網絡編程之多任務版TCP服務端程序開發

2023-01-12 10:09:50 來源:51CTO博客


(資料圖片)

一、需求

目前我們開發的TCP服務端程序只能服務于一個客戶端,如何開發一個多任務版的TCP服務端程序能夠服務于多個客戶端呢?

完成多任務,可以使用線程,比進程更加節省內存資源。

二、具體實現步驟

編寫一個TCP服務端程序,循環等待接受客戶端的連接請求當客戶端和服務端建立連接成功,創建子線程,使用子線程專門處理客戶端的請求,防止主線程阻塞把創建的子線程設置成為守護主線程,防止主線程無法退出。

三、多任務版TCP服務端程序的示例代碼:

import socketimport threading# 處理客戶端的請求操作def handle_client_request(service_client_socket, ip_port):    # 循環接收客戶端發送的數據    while True:        # 接收客戶端發送的數據        recv_data = service_client_socket.recv(1024)        # 容器類型判斷是否有數據可以直接使用if語句進行判斷,如果容器類型里面有數據表示條件成立,否則條件失敗        # 容器類型: 列表、字典、元組、字符串、set、range、二進制數據        if recv_data:            print(recv_data.decode("gbk"), ip_port)            # 回復            service_client_socket.send("ok,問題正在處理中...".encode("gbk"))        else:            print("客戶端下線了:", ip_port)            break    # 終止和客戶端進行通信    service_client_socket.close()if __name__ == "__main__":    # 創建tcp服務端套接字    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 設置端口號復用,讓程序退出端口號立即釋放    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)    # 綁定端口號    tcp_server_socket.bind(("", 9090))    # 設置監聽, listen后的套接字是被動套接字,只負責接收客戶端的連接請求    tcp_server_socket.listen(128)    # 循環等待接收客戶端的連接請求    while True:        # 等待接收客戶端的連接請求        service_client_socket, ip_port = tcp_server_socket.accept()        print("客戶端連接成功:", ip_port)        # 當客戶端和服務端建立連接成功以后,需要創建一個子線程,不同子線程負責接收不同客戶端的消息        sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))        # 設置守護主線程        sub_thread.setDaemon(True)        # 啟動子線程        sub_thread.start()    # tcp服務端套接字可以不需要關閉,因為服務端程序需要一直運行    # tcp_server_socket.close()    執行結果:客戶端連接成功: ("172.16.47.209", 51528)客戶端連接成功: ("172.16.47.209", 51714)hello1 ("172.16.47.209", 51528)hello2 ("172.16.47.209", 51714)

四、小結

編寫一個TCP服務端程序,循環等待接受客戶端的連接請求
while True:     service_client_socket, ip_port = tcp_server_socket.accept()
當客戶端和服務端建立連接成功,創建子線程,使用子線程專門處理客戶端的請求,防止主線程阻塞
while True:     service_client_socket, ip_port = tcp_server_socket.accept()      sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))     sub_thread.start()
把創建的子線程設置成為守護主線程,防止主線程無法退出。
while True:     service_client_socket, ip_port = tcp_server_socket.accept()      sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))     sub_thread.setDaemon(True)      sub_thread.start()

標簽: 程序開發 進行判斷

上一篇:【世界獨家】玩轉CodeQLpy之代碼審計實戰案例
下一篇:熱頭條丨mysql如何判斷某些日期不合法