2011-11-28 66 views
1

我試圖編寫我自己的Web服務器的PHP服務器。服務器看到連接並接收最新版本的開放握手(8)。 目前爲止一切正常,握手正在工作,客戶端有一個牢固的連接。如何格式化WebSocket hybi-17消息?

接收郵件也可以正常工作,但是當我想回復客戶端時,我的代碼似乎不起作用。

我有以下服務器端代碼將消息發送到客戶端:

public function write($data, $handshake = false) { 
    if ($handshake) { 
     socket_write($this->socket, $data.chr(0), strlen($data)+1); 
    } else { 
     socket_write($this->socket, chr(0).$data.chr(255), strlen($data)+2); 
    } 
} 
//Where $data is a JSON string 

我相信部分是清楚的;第一個socket_write用於握手,另一個用於每個普通消息(例如除握手之外的所有消息)。

當我將第一條消息發送給客戶端時,客戶端斷開連接(僅此客戶端)。 我已經將chr(0)和chr(255)替換爲幾乎每個地方(都在$ data之前,都在後面,只有一個在前面/後面等),但沒有一個看起來有什麼區別。

當我更改這些時,客戶端不會斷開連接,但也不會收到消息。

我希望你可以把我的方向正確,因爲我使用的最新的WebSocket草案几乎沒有內容:hybi-17。

謝謝!

編輯: 下面是消息格式我必須使用(見萊恩霍爾蓋特的答覆):

0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-------+-+-------------+-------------------------------+ 
|F|R|R|R| opcode|M| Payload len | Extended payload length | 
|I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
|N|V|V|V|  |S|    | (if payload len==126/127) | 
| |1|2|3|  |K|    |        | 
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
|  Extended payload length continued, if payload len == 127 | 
+ - - - - - - - - - - - - - - - +-------------------------------+ 
|        |Masking-key, if MASK set to 1 | 
+-------------------------------+-------------------------------+ 
| Masking-key (continued)  |   Payload Data   | 
+-------------------------------- - - - - - - - - - - - - - - - + 
:      Payload Data continued ...    : 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
|      Payload Data continued ...    | 
+---------------------------------------------------------------+ 

我然而,不知道如何構建它,因爲我有這樣一個沒有經驗圖。一個小例子或基本解釋將非常方便。

+0

這裏我已經發布了一些關於這個主題的僞代碼:http://stackoverflow.com/questions/8125507/how-can-i-send-and-receive-websocket-messages-on-the-server-side 。 – pimvdb

回答

0

我幸運地找到了一個真正有用的線程:PHP Websocket Server hybi10。 第二個答案有兩個代碼塊,一個客戶端和一個服務器。我已經使用了服務器,它沒有任何問題。 確保您不會以「.chr(0)」結束握手,因爲這會斷開客戶端連接。