1. 需求
目前我們開(kāi)發(fā)的TCP服務(wù)端程序只能服務(wù)于一個(gè)客戶端,如何開(kāi)發(fā)一個(gè)多任務(wù)版的TCP服務(wù)端程序能夠服務(wù)于多個(gè)客戶端呢?
完成多任務(wù),可以使用線程,比進(jìn)程更加節(jié)省內(nèi)存資源。
2. 具體實(shí)現(xiàn)步驟
- 編寫(xiě)一個(gè)TCP服務(wù)端程序,循環(huán)等待接受客戶端的連接請(qǐng)求
- 當(dāng)客戶端和服務(wù)端建立連接成功,創(chuàng)建子線程,使用子線程專(zhuān)門(mén)處理客戶端的請(qǐng)求,防止主線程阻塞
- 把創(chuàng)建的子線程設(shè)置成為守護(hù)主線程,防止主線程無(wú)法退出。
3. 多任務(wù)版TCP服務(wù)端程序的示例代碼:
import socket
import threading
# 處理客戶端的請(qǐng)求操作
def handle_client_request(service_client_socket, ip_port):
# 循環(huán)接收客戶端發(fā)送的數(shù)據(jù)
while True:
# 接收客戶端發(fā)送的數(shù)據(jù)
recv_data = service_client_socket.recv(1024)
# 容器類(lèi)型判斷是否有數(shù)據(jù)可以直接使用if語(yǔ)句進(jìn)行判斷,如果容器類(lèi)型里面有數(shù)據(jù)表示條件成立,否則條件失敗
# 容器類(lèi)型: 列表、字典、元組、字符串、set、range、二進(jìn)制數(shù)據(jù)
if recv_data:
print(recv_data.decode("gbk"), ip_port)
# 回復(fù)
service_client_socket.send("ok,問(wèn)題正在處理中...".encode("gbk"))
else:
print("客戶端下線了:", ip_port)
break
# 終止和客戶端進(jìn)行通信
service_client_socket.close()
if __name__ == '__main__':
# 創(chuàng)建tcp服務(wù)端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 設(shè)置端口號(hào)復(fù)用,讓程序退出端口號(hào)立即釋放
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 綁定端口號(hào)
tcp_server_socket.bind(("", 9090))
# 設(shè)置監(jiān)聽(tīng), listen后的套接字是被動(dòng)套接字,只負(fù)責(zé)接收客戶端的連接請(qǐng)求
tcp_server_socket.listen(128)
# 循環(huán)等待接收客戶端的連接請(qǐng)求
while True:
# 等待接收客戶端的連接請(qǐng)求
service_client_socket, ip_port = tcp_server_socket.accept()
print("客戶端連接成功:", ip_port)
# 當(dāng)客戶端和服務(wù)端建立連接成功以后,需要?jiǎng)?chuàng)建一個(gè)子線程,不同子線程負(fù)責(zé)接收不同客戶端的消息
sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))
# 設(shè)置守護(hù)主線程
sub_thread.setDaemon(True)
# 啟動(dòng)子線程
sub_thread.start()
# tcp服務(wù)端套接字可以不需要關(guān)閉,因?yàn)榉?wù)端程序需要一直運(yùn)行
# tcp_server_socket.close()
執(zhí)行結(jié)果:
客戶端連接成功: ('172.16.47.209', 51528)
客戶端連接成功: ('172.16.47.209', 51714)
hello1 ('172.16.47.209', 51528)
hello2 ('172.16.47.209', 51714)
4. 小結(jié)
-
編寫(xiě)一個(gè)TCP服務(wù)端程序,循環(huán)等待接受客戶端的連接請(qǐng)求
while True: service_client_socket, ip_port = tcp_server_socket.accept()
-
當(dāng)客戶端和服務(wù)端建立連接成功,創(chuàng)建子線程,使用子線程專(zhuān)門(mén)處理客戶端的請(qǐng)求,防止主線程阻塞
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()
-
把創(chuàng)建的子線程設(shè)置成為守護(hù)主線程,防止主線程無(wú)法退出。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-762874.html
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()
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-762874.html
到了這里,關(guān)于Python---案例-多任務(wù)版TCP服務(wù)端程序開(kāi)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!