WebSocket настроен следующим образом:
Код: Выделить всё
let ws = null;
// [...]
// set up websocket stuff
ws = new WebSocket('wss://redacted.com/ws/');
Код: Выделить всё
let jOut = {act: 'u', typ: '+', usr: uname, grp: gname, tstamp: nowTimestamp()};
ws.send(JSON.stringify(jOut));
Код: Выделить всё
console.log('At ws.close()');
if (ws.readyState === WebSocket.OPEN) {
console.log('WebSocket is open, attempting to close');
ws.close();
} else {
console.log('WebSocket isn\'t open, not closing');
}
При просмотре инструментов разработчика в Firefox, Safari и Brave текстовые фреймы (код операции 0x1) отображаются успешно отправленными, но я никогда не вижу отправляемого закрывающего кадра (код операции 0x8).
На стороне сервера для при отладке я запускаю свой сервер сокетов PHP в командной строке. Я настроил несколько выводов отладки на стандартный вывод и вижу только код операции 0x1, полученный от клиентов чата веб-приложений (работающих в Firefox, Safari или Brave). Я никогда не вижу закрывающий кадр (0x8) или какой-либо другой код операции.
Сервер сокетов PHP настроен следующим образом:
Код: Выделить всё
// create socket server
$server = stream_socket_server("tcp://127.0.0.1:8088", $errno, $errstr);
Код: Выделить всё
$read = $clients; // copy $clients[] to $read[][
$read[] = $server; // add $server to $read[]
$except = null; // unused but variable needed for stream_select
$write = null; // unused but variable needed for stream_select
// wait for a stream to have data or time out after 200 ms
if (stream_select($read, $write, $except, 0, 200000))
{
// [...]
}
Код: Выделить всё
// this is a client, so read their data
$data = fread($sock, 8192);
if ($data === '') {
// nothing available right now, but not EOF
continue;
}
if ($data !== '' && $data !== false)
{
fwrite(STDOUT, "Received frame: " . bin2hex($data) . "\n"); // Full frame in hex
fwrite(STDOUT, "Received hex opcode: " . dechex(ord($data[0]) & 15) . "\n");
}
Код: Выделить всё
Received frame: 81cad2260131a90460[...]
Received hex opcode: 1
Received frame: 81da632b9f561809fe[...]
Received hex opcode: 1
Received frame: 81ca90cdaafdebefcb[...]
Received hex opcode: 1
Я провел обширный поиск в Интернете и обошелся с двумя разными механизмами искусственного интеллекта, но это было непродуктивно. Мне интересно, есть ли у кого-нибудь идеи, почему ws.close() не выполняется на веб-клиентах, почему они не отправляют закрывающий кадр на сервер, в то время как текстовые кадры работают нормально (не кажется проблемой сети).
Подробнее здесь: https://stackoverflow.com/questions/798 ... lose-frame
Мобильная версия