天天看點

細說websocket - php篇

下面我畫了一個圖示範 client 和 server 之間建立 websocket 連接配接時握手部分,這個部分在 node 中可以十分輕松的完成,因為 node 提供的 net 子產品已經對 socket 套接字做了封裝處理,開發者使用的時候隻需要考慮資料的互動而不用處理連接配接的建立。而 php 沒有,從 socket 的連接配接、建立、綁定、監聽等,這些都需要我們自己去操作,是以有必要拿出來再說一說。

我們往常看到的請求是這個樣子,當這東西到了伺服器端,我們可以通過一些代碼庫直接拿到這些資訊。

WebSocket 連接配接是由用戶端主動發起的,是以一切要從用戶端出發。第一步是要解析拿到用戶端發過來的 Sec-WebSocket-Key 字元串。

關于 socket 套接字的建立,相信很多大學修過計算機網絡的人都知道了,下面是一張連接配接建立的過程:

細說websocket - php篇

相比 node,這個地方的處理實在是太麻煩了,上面幾行代碼并未建立連接配接,隻不過這些代碼是建立一個 socket 套接字必須要寫的東西。由于處理過程稍微有複雜,是以我把各種處理寫進了一個類中,友善管理和調用。

細說websocket - php篇

 demo.php 握手連接配接測試代碼

上面這段代碼是經過我調試了的,沒太大的問題,如果想測試的話,可以在 cmd 指令行中鍵入<code>php /path/to/demo.php</code>;當然,上面隻是一個類,如果要測試的話,還得建立一個執行個體。

用戶端代碼可以稍微簡單點:

運作伺服器代碼,當用戶端連接配接的時候,我們可以看到:

細說websocket - php篇

這裡比較簡單,直接正則比對,websocket 資訊頭一定包含 Sec-WebSocket-Key,是以我們比對起來也比較快捷~

将 SHA-1 加密後的字元串再進行一次 base64 加密。如果加密算法錯誤,用戶端在進行校檢的時候會直接報錯:

細說websocket - php篇

這裡千萬要注意,每一個請求和相應的格式,最後有一個空行,也就是 <code>\r\n</code>,開始測試的時候把這東西給弄丢了,糾結了半天。

細說websocket - php篇

當用戶端成功校檢key後,會觸發 onopen 函數:

細說websocket - php篇

這裡涉及的編碼問題在前文中已經提到過了,這裡就不贅述,php 對字元處理的函數太多了,也記得不是特别清楚,這裡就沒有詳細的介紹解碼程式,直接把用戶端發送的資料原樣傳回,可以算是一個聊天室的模式吧。

用戶端代碼:

在連通之後發送資料,伺服器原樣傳回:

細說websocket - php篇

用戶端在握手時的請求中有<code>Sec-WebSocket-Version: 13</code>,這樣的版本辨別,這個是一個更新版本,現在的浏覽器都是使用的這個版本。而以前的版本在資料加密的部分更加麻煩,它會發送兩個key:

如果是這種版本(比較老,已經沒在使用了),需要通過下面的方式擷取

隻能無限吐槽這種驗證方式!相比 nodeJs 的 websocket 操作方式:

多麼簡潔,多麼友善!有誰還願意使用 php 呢。。。。

本文沒有給出 decodeFrame 這樣資料幀解析代碼,前文中給出了資料幀的格式,解析純屬體力活。

本文轉自Barret Lee部落格園部落格,原文連結:http://www.cnblogs.com/hustskyking/p/websocket-with-php.html,如需轉載請自行聯系原作者