您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python網絡編程UDP協議分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python網絡編程UDP協議分析”吧!
UDP協議——User Datagram Protocol,即用戶數據包協議,UDP協議是無連接、不可靠、高效率數據傳輸協議。
UDP協議優點:開銷小、速度快、無連接。
UDP協議缺點:無確認重傳和排序、無流控制、無錯誤恢復。
UDP協議是面向報文的傳輸協議,它對報文既不拆分也不合并,而是給報文添加頭部后就向下交給IP層。發現錯誤時不要重傳,只是簡單地把錯誤的報文扔掉、或給應用程序提供警告。
UDP協議廣泛運用在強調數據傳輸速率的多媒體應用領域,例如網絡聊天、在線視頻、網絡游戲、實時監控、路由協議中修改路由表等。
TCP協議遇到丟包或錯誤時要求重傳,因而導致傳輸速率大幅降低。
UDP協議遇到丟包或錯誤時不要求重傳,因為一個報文丟失后幾秒內會有新的報文替代它,所以UDP協議傳輸速率比TCP協議高很多。
應用程序需要根據需要自定義應用層協議來處理報文丟失、錯誤、失序的情況。
編寫UDP應用程序需要審慎考慮合適的報文長度:
局域網最大傳輸單元(Maximum Transmission Unit,MTU)默認是1500字節。
UDP協議頭部是8字節、IP層協議頭部是20字節。
單條報文建議長度是1024字節,最大長度不得超過65507字節(報文加頭部總長不得超過65535字節)。
網絡環境較好時報文長度及接收緩存建議設大一些,可以減少報文接收不及時導致丟包的概率。
創建socket實例。
sk = socket.socket(type=socket.SOCK_DGRAM)
注意:type=socket.SOCK_DGRAM是指定關鍵字參數,不能“缺省type=”,該參數用來指定使用udp協議。
綁定ip和端口。
sk.bind(('127.0.0.1',9001))
說明:該方法有一個參數,類型是元組(元組的第一個元素是IP,第二個元素是端口)。無返回值。
從UDP客戶端收報文。
message,addrress = sk.recvfrom(1024)
說明:該方法參數是接收消息長度。返回值是元組,元組第一項是消息,第二項是ip及端口。
發送報文給UDP客戶端。
sk.sendto(message,address)
說明:該方法有二個參數,第一個參數是要發送的消息,必須是bytes型;第二個參數是元組(元組的第一個元素是IP,第二個元素是端口)。返回值是發送的字節數。
創建socket實例。
sk = socket.socket()
發報文給UDP服務端。
sk.sendto(message.encode(),('127.0.0.1',9001))
說明:該方法有二個參數,第一個參數是要發送的消息,必須是bytes型;第二個參數是元組(元組的第一個元素是IP,第二個元素是端口)。返回值是發送的字節數。
從UDP服務端收報文。
message = sk.recv(1024).decode()
說明:該方法參數是接收消息長度。返回值是消息。
服務端
import socket HOST = '127.0.0.1' # IP地址PORT = 50007 # 端口max_connect = 5def main():accounts = { }with socket.socket(type=socket.SOCK_DGRAM) as sk:sk.bind((HOST, PORT))while True:msg, address = sk.recvfrom(1024)rev = msg.decode().split('|||')accounts[rev[0]] = addressif rev[1] in accounts:sk.sendto(msg, accounts[rev[1]])if __name__ == "__main__":main()
說明:這個是UDP協議簡易聊天室服務端模型,服務端接收到客戶端發來的消息,會記錄客戶端的ip和端口以及賬號,并更新到字典中。遇到發往目標賬戶的消息在字典中時,會將信息轉發給目標賬戶,從而實現多人聊天功能。
注意:代碼目前沒有緩存消息,當要發送的目標不在線時,該消息會被丟棄。
客戶端
import socketfrom threading import Threadimport sys HOST = '127.0.0.1' # IP地址PORT = 50007 # 端口class Transceiver:def __init__(self, conn, server, account: str, target: str, buffer: int = 1024) -> None:self.conn = conn # socket實例self.server = server # 目標ip及端口self.buffer = buffer # 緩存區大小self.path = (account + '|||' + target + '|||').encode() # 己方賬號def send(self, message: str) -> None:"""發送消息"""if type(message) is str: # 判斷消息類型message = message.encode() # 將消息轉成bytes型,缺省參數是utf8編碼self.conn.sendto(self.path + message, self.server) # 發送消息def recv(self):"""接收消息"""message, _ = self.conn.recvfrom(self.buffer)message = message.decode('utf8').split('|||')return message[1], message[2] # 返回消息字符串def main():def send(m, message):m.send(message)def recv(m):while True:try:source, data = m.recv()print(f'收到"{source}"發來的信息:{data}')except:passwith socket.socket(type=socket.SOCK_DGRAM) as sk:account = input("請輸入你的賬號:")target = input("請輸入你想聊天的賬號:")m = Transceiver(sk, (HOST, PORT), account, target)t = Thread(target=recv, args=(m,))t.setDaemon(True)t.start()while True:message = input('請輸入你要發送的信息:')if not message:continueif message == 'q' or message == 'Q':sys.exit(0)Thread(target=send, args=(m, message)).start()if __name__ == "__main__":main()
說明:這個是udp協議簡易聊天室客戶端模型,客戶端登錄時首先輸入自己的賬號和對方的賬號,然后進入循環,循環輸入發給對方賬號的消息,另開了子收獲進程接受服務端轉發來的消息。
感謝各位的閱讀,以上就是“Python網絡編程UDP協議分析”的內容了,經過本文的學習后,相信大家對Python網絡編程UDP協議分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。