WebSockets: Как уведомить всех подписчиков о разрыве клиентского соединения?

#ruby #websocket #eventmachine #em-websocket

#ruby #websocket #eventmachine #em-websocket

Вопрос:

У меня есть небольшая демонстрация чата WebSocket, над которой я работаю (на основе этого кода). Однако часть, которая, похоже, не работает, заключается в том, что когда соединение между клиентом и сервером закрывается, я хочу уведомить всех подписчиков о том, что пользователь «покинул чат». Я думал, что сервер будет уведомлен / запустит функцию onclose при разрыве клиентского соединения, но, возможно, это не так, как работают WebSockets.

Вот мой код EventMachine:

   ws.onclose do
    puts "Connection closed"
    ws.send ({:type => 'status', :message => "#{@subscribers[subscriber_id]} has left the chatroom"}.to_json)
    @main_channel.unsubscribe(subscriber_id)
  end
  

Ответ №1:

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

 ws.onclose do
  puts "Connection closed"
  msg = {:type => 'status', :message => "#{@subscribers[subscriber_id]} has left the chatroom"}.to_json
  @main_channel.push(msg)
  @main_channel.unsubscribe(subscriber_id)
end
  

Таким образом, сообщение будет отправлено всем подписчикам.

С наилучшими пожеланиями

Тобиас