基於udp協議的套接字
阿新 • • 發佈:2018-12-02
sendto 遠程 如果 class col win 文件 時間服務器 發送
tcp:發送數據可靠,需要建立連接,存在粘包現象
udp:傳送數據不可靠,不用建立連接,發數據效率高,不存在粘包現象
服務端
from socket import * server = socket(AF_INET, SOCK_DGRAM) # 數據報協議,沒有粘包問題 server.bind("127.0.0.1", 8080) # udp 沒有連接無listen和accept while True: data, client_addr = server.recvfrom(1024) # 收消息 print(data) server.sendto(data.upper(), client_addr) # 回消息 server.close()
客戶端
from socket import * client = socket(AF_INET, SOCK_DGRAM) # 數據報協議,沒有粘包問題 # udp 沒有連接無listen和accept while True: msg = input(">>>:").strip() # tcp不能為空,udp可以發空內容 client.sendto(msg.encode("utf-8"), ("127.0.0.1", 8080)) # 發送 data, server_addr = client.recvfrom(1024) # 再發回消息 print(data, server_addr) client.close() # sendto 和 recvfrom 一一對應
TCP VS UDP
tcp基於鏈接通信
- 基於鏈接,則需要listen(backlog),指定連接池的大小
- 基於鏈接,必須先運行的服務端,然後客戶端發起鏈接請求
- 對於mac系統:如果一端斷開了鏈接,那另外一端的鏈接也跟著完蛋recv將不會阻塞,收到的是空(解決方法是:服務端在收消息後加上if判斷,空消息就break掉通信循環)
- 對於windows/linux系統:如果一端斷開了鏈接,那另外一端的鏈接也跟著完蛋recv將不會阻塞,收到的是空(解決方法是:服務端通信循環內加異常處理,捕捉到異常後就break掉通訊循環)
- 流式協議 會粘包 不可以發空 send recv 不是 一 一對應
- tcp適用於:
- 數據一定要可靠
- 遠程執行命令
- 下載文件
udp無鏈接
- 無鏈接,因而無需listen(backlog),更加沒有什麽連接池之說了
- 無鏈接,udp的sendto不用管是否有一個正在運行的服務端,可以己端一個勁的發消息,只不過數據丟失
- recvfrom收的數據小於sendto發送的數據時,在mac和linux系統上數據直接丟失,在windows系統上發送的比接收的大直接報錯
- 只有sendto發送數據沒有recvfrom收數據,數據丟失
- 數據報協議 不會粘包 可以發空 sendto recvfrom 一 一 對應 數據報協議 數據不安全 有可能發送數據 > 1024 或者網絡網絡異常 數據沒了
- udp適用於
- 查詢操作 eg: ntp時間服務器 dns服務器(查域名,轉ip) 能保證查詢效率高,數據雖然不可靠
基於udp協議的套接字