我試圖編寫我自己的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 ... |
+---------------------------------------------------------------+
我然而,不知道如何構建它,因爲我有這樣一個沒有經驗圖。一個小例子或基本解釋將非常方便。
這裏我已經發布了一些關於這個主題的僞代碼:http://stackoverflow.com/questions/8125507/how-can-i-send-and-receive-websocket-messages-on-the-server-side 。 – pimvdb