python3:用程式碼演示Socket和Server 實現通訊.
阿新 • • 發佈:2018-11-19
這個是 socket程式設計的流程,socket 的本質是個程式設計介面,它把應用層和傳輸層進行了連線。
連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。
- 伺服器監聽
是指 伺服器端socket一直是開放的狀態,隨時等待客戶端發來請求 伺服器端socket一直是開放的狀態
,隨時等待客 戶端發來請求, 並不定位具體的客戶端,而是處於等待連線的狀態,實時監控網路狀態。 - 客戶端請求
是指由客戶端的socket提出連線請求,要連線的目標是伺服器端的socket。
為此,客戶端的socket必須首先描述它要連線伺服器的socket,指出伺服器端socket的地址和埠號,
然後就向伺服器端socket提出連線請求。 - 連線確認
是指當伺服器端監聽到或者說接收到客戶端的連線請求,它就響應客戶端的請求,
建立一個新的執行緒,把伺服器端的描述發 給客戶端,一旦客戶端確認了此描述,連線就建立好了
而伺服器端socket繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。
客戶端發出請求,服務端接受並處理,並返回給相應客戶端,客戶端接受之後也可以繼續發給伺服器,
如果一直不斷掉,這就是聊天系統的機制。
這個和http的請求不一樣,http 是隻能保持一次會話就要斷掉。
為了講清楚用程式碼演示上邊的流程:
先寫個服務端的socket 解釋在程式碼備註內,請詳細看下.
import socket server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #第一個引數是指協議族,決定了socket的地址型別,在通訊中必須採用對應的地址。AF_INET決定了要用ipv4地址。 #第二個引數是指:Socket型別,決定是面向連線還是無連線,流式Socket(SOCK_STREAM)是一種面向連線的Socket, server.bind(("0.0.0.0",8000)) #第一個引數是指 IP 地址,第二個是 埠號,這個是為了更好的讓客戶端進行定址。 server.listen() #進行監聽 客戶端的socket 的請求 sock,addr=server.accept() # 會返回兩個值, 第一個是scoket物件 ,另一個是socket的地址 data=sock.recv(1024) #接受獲取的資料,並可以指定大小 1024位元組是 1k 大小資料。 print(data.decode("utf-8")) server.close() #關閉 sock.close() #關閉
我們只做了服務端,沒有客戶端 是不能完成通訊的.
我們來寫客戶端
import socket client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #第一個引數是指協議族,決定了socket的地址型別,在通訊中必須採用對應的地址。AF_INET決定了要用ipv4地址。 #第二個引數是指:Socket型別,決定是面向連線還是無連線,流式Socket(SOCK_STREAM)是一種面向連線的Socket, client.connect(("127.0.0.1",8000)) #第一個引數是指 IP 地址,第二個是 埠號 client.send("Test".encode("utf-8")) #客戶端socket 傳送資料給服務端 client.close() #關閉連線,
伺服器端打印出了 接受客戶端發出來的請求 Test.
現在我們改編下,我們也讓伺服器端返回給客戶端.
程式碼如下 :
服務端程式碼新增如下:
sock.send("Hello".encode("utf8"))
#服務端傳送資料
server.close()
客服端的程式碼新增如下:
data=client.recv(1024)
#接受的資料
print(data.decode("utf8"))
#列印結果
Hello