<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                  這兩天在研究websocekt技術,看到了一些很棒的類庫。原本打算在直接研究workerman的,后來想想,websocket的基礎還沒怎么去理解呢,直接搞那個不太好,先研究一下自己怎么去寫一個簡單的socket服務器。 ![](https://box.kancloud.cn/7f89366de2a4cbf16f5296cfe7eaf908_725x672.)   WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信(full-duplex)。在這個協議提出之前,我想大家去做一些類似于IM這樣的應用的時候,由于http是短連接性質的,大家肯定會用ajax輪詢的方式去定時的請求服務器,以獲得數據。當然這樣的缺點也是很明顯的。HTTP request 的header是非常長的,里面包含的有用數據可能只是一個很小的值,這樣會占用很多的帶寬。那怎么去解決這種應用呢?看看websocket的做法。   握手協議 在實現websocket連線過程中,需要通過瀏覽器發出websocket連線請求,然后服務器發出回應,這個過程通常稱為“握手” (handshaking)。 本文只介紹一種版本的websocket握手方式。   握手的原理大致如下: 客戶端請求web socket連接時,會向服務器端發送握手請求 var ws = new WebSocket('ws://127.0.0.1:8090'); 請求內容大致如下: 復制代碼 GET / HTTP/1.1 Host: 192.168.0.10:8080 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: null Sec-WebSocket-Version: 13 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Sec-WebSocket-Key: VR+OReqwhymoQ21dBtoIMQ== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 復制代碼 請求包說明: * 必須是有效的http request 格式; * HTTP request method 必須是GET,協議應不小于1.1 如: Get / HTTP/1.1; * 必須包括Upgrade頭域,并且其值為”websocket”; * 必須包括”Connection” 頭域,并且其值為”Upgrade”; * 必須包括”Sec-WebSocket-Key”頭域,其值采用base64編碼的隨機16字節長的字符序列; * 如果請求來自瀏覽器客戶端,還必須包括Origin頭域 。 該頭域用于防止未授權的跨域腳本攻擊,服務器可以從Origin決定是否接受該WebSocket連接; * 必須包括”Sec-webSocket-Version” 頭域,當前值必須是13; * 可能包括”Sec-WebSocket-Protocol”,表示client(應用程序)支持的協議列表,server選擇一個或者沒有可接受的協議響應之; * 可能包括”Sec-WebSocket-Extensions”, 協議擴展, 某類協議可能支持多個擴展,通過它可以實現協議增強; * 可能包括任意其他域,如cookie. 服務器端響應如下: 1 2 3 4 HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: Y+Te7S7wQJC0FwXumEdGbv9/Mek= 應答包說明: *必須包括Upgrade頭域,并且其值為”websocket”; *必須包括Connection頭域,并且其值為”Upgrade”; *必須包括Sec-WebSocket-Accept頭域,其值是將請求包“Sec-WebSocket-Key”的值,與”258EAFA5- E914-47DA-95CA-C5AB0DC85B11″這個字符串進行拼接,然后對拼接后的字符串進行sha-1運算,再進行base64編碼,就是 “Sec-WebSocket-Accept”的值; *應答包中冒號后面有一個空格; *最后需要兩個空行作為應答包結束。 請注意:258EAFA5- E914-47DA-95CA-C5AB0DC85B11 這一串加密的字串是固定的,不可更改,否則會握手失敗。客戶端的請求頭實際上是一個http請求,我們只要從頭部匹配出 Sec-WebSocket-Key 并且按照固定加密返回即可。 獲取 Sec-WebSocket-Key 方法: 復制代碼 1 public function getKey($req) { 2 $key = null; 3 if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $req, $match)) { 4 $key = $match[1]; 5 } 6 return $key; 7 } 復制代碼 加密返回方法: 1 public function encry($req){ 2 $key = $this->getKey($req); 3 $mask = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 4 5 return base64_encode(sha1($key . $mask, true)); 6 } 拼裝握手方法: 復制代碼 1 public function dohandshake($socket, $req){ 2 // 獲取加密key 3 $acceptKey = $this->encry($req); 4 $upgrade = "HTTP/1.1 101 Switching Protocols\r\n" . 5 "Upgrade: websocket\r\n" . 6 "Connection: Upgrade\r\n" . 7 "Sec-WebSocket-Accept: " . $acceptKey . "\r\n" . 8 "\r\n"; 9 10 // 寫入socket 11 socket_write($socket, $upgrade.chr(0), strlen($upgrade.chr(0))); 12 } 復制代碼 參考文章:http://blog.csdn.net/edwingu/article/details/44040961,http://www.jb51.net/article/48019.htm 標簽: phpwebsocket, websocket握手 workerman
                  <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>

                              哎呀哎呀视频在线观看