Python | Socket01 - 創建一個TCP服務器(阻塞+單線程),將TCP客戶端發過來的字符串原路返回

Wallace Zhang 2022-01-07 16:39:56 阅读数:778

python socket01 socket tcp 阻塞

一、前言


使用Python可以很簡單地創建一個TCP服務器程序,該TCP服務器的程序目的是完成這個功能:TCP客戶端發送一段字符串給TCP服務端,TCP服務端將字符串原路返回去。
在這裏插入圖片描述
我是從該B站視頻教程學習python的socket編程:
https://www.bilibili.com/video/BV1Xx411R743?spm_id_from=333.999.0.0

二、代碼


import socket
def main():
# 創建套接字tcp_Server_Socket
tcp_Server_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 綁定本地信息
tcp_Server_Socket.bind(("",7890))
# 套接字對象tcp_Server進入監聽狀態,等待TCP客戶端建立鏈接,最大連接數為1
tcp_Server_Socket.listen(1)
while True:
print("等待一個新的客戶端的到來:")
# 等待TCP客戶端的連接
new_Client_Socket,client_addr = tcp_Server_Socket.accept()
print("一個新的客戶端已經到來:%s" % str(client_addr))
# 循環目的:為同一個客戶端服務多次,直到客戶端斷開連接
while True:
# 進入阻塞態,等待TCP客戶端發送字符串(最大1024個字節)過來
recv_data = new_Client_Socket.recv(1024)
# 打印信息到控制臺
print("客戶端送過來的請求是: %s" % recv_data.decode("utf-8"))
# 解除阻塞有兩種情况:
if recv_data:
# 將數據發回去之前增加一個換行
recv_data += "\n".encode("utf-8")
# 將收到的字符串原路返回給TCP客戶端 
new_Client_Socket.sendall(recv_data)
else:
print(client_addr,"disconnected") # TCP客戶端斷開連接,打印信息。
break
new_Client_Socket.close()
print("已經為客戶端服務完畢.")
tcp_Server_Socket.close() #可選,它永遠不會被執行
if __name__ == "__main__":
main()

三、測試代碼


3.1、網絡調試助手mNetAssist

在ubuntu使用網絡調試助手mNetAssist可以方便地測試socket程序,它可以充當TCP服務器,TCP客戶端,UDP收發。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

3.2、使用mNetAssist測試socket程序

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
接著,點擊“連接網絡”。TCP服務器檢測到有TCP客戶端連接過來,錶示TCP服務器與TCP客戶端建立連接成功,可以發送字符串了。
在這裏插入圖片描述
最後,使用網絡調試助手(TCP客戶端)發送一串字符串“Hello,World"給TCP服務器。TCP服務器接收到”Hello,World"之後,將"Hello,World返回給TCP客戶端。
在這裏插入圖片描述
在這裏插入圖片描述
最後,TCP客戶端斷開連接。TCP服務器會繼續等待下一個TCP客戶端的連接。
在這裏插入圖片描述
此時,TCP客戶端也可以再次連接TCP服務器。
在這裏插入圖片描述
至此,使用python3開發的TCP服務器程序完成。

四、socket程序阻塞的比特置


先說明一下,new_Client_Socket.recv(1024)就是阻塞的比特置。TCP服務器跟TCP客戶端建立連接後,TCP服務器會馬上進入接收的狀態(阻塞),直到TCP客戶端發送消息過來(解阻塞)才開始執行後續的程序。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

版权声明:本文为[Wallace Zhang]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071639557289.html