python3.x——socket初步
阿新 • • 發佈:2017-08-20
解釋 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) 10print("%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初步