1、概述
實現網絡編程我們需要藉助Socket模塊,Socket又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求,使主機間或者一臺計算機上的進程間可以通訊。
本文只實現了 單工狀態的例子。
單工:簡單的說就是一方只能發信息,另一方則只能收信息,通信是單向的。
關於半雙工和全雙工,本案例暫未試驗成功。
使用之前先導入模塊:
import socket
2、案例
我們需要創建一個服務端用於接收消息,創建一個客戶端用於發送消息。
創建服務端流程:創建socket對象=>綁定主機和端口(bind函數)=>監聽客戶端(accept函數)=>接收客戶端發送的信息(recv函數)=>關閉
創建服務端類ServerScoket.py:
import socket
# 創建 Socket 對象
serverScoket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 獲取主機名
host = socket.gethostname()
# 設置一個未被佔用的端口
port = 8888
# 綁定主機和端口號
serverScoket.bind((host, port))
# 設置最大連接數,超過後排隊
serverScoket.listen(10)
# 設置連接超時時間15秒
serverScoket.settimeout(15)
# accept() 方法返回兩個值(socket object, address info),用兩個參數來接收
returnScoket, addr = serverScoket.accept()
# 接收服務端響應的數據
recMsg = returnScoket.recv(1024)
print(recMsg.decode("utf-8"))
returnScoket.close()
創建客戶端類ClientSocket.py:
創建客戶端流程:創建socket對象=>連接服務端的主機和端口(connect函數)=>發送消息(send函數)=>關閉
import socket
# 創建 Socket 對象
clientScoket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 獲取主機名
host = socket.gethostname()
# 設置一個未被佔用的端口
port = 8888
# 綁定主機和端口號
clientScoket.connect((host, port))
# 設置連接超時時間15秒
clientScoket.settimeout(15)
clientScoket.send("你好!我來自客戶端\n".encode("utf-8"))
clientScoket.close()
輸出結果:
運行時需要先運行服務端,然後再啓動客戶端,由於客戶端是發送消息不接受消息,所以發送完之後程序退出,不再輸出,所以我們只關注服務端接收的消息。
你好!我來自客戶端
3、總結
注意.bind和.connect函數的參數需要通過元組傳遞對應的主機和端口信息。
socket用完之後需要關閉。
本文相對來說寫得比較簡單,算是對python3 socket有粗略的認識,其實關於實現半雙工和全雙工是實際生活中非常常用的,讀者可以自己翻閱一些資料來實現。