Как отправить фрейм закрытия WebSocket клиенту на PHP-сервере?

#php #websocket

#php #websocket

Вопрос:

Я написал этот код в методе close класса WebSocekt:

 $msg = str_split(sprintf('6b', $code), 8);
$msg[0] = chr(bindec($msg[0]));
$msg[1] = chr(bindec($msg[1]));
$msg = implode('', $msg).$reason;
socket_write($client, self::encode($msg, 'close'), 127);
  

Теперь я уверен, что написал его в соответствии с тем, что мне сказали на странице протокола, метод encode() создал фрейм закрытия, socket_write() отправил его клиенту без ошибок, ни сервер, ни клиент не сообщили о каких-либо ошибках. Но клиент ничего не получил, при использовании console.log() для регистрации события onclose он сообщил о закрытии нечисто и получил код закрытия 1006 без причины, хотя я отправил фрейм закрытия с кодом 1000 и причиной нормального закрытия. Итак, я запутался, кто может сказать мне, как отправить фрейм закрытия, который заставит это работать.

Комментарии:

1. И какую библиотеку WebSocket вы используете?

2. Я сам пишу библиотеку, вот почему у меня возникает эта проблема.

Ответ №1:

У меня такая же проблема. Отправка socket.close(1000, ‘Your reason’) не заставляет клиента получать фрейм управления закрытием. Вам нужно будет сделать это на серверной части, также используя socket_close ($client). Тем не менее, несмотря на то, что это закрывает соединение, оно не отправляет клиенту фрейм управления закрытием. Я подозреваю, что это как-то связано с тем, чтобы убедиться, что socket_close ($client) ожидает, а затем что-то с этим делать, когда это необходимо. Поэтому может работать что-то вроде socket_set_options() с SO_LINGER . Я все еще расследую эту проблему.