<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之旅 廣告
                # 網絡通信協議設計 為什么需要通信協議 ----- TCP協議在底層機制上解決了UDP協議的順序和丟包重傳問題。但相比UDP又帶來了新的問題,TCP協議是流式的,數據包沒有邊界。應用程序使用TCP通信就會面臨這些難題。 因為TCP通信是流式的,在接收1個大數據包時,可能會被拆分成多個數據包發送。多次Send底層也可能會合并成一次進行發送。這里就需要2個操作來解決: * 分包:Server收到了多個數據包,需要拆分數據包 * 合包:Server收到的數據只是包的一部分,需要緩存數據,合并成完整的包 所以TCP網絡通信時需要設定通信協議。常見的TCP網絡通信協議有`HTTP`、`HTTPS`、`FTP`、`SMTP`、`POP3`、`IMAP`、`SSH`、`Redis`、`Memcache`、`MySQL` 。 如果要設計一個通用協議的Server,那么就要按照通用協議的標準去處理網絡數據。除了通用協議外還可以自定義協議。Swoole支持了2種類型的自定義網絡通信協議。 EOF結束符協議 ----- EOF協議處理的原理是每個數據包結尾加一串特殊字符表示包已結束。如`memcache`、`ftp`、`stmp`都使用`\r\n`作為結束符。發送數據時只需要在包末尾增加`\r\n`即可。使用EOF協議處理,一定要確保數據包中間不會出現EOF,否則會造成分包錯誤。 在`swoole_server`和`swoole_client`的代碼中只需要設置2個參數就可以使用EOF協議處理。 ```php $server->set(array( 'open_eof_split' => true, 'package_eof' => "\r\n", )); $client->set(array( 'open_eof_split' => true, 'package_eof' => "\r\n", )); ``` 固定包頭+包體協議 ---- 固定包頭的協議非常通用,在BAT的服務器程序中經常能看到。這種協議的特點是一個數據包總是由包頭+包體2部分組成。包頭由一個字段指定了包體或整個包的長度,長度一般是使用2字節/4字節整數來表示。服務器收到包頭后,可以根據長度值來精確控制需要再接收多少數據就是完整的數據包。Swoole的配置可以很好的支持這種協議,可以靈活地設置4項參數應對所有情況。 Swoole的Server和異步Client都是在`onReceive`回調函數中處理數據包,當設置了協議處理后,只有收到一個完整數據包時才會觸發`onReceive`事件。同步客戶端在設置了協議處理后,調用 `$client->recv()` 不再需要傳入長度,recv函數在收到完整數據包或發生錯誤后返回。 ```php $server->set(array( 'open_length_check' => true, 'package_max_length' => 81920, 'package_length_type' => 'n', //see php pack() 'package_length_offset' => 0, 'package_body_offset' => 2, )); ```
                  <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>

                              哎呀哎呀视频在线观看