1. 程式人生 > >python3.x——socket初步

python3.x——socket初步

解釋 hostname 小姐 udpsocket com 提示 http client 數據鏈路

  python3.x,socket。


  網絡請求的本質是socket,俗稱套接字。

  以udp為例,通俗來講時,包括五個流程:

  客戶端:

 1 # 通信的五個步驟
 2 
 3 from socket import *
 4 
 5 # 1.選擇通信方式
 6 udpSocket = socket(AF_INET, SOCK_DGRAM)
 7 # 2.對方通信地址
 8 sendAddr = ("192.168.10.198", 8080)
 9 # 3.寫入數據
10 sendData = bytes(input("請輸入要發送的數據:").encode("utf8"))
11 #
4.發送數據 12 udpSocket.sendto(sendData, sendAddr) 13 # 5.關閉通信 14 udpSocket.close()

  服務端:

  

 1 # 服務端,指定端口接收數據
 2 
 3 from socket import *
 4 # 1.選擇通信方式
 5 udpSocket = socket(AF_INET, SOCK_DGRAM)
 6 # 2.指定端口接收對方數據
 7 udpSocket.bind((‘‘, 7891))
 8 # 3.解析數據
 9 content, addr = udpSocket.recvfrom(1024)
10
print("%s, %r" % (content.decode("utf8"), addr)) 11 # 4.關閉通信 12 udpSocket.close()

  註:  

    1.端口用於指定某個具體的應用。發送數據除了需要知道對方ip地址,還需要知道端口號和數據傳輸協議。

    2.服務端必須指定該具體應用的端口。客戶端不需要。

    3.接收到的數據需要根據協議解析。

  網絡通信協議有七層和四層之說。七層是物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,應用層。四層是數據層,網絡層,傳輸層,應用層。

  下面這張圖很好的解釋了socket的發送和接收過程。

  技術分享

  應用層:產生數據

  upd和tcp:數據的兩種傳輸方式,負責將數據和對方端口組包

  ip:將ip地址和數據包繼續組包

  就有了(data, (ip, port))

  MAC 硬件接口:組包發送

  然後接收方再一層層解析。

  一次udp通信的過程大致如上。

  socket的通信是雙工的,意思是在發送數據的同時,也可以接受數據。

  下面是一個簡單的聊天室代碼:

  服務端:

 1 from socket import *
 2 
 3 def server():
 4 
 5     udpSocket = socket(AF_INET, SOCK_DGRAM)
 6 
 7     udpSocket.bind((‘‘, 9001))
 8     while True:
 9         content, addr = udpSocket.recvfrom(1024)
10 
11         data = content.decode("gbk")                # decode("utf-8")
12         print(data)
13 
14         sendData = "段小姐:" + str(input("段小姐:"))
15         udpSocket.sendto(sendData.encode("gbk"), addr)      # decode("utf-8")
16     udpSocket.close()
17 
18 if __name__ == "__main__":
19     server()

  客戶端:  

 1 from socket import *
 2 
 3 def client():
 4     udpSocket = socket(AF_INET, SOCK_DGRAM)
 5 
 6     while True:
 7         data = "孫先生:"+str(input("孫先生:"))
 8         data = data.encode("gbk")
 9         udpSocket.sendto(data, (gethostbyname(gethostname()), 9001))
10 
11         content, addr = udpSocket.recvfrom(1024)
12         data = content.decode("gbk")                 # decode("utf-8")
13         print(data)
14     # 提示有問題,但能正常運行
15     udpSocket.close()
16 
17 if __name__ == "__main__":
18     client()

  先運行server,再運行client,就可以自嗨了。自嗨的過程如下:

  技術分享 技術分享

  客戶端是孫先生,服務端是段小姐。

python3.x——socket初步