目錄
1 UDP
UDP是一個無連接的傳輸協議。UDP作爲網絡主要傳輸協議之一,其優勢在於速度快(這裏的速度快指的是不需要進行連接所節省的時間),支持廣播和多播。但是相對的,UDP所傳輸信息的安全都需要應用層來保障,例如:自定義出錯重傳,自定義的流量控制。某種程度上說,UDP賦予了應用層極大的自由可以自定義規則。
使用Python實現UDP的發送與接收,第一步需要的就是導入 Socket 包,並實例化一個Socket對象。
導入Socket 包 :
import socket
實例化 Socket 對象 :
注意:由於使用UDP,所以在socket()函數的第二個參數應爲socket.SOCK_DGRAM 這個參數表示創建的是一個UDP對象。
Udp_Socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
1.1 UDP發送
1.1.1 bind() 綁定IP與端口號
通過Python可以使用固定或不固定端口發送UDP數據。
如果希望固定端口發送UDP,就需要** bind() **函數綁定端口號和IP
Udp_Socket.bind(("127.0.0.1",9090))
如果不需要綁定,系統自動以隨機分配的端口發送。
1.1.2 sendto() 發送函數
UDP 相比 TCP 少了許多的步驟與過程,所以直接調用 sendto() 發送函數就可以將需要發送的數據發送至指定IP與端口號。
sendto () :
Udp_Socket.sendto("hello world".encode("gbk"),('127.0.0.1',8080))
需要注意的是:相比於TCP的send()發送,UDP的發送函數sendto()多了一 個to,也就是需要指定發送的位置。TCP由於需要先連接後發送或接收所以只要連接成功就可以直接發送或接收而無需指定發送的位置。但UDP爲無連接的傳輸,所以需要在每次發送時指定發送位置。
encode(“gbk”): 這個函數是將你需要發送的數據轉爲gbk(windows 操作系統的文字編碼)編碼。
(‘127.0.0.1’,8080):這個就是所要發送的位置的IP與端口號。
1.1.3 close()關閉
在發送過後就可以使用close()關閉 socket
Udp_Socket.close()
1.1.4 UDP發送完整代碼
通過循環讀取鍵盤輸入,發送數據。當鍵盤輸入 EXIT 時程序結束。
mport socket
def main():
Udp_Socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
localaddr = ("127.0.0.1",9090)
Udp_Socket.bind(localaddr)
while True:
send_data = input("請輸入發送的數據")
if send_data == "EXIT":
break
Udp_Socket.sendto(send_data.encode("gbk"),('127.0.0.1',8080))
send_data = ""
Udp_Socket.close()
if __name__ == "__main__":
main()
1.2 UDP接收端
1.2.1 bind() 綁定IP與端口號
既然是 接收端那麼必定需要知道從哪裏接收,所以一定需要綁定IP與端口號
__bind(): __
Udp_Socket.bind(("127.0.0.1",9090))
1.2.2 recvform() 接收
在綁定了端口號之後,就可以接收發送到該端口的數據。這時通過recvform()接收,recvform()相比TCP協議中的接收多了一個form這也就是說明它的返回值中應該多了一些,多的東西就是發送者的地址。
這個recvform()函數的返回值是(data,address)
通過使用Recv_Data[0]的方式獲取其中的數據部分。
通過使用Recv_Data[1]的方式獲取其中的地址部分。
Recv_Data = udp_socket.recvfrom(1024)
Recv_Data = Recv_Data[0]
Sender_Addr = Recv_Data[1]
print("%s:%s"%(str(Sender_Addr),Recv_Msg.decode("gbk")))
1.2.3 UDP接收完整代碼
import socket
def main():
Udp_Socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
Udp_Socket.bind(("127.0.0.1",9090))
Recv_Data = Udp_Socket.recvfrom(1024)
Recv_Msg = Recv_Data[0]
Sender_Addr = Recv_Data[1]
print("%s:%s"%(str(Sender_Addr),Recv_Msg.decode("gbk")))
if __name__ == "__main__":
main()