<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      第99天:UDP 編程

      by 閑歡

      前面我們講了 TCP 編程,我們知道 TCP 可以建立可靠連接,并且通信雙方都可以以流的形式發送數據。本文我們再來介紹另一個常用的協議--UDP。相對TCP,UDP則是面向無連接的協議。

      UDP 協議

      我們來看 UDP 的定義:

      UDP 協議(User Datagram Protocol),中文名是用戶數據報協議,是 OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。

      從這個定義中,我們可以總結出 UDP 的幾個特點以及其與 TCP 的區別:

      • UDP 是用戶數據報協議,傳輸模式是數據報,而 TCP 是基于字節流的傳輸協議。
      • UDP 是無連接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。
      • UDP 是簡單不可靠的協議,它不提供可靠性,只是把數據包發送出去,并不保證能夠到達目的地。由于它不需要在客戶端和服務端之間建立連接,也沒有超時重發機制,所以傳輸速度很快。

      從以上特點,我們可以看到 UDP 適合應用在每次傳輸數據量小、對數據完整性要求不高、對傳輸速度要求高的領域。這里面最典型的就是即時通信的場景,微信是一個很常見的例子。相信大家在使用微信的時候都遇到過先發的消息后收到,或者有些發送的消息對方沒有收到的情況吧,這就是 UDP 協議典型的特點,不保證傳輸數據的完整性和順序性。除此之外, UDP 還應用在在線視頻、網絡電話等場景。

      UDP 傳輸過程

      我們在講 TCP 的時候,我們說 TCP 客戶端和服務端必須先連接才可以傳輸數據:客戶端先請求連接服務器,服務器接受連接請求,然后雙方才可以通信。在 UDP 協議里,客戶端只需要知道服務器的地址和端口號,就可以直接發送數據了。

      我們來看下 UDP 傳輸的流程圖:

      TCP服務器的建立可以歸納這幾步:

      • 創建 socket(套接字)
      • 綁定 socket 的 IP 地址和端口號
      • 接收客戶端數據
      • 關閉連接

      TCP客戶端的創建可總結為這幾步:

      • 創建 socket(套接字)
      • 向服務器發送數據
      • 關閉連接

      這里需要注意的是 UDP 客戶端連接到服務器的 IP 和端口號必須是 UDP 服務器的 IP 和監聽的端口號,服務器服務器只需要綁定 IP 和端口號,就可以時刻準備接收客戶端發送的數據,此時服務器處于阻塞狀態,直到接收到數據為止。

      UDP 客戶端

      創建 socket,可以這樣做:

      # 導入socket庫
      import socket
      
      # 創建一個socket
      s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      

      創建 socket 時,第一個參數 socket.AF_INET 表示指定使用 IPv4 協議,如果要使用 IPv6 協議,就指定為 socket.AF_INET6。SOCK_DGRAM 指定基于 UDP 的數據報式 Socket 通信。

      創建了 socket 之后,我們就可以向目標地址發送數據報了:

      # 發送數據
      s.sendto(b'Hello Server', ('127.0.0.1', 6000))
      

      第一個參數是需要發送的數據報內容,第二個參數是 IP 地址和端口號的二元組。

      如果是接收數據的話,我們可以這樣寫:

      # 接收數據
      data, addr = s.recv(1024)
      # 解碼接收到的數據
      data = data.decode('utf-8')
      

      接收信息的時候,第一個 data 表示接收到的數據, addr 是對方的 IP 地址和端口號的二元組。

      想要關閉 socket,直接調用 close() 方法即可:

      # 關閉 socket
      socket.close()
      

      UDP 服務器

      相比于客戶端,服務器端只是多了一個步驟,在創建 socket 之后,需要綁定一個 IP 地址和端口號,以便接收客戶端隨時可能發送過來的數據。綁定的方法為:

      # 綁定 IP 和端口
      s.bind(('127.0.0.1', 6000))
      

      UDP 簡單實例

      我們通過一個簡單的實例來體會下 UDP 的客戶端和服務器的通信流程。

      服務器代碼為:

      import socket
      
      # 創建 socket
      sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      # 綁定 IP 和端口號
      sk.bind(('127.0.0.1', 6000))
      while True:
          # 接收數據報
          msg, addr = sk.recvfrom(1024)
          # 打印
          print('來自[%s:%s]的消息: %s' % (addr[0], addr[1], msg.decode('utf-8')))
      
          # 等待輸入
          inp = input('>>>')
          # 發送數據報
          sk.sendto(inp.encode('utf-8'), addr)
      
      # 關閉 socket
      sk.close()
      

      這里,我們先創建 socket,然后綁定本機的6000端口,然后等待接收客戶端發送的數據報,接收到數據后將數據內容打印在控制臺。然后可以在控制臺輸入回復內容,發送給客戶端。

      客戶端代碼:

      import socket
      
      # 創建 socket
      sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      addr = ('127.0.0.1', 6000)
      while True:
          # 等待輸入
          msg = input('>>>')
          # 發送數據報
          sk.sendto(msg.encode('utf-8'), addr)
          # 接收數據報
          msg_recv, addr = sk.recvfrom(1024)
          # 打印
          print(msg_recv.decode('utf-8'))
      
      # 關閉 socket
      sk.close()
      

      在客戶端代碼中,我們就只是創建 socket,然后在控制臺輸入需要向服務器發送的內容,通過 sentto() 方法發送給服務器,然后接收服務器返回的內容,將接收的內容打印到控制臺。

      分別運行客戶端和服務器代碼,然后我們在客戶端的控制臺輸入 “hello server”,我們可以看到服務器的控制臺打印了客戶端發送的內容,然后我們在服務器控制臺輸入 “hello client”,同樣在客戶端控制臺可以看你到內容。

      下面是客戶端的控制臺內容:

      >>>hello server
      hello client
      >>>
      

      下面是服務器的控制臺內容:

      來自[127.0.0.1:61207]的消息: hello server
      >>>hello client
      

      這個實例其實就是一個簡單的聊天模型,客戶端和服務器就像兩個人一樣可以發送和接收對方的信息。

      那么多人群聊怎么實現呢?簡單來說,我們需要設置一臺中心服務器,我們每個人發送的內容都先發送到中心服務器,然后中心服務器再轉發到每個群聊的人。

      總結

      本文為大家介紹了 UDP 編程的基本原理以及通過 Python 實現一個最簡單的聊天程序來模擬 UDP 通信的過程。通過本文的學習,我們需要對 UDP 協議有基本的認識,以及對 UDP 的通信過程比較熟悉。

      參考

      https://www.kancloud.cn/smilesb101/python3_x/298888

      文中示例代碼:python-100-days

      關注公眾號:python技術,回復"python"一起學習交流

      posted @ 2020-06-03 13:27  純潔的微笑  閱讀(1271)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 女人高潮流白浆视频| 免费无码黄十八禁网站| 亚洲人成网站77777在线观看| 人妻有码av中文字幕久久琪| 黑人异族巨大巨大巨粗| 国产精品视频一区二区噜| 午夜精品国产自在| aaa少妇高潮大片免费看| 永久不封国产av毛片| 大香伊蕉在人线国产最新2005| 昌吉市| 亚洲综合av男人的天堂| 国产一级区二级区三级区| 日产国产精品亚洲系列| 国产精品视频白浆免费视频| 国产真正老熟女无套内射| 国产亚洲精品自在久久| 久久久久国色av免费观看性色| 日韩一级伦理片一区二区| 国产欧美另类精品久久久| 熟妇的奶头又大又长奶水视频| 精品一区二区三区四区色| 国产精品va无码一区二区| 亚洲一区二区三区蜜桃臀| 丝袜高潮流白浆潮喷在线播放| 国产中文三级全黄| 午夜福利电影| 色猫咪av在线网址| 蜜桃精品成人影片| 亚洲国产激情一区二区三区| 四虎永久精品免费视频| 最新国产在线拍揄自揄视频| 免费人成视频网站在线观看18| 欧美日韩精品一区二区视频| 欧美另类videossexo高潮| 亚洲无人区码一二三四区| 精品亚洲国产成人av| 亚洲日本va午夜蜜芽在线电影| 国产99久久精品一区二区| 国产精品SM捆绑调教视频| 塔河县|