Как отформатировать сообщение WebSocket hybi-17? - PullRequest
1 голос
/ 28 ноября 2011

Я пытаюсь написать собственный PHP-сервер для WebSockets. Сервер видит соединения и получает открывающие рукопожатия последней версии (8). Пока все работает нормально, рукопожатия работают, и у клиента надежное соединение.

Прием сообщений также работает нормально, но когда я хочу отвечать клиентам, мой код не работает.

У меня есть следующий серверный код для отправки сообщений клиентам:

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, почти нет содержимого.

Спасибо!

Edit: Ниже приведен формат сообщения, который я должен использовать (см. Ответ Лена Холгейта):

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

Однако я понятия не имею, как его построить, поскольку у меня нет опыта работы с такой диаграммой. Небольшой пример или базовое объяснение очень пригодятся.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

К счастью, я нашел действительно полезную тему: PHP Websocket Server hybi10 . Второй ответ имеет два блока кода: клиентский и серверный. Я использовал сервер один, и он работает без проблем. Убедитесь, что вы не заканчиваете свое рукопожатие ".chr (0)", так как это отключает клиента.

0 голосов
/ 29 ноября 2011

Базовое оформление протокола веб-сокета значительно изменилось между черновиком Hixie76 и черновиком HyBi-17.Спецификация здесь: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...