<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 問題 你想實現一個基于UDP協議的服務器來與客戶端通信。 ## 解決方案 跟TCP一樣,UDP服務器也可以通過使用?`<span class="pre" style="box-sizing: border-box;">socketserver</span>`?庫很容易的被創建。 例如,下面是一個簡單的時間服務器: ~~~ from socketserver import BaseRequestHandler, UDPServer import time class TimeHandler(BaseRequestHandler): def handle(self): print('Got connection from', self.client_address) # Get message and client socket msg, sock = self.request resp = time.ctime() sock.sendto(resp.encode('ascii'), self.client_address) if __name__ == '__main__': serv = UDPServer(('', 20000), TimeHandler) serv.serve_forever() ~~~ 跟之前一樣,你先定義一個實現?`<span class="pre" style="box-sizing: border-box;">handle()</span>`?特殊方法的類,為客戶端連接服務。 這個類的?`<span class="pre" style="box-sizing: border-box;">request</span>`屬性是一個包含了數據報和底層socket對象的元組。`<span class="pre" style="box-sizing: border-box;">client_address</span>`?包含了客戶端地址。 我們來測試下這個服務器,首先運行它,然后打開另外一個Python進程向服務器發送消息: ~~~ >>> from socket import socket, AF_INET, SOCK_DGRAM >>> s = socket(AF_INET, SOCK_DGRAM) >>> s.sendto(b'', ('localhost', 20000)) 0 >>> s.recvfrom(8192) (b'Wed Aug 15 20:35:08 2012', ('127.0.0.1', 20000)) >>> ~~~ ## 討論 一個典型的UPD服務器接收到達的數據報(消息)和客戶端地址。如果服務器需要做應答, 它要給客戶端回發一個數據報。對于數據報的傳送, 你應該使用socket的?`<span class="pre" style="box-sizing: border-box;">sendto()</span>`?和?`<span class="pre" style="box-sizing: border-box;">recvfrom()</span>`?方法。 盡管傳統的?`<span class="pre" style="box-sizing: border-box;">send()</span>`?和?`<span class="pre" style="box-sizing: border-box;">recv()</span>`?也可以達到同樣的效果, 但是前面的兩個方法對于UDP連接而言更普遍。 由于沒有底層的連接,UPD服務器相對于TCP服務器來講實現起來更加簡單。 不過,UDP天生是不可靠的(因為通信沒有建立連接,消息可能丟失)。 因此需要由你自己來決定該怎樣處理丟失消息的情況。這個已經不在本書討論范圍內了, 不過通常來說,如果可靠性對于你程序很重要,你需要借助于序列號、重試、超時以及一些其他方法來保證。 UDP通常被用在那些對于可靠傳輸要求不是很高的場合。例如,在實時應用如多媒體流以及游戲領域, 無需返回恢復丟失的數據包(程序只需簡單的忽略它并繼續向前運行)。 `<span class="pre" style="box-sizing: border-box;">UDPServer</span>`?類是單線程的,也就是說一次只能為一個客戶端連接服務。 實際使用中,這個無論是對于UDP還是TCP都不是什么大問題。 如果你想要并發操作,可以實例化一個?`<span class="pre" style="box-sizing: border-box;">ForkingUDPServer</span>`?或`<span class="pre" style="box-sizing: border-box;">ThreadingUDPServer</span>`?對象: ~~~ from socketserver import ThreadingUDPServer if __name__ == '__main__': serv = ThreadingUDPServer(('',20000), TimeHandler) serv.serve_forever() ~~~ 直接使用?`<span class="pre" style="box-sizing: border-box;">socket</span>`?來是想一個UDP服務器也不難,下面是一個例子: ~~~ from socket import socket, AF_INET, SOCK_DGRAM import time def time_server(address): sock = socket(AF_INET, SOCK_DGRAM) sock.bind(address) while True: msg, addr = sock.recvfrom(8192) print('Got message from', addr) resp = time.ctime() sock.sendto(resp.encode('ascii'), addr) if __name__ == '__main__': time_server(('', 20000)) ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看