1. 程式人生 > >基於udp協議的套接字

基於udp協議的套接字

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適用於
      • QQ
      • 查詢操作 eg: ntp時間服務器 dns服務器(查域名,轉ip) 能保證查詢效率高,數據雖然不可靠

基於udp協議的套接字