中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python網絡編程UDP協議分析

發布時間:2021-11-23 16:16:23 來源:億速云 閱讀:185 作者:iii 欄目:互聯網科技

這篇文章主要講解了“Python網絡編程UDP協議分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python網絡編程UDP協議分析”吧!

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字節)。

    • 網絡環境較好時報文長度及接收緩存建議設大一些,可以減少報文接收不及時導致丟包的概率。

udp協議服務端

  1. 創建socket實例。

    sk = socket.socket(type=socket.SOCK_DGRAM)


    注意:type=socket.SOCK_DGRAM是指定關鍵字參數,不能“缺省type=”,該參數用來指定使用udp協議。

  2. 綁定ip和端口。

    sk.bind(('127.0.0.1',9001))


    說明:該方法有一個參數,類型是元組(元組的第一個元素是IP,第二個元素是端口)。無返回值。

  3. 從UDP客戶端收報文。

    message,addrress = sk.recvfrom(1024)


    說明:該方法參數是接收消息長度。返回值是元組,元組第一項是消息,第二項是ip及端口。

  4. 發送報文給UDP客戶端。

    sk.sendto(message,address)


    說明:該方法有二個參數,第一個參數是要發送的消息,必須是bytes型;第二個參數是元組(元組的第一個元素是IP,第二個元素是端口)。返回值是發送的字節數。

udp協議客戶端

  1. 創建socket實例。

    sk = socket.socket()


  2. 發報文給UDP服務端。

    sk.sendto(message.encode(),('127.0.0.1',9001))


    說明:該方法有二個參數,第一個參數是要發送的消息,必須是bytes型;第二個參數是元組(元組的第一個元素是IP,第二個元素是端口)。返回值是發送的字節數。

  3. 從UDP服務端收報文。

    message = sk.recv(1024).decode()


    說明:該方法參數是接收消息長度。返回值是消息。

案例:udp協議聊天室

  • 服務端

    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協議分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝坻区| 江孜县| 且末县| 织金县| 威远县| 荔浦县| 永和县| 景泰县| 铜川市| 茶陵县| 司法| 阳春市| 淮北市| 拉萨市| 龙南县| 玉屏| 西乌珠穆沁旗| 柏乡县| 界首市| 卢氏县| 宁强县| 镇坪县| 富民县| 连山| 和田市| 鄯善县| 景宁| 北碚区| 繁昌县| 岢岚县| 元阳县| 乐平市| 满城县| 赤壁市| 黄骅市| 营山县| 鹿泉市| 秭归县| 神木县| 铜陵市| 衡东县|