2015-11-13 2 views
0

Я хочу обрабатывать разные случаи завершения соединения WebSocket. Я должен отправить электронное письмо, если оно завершено на стороне клиента путем выхода из системы или закрытия браузера. И я ничего не должен делать, если он завершен на стороне сервера (например, после перезапуска сервера).Обнаружение, если соединение WebSocket прекращено на стороне сервера

Есть ли способ определить, каким образом соединение прекращается?

Я использую Rails 4.2 и em-websocket gem.

ответ

1

Там не должны (дизайн) быть способ, чтобы определить причину закрытия соединения WebSocket, но ...

... Можно запрограммировать некоторые закрытия события в приложение (как на стороне клиента, так и на стороне сервера), что позволяет угадывать другие причины.

Кроме того, разъединение веб-разъемов может произойти из-за потери связи (отсоединение сетевого кабеля, потеря Wi-Fi/сотовой связи, сбоя системы и т. Д.), Ситуация, которая обычно обнаруживается после более длительного времени - соединение может показаться открытым (известный как half-open state), будучи закрытым.

Большинство серверов обнаружит ситуацию примерно за минуту (так долго). Узнайте больше об этом here.

Для остановки сервера вы можете использовать Karnel.trap method. Если вы используете Plezi, вы, вероятно, сможете использовать on_shutdown в своем контроллере (я предвзятый, поскольку я автор) ... из вашего комментария Я узнал, что в em-websockets нет подобный обратный вызов, и я сожалею об этом.

Чтобы использовать метод trap, вы перехватываете сигнал выхода и выполняете любые необходимые действия перед его отправкой. то есть (это не очень DRY, вы можете улучшить на концепции):

old_int_trap = trap('INT') do 
    puts "do something" 
    old_int_trap.respond_to?(:call) && old_int_trap.call 
end 
old_term_trap = trap('TERM') do 
    puts "do something" 
    old_term_trap.respond_to?(:call) && old_term_trap.call 
end 

Или, если сервер закрывает соединение для его собственных причин (аутентификации, плохого поведения и т.д. »), вы можете легко настроить флаг сообщив обратный вызов on_close (onclose?), чтобы ничего не делать.

Выйти из системы легко - отправьте сообщение, прежде чем регистрировать пользователя.

Выключение браузера может быть по умолчанию (нет причин для закрытия).

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

...

НО:

Лично я хотел бы рассмотреть вопрос об использовании сообщения с completed WebSocket, прежде чем действия, такие как электронная почта и т.д.». Я думаю, что «белые списки» - лучший подход.

+0

Благодарим за подробное объяснение! Я попытался использовать метод Kernel.at_exit, но он работает в самом конце после вызова обратного вызова onclose. В em-websocket отсутствует обратный вызов on_shutdown. –

+1

@SergeiStruk - Извините, что 'at_exit' не работал ... Еще один вариант - поймать сигнал перед запуском процесса выхода, сделать что-то и переслать его. Я отредактировал свой ответ, пожалуйста, посмотрите. – Myst

+0

Большое спасибо! Ловушки работают отлично. –

Смежные вопросы