Я пытаюсь написать собственный 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 ... |
+---------------------------------------------------------------+
Однако я понятия не имею, как его построить, поскольку у меня нет опыта работы с такой диаграммой. Небольшой пример или базовое объяснение очень пригодятся.