Inkvizitor
@Inkvizitor
кратко обо мне

С чем связано падение сервера websocket?

WebSocket сервер работает на nodejs. При падении стал замечать такие ошибки:

Error: not opened
    at WebSocket.send (/root/node/node_modules/ws/lib/WebSocket.js:214:16)
    at WebSocket.<anonymous> (/root/node/server.js:30:19)
    at WebSocket.emit (events.js:112:17)
    at Receiver.ontext (/root/node/node_modules/ws/lib/WebSocket.js:797:10)
    at /root/node/node_modules/ws/lib/Receiver.js:473:18
    at Receiver.applyExtensions (/root/node/node_modules/ws/lib/Receiver.js:360:5)
    at /root/node/node_modules/ws/lib/Receiver.js:462:14
    at Receiver.flush (/root/node/node_modules/ws/lib/Receiver.js:336:3)
    at Receiver.opcodes.1.finish (/root/node/node_modules/ws/lib/Receiver.js:478:12)
    at Receiver.expectHandler (/root/node/node_modules/ws/lib/Receiver.js:447:33)
/root/node/node_modules/ws/lib/WebSocket.js:214
    else throw new Error('not opened');
               ^
Error: not opened
    at WebSocket.send (/root/node/node_modules/ws/lib/WebSocket.js:214:16)
    at WebSocket.<anonymous> (/root/node/server.js:30:19)
    at WebSocket.emit (events.js:112:17)
    at Receiver.ontext (/root/node/node_modules/ws/lib/WebSocket.js:797:10)
    at /root/node/node_modules/ws/lib/Receiver.js:473:18
    at /root/node/node_modules/ws/lib/Receiver.js:357:7
    at /root/node/node_modules/ws/lib/PerMessageDeflate.js:217:5
    at afterWrite (_stream_writable.js:363:3)
    at onwrite (_stream_writable.js:354:7)
    at WritableState.onwrite (_stream_writable.js:107:5)


На английском СО нашёл схожий вопрос: stackoverflow.com/questions/24326413/node-js-webso...

Верно ли я понимаю, что крах происходит из-за попытки сокета отправить сообщение уже отключенному клиенту? Т.е. нужна дополнительная проверка на активность подключения, прежде чем отправить сообщение?

И происходит данная ошибка крайне не часто и конкретную причину падения отловить (воспроизвести) пока не удалось.
  • Вопрос задан
  • 1304 просмотра
Решения вопроса 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Проблема в том, что Вы не проверяете, живо ли соединение, перед тем, как послать в него данные. Для нахождения проблемы не хватает глубины вывода стека, добавьте ключик при запуске ноды node --stack-trace-limit=1000 application.js и там будет видно и из какого места Вашего кода это вызывается. Нужно ловить ws.on('close', fn) и ws.on('error', fn) и удалять эти сокеты из множества, по которому Вы проходитесь в цикле и рассылаете, дополнительно можно и проверку поставить типа if (connection.readyState === WebSocket.OPEN) ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы