UDP 不是基於連接的、是不連續的、 不可靠的、 效率⽐較⾼。 更像是寄信, 今⼉⼀封, 明⼉⼀封.,想啥時候發什么時候發。不管收件人收到還是沒收到。
Internet 協議集支持一個無連接的傳輸協議,該協議稱為用戶數據報協議(UDP,User Datagram Protocol)。
服務器端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) # 創建socket對象(udp類型) DGRAM數據包datagram sk.bind(("192.168.36.106", 8888)) # 綁定IP和端口 while 1: msg, address = sk.recvfrom(1024) # 接受客戶端發來的消息,udp必須是客戶端先發送消息 print(f"來自客戶端的消息:{msg.decode('utf-8')}") if msg.decode("utf-8").upper() == "BYE": break sk.sendto(input(">>>:").strip().encode("utf-8"), address) # 發送消息 sk.close()
UDP服務端
1、導入socket模塊
2、創建socket對象(UDP類型)
3、綁定IP地址和端口
4、接收來自客戶端的消息
5、發送消息給客戶端
6、關閉socket對象
客戶端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) # 創建socket對象(udp類型) while 1: sk.sendto(input(">>>:").strip().encode("utf-8"), ("192.168.36.106", 8888)) # udp必須是客戶端先發送數據 msg, address = sk.recvfrom(1024) print(f"來自服務端的消息:{msg.decode('utf-8')}") if msg.decode("utf-8").upper() == "BYE": break sk.close()
UDP客戶端
1、導入socket模塊
2、創建socket對象(UDP類型)
3、發送消息給服務端
4、接收來自服務端的消息
5、關閉socket對象
注意:
1、先啟動服務端,再啟動客戶端。
2、切記客戶端先發送,服務端收到消息和客戶端地址,才能給客戶端發送消息。
為什么tcp和udp兩種協議的端口可以相同?
操作系統當然有能力根據接受的報文的IP字段里面的協議部分判斷這個報文是什么報文,就是說,系統讀數據的時候還沒有讀到上層報文(TCP/UDP)的時候已經知道上層是什么報文了,直接交給相關的內核進程或協議棧處理就可以了。而在同一個協議內部端口號唯一。