1. 程式人生 > >python3:用程式碼演示Socket和Server 實現通訊.

python3:用程式碼演示Socket和Server 實現通訊.

這個是 socket程式設計的流程,socket 的本質是個程式設計介面,它把應用層和傳輸層進行了連線。
Socket程式設計

連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。

  1. 伺服器監聽
    是指 伺服器端socket一直是開放的狀態,隨時等待客戶端發來請求 伺服器端socket一直是開放的狀態
    ,隨時等待客 戶端發來請求, 並不定位具體的客戶端,而是處於等待連線的狀態,實時監控網路狀態。
  2. 客戶端請求
    是指由客戶端的socket提出連線請求,要連線的目標是伺服器端的socket。
    為此,客戶端的socket必須首先描述它要連線伺服器的socket,指出伺服器端socket的地址和埠號,
    然後就向伺服器端socket提出連線請求。
  3. 連線確認
    是指當伺服器端監聽到或者說接收到客戶端的連線請求,它就響應客戶端的請求,
    建立一個新的執行緒,把伺服器端的描述發 給客戶端,一旦客戶端確認了此描述,連線就建立好了
    而伺服器端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