Python | Socket02 - 使用with語句建立一個TCP服務器(阻塞+單線程),將TCP客戶端發過來的字符串原路返回

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

python socket02 socket 使用 建立

一、前言


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

在上一篇博文完成TCP服務器簡單的收發程序後,發現在Python上有更加簡潔的方式來實現,使用with語法提供的上下文管理器。該程序的功能還是跟上一篇博文一樣。
在這裏插入圖片描述

二、代碼


import socket
def main():
# 使用with語句創建並管理一個套接字對象tcp_Server
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as tcp_Server:
# 套接字對象tcp_Server綁定IP地址(""錶示本機IP地址)與端口號7890
tcp_Server.bind(("",7890))
# 套接字對象tcp_Server進入監聽狀態,等待TCP客戶端建立鏈接,最大連接數為1
tcp_Server.listen(1)
while True:
print("等待一個新的客戶端的到來:")
# 程序進入阻塞態,當套接字對象tcp_Server接收到一個鏈接請求,建立新的套接字對象new_Socket去服務該TCP客戶端
new_Socket,addr = tcp_Server.accept()
print("一個新的客戶端已經到來:%s" % str(addr))
# 使用with語句管理套接字對象new_Socket
with new_Socket:
# 打印連接過來的TCP客戶端的IP地址與端口號
print(addr,"connected.")
while True:
# 進入阻塞態,等待TCP客戶端發送字符串(最大1024個字節)過來
data = new_Socket.recv(1024)
print("客戶端送過來的請求是: %s" % data.decode("utf-8"))
# 解除阻塞有兩種情况:
if not data:
print(addr,"disconnected.") #TCP客戶端斷開連接,打印消息。
print("已經為客戶端服務完畢")
break
# 數據發回去之前增加一個換行
data += "\n".encode("utf-8")
# 將收到的字符串原路返回給TCP客戶端
new_Socket.sendall(data)
# 使用with語句創建new_Socket套接字對象後,with退出時自動調用new_Socket.close()
# 使用with語句創建tcp_Server套接字對象後,with退出時自動調用tcp_Server.close()
if __name__ == "__main__":
main()

三、測試代碼


先運行TCP服務器程序。
在這裏插入圖片描述
接著,使用網絡調試助手充當TCP客戶端與TCP服務器進行連接。
在這裏插入圖片描述

四、知識點補充


4.1、With語法的好處

使用with語法可以省去調用socket對象的close( )方法,with語法的最重要作用就是自動釋放資源。不需要程序員調用close()方法釋放資源了。
以下摘自《極客時間》的課程《Python 核心技術與實戰》。
在這裏插入圖片描述
在這裏插入圖片描述

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