Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to disconnect redis client in websocket eventmachine
    text
    copied!<p>I'm trying to build a websocket server where each client establish its own redis connections used for publish and subscribe.</p> <p>When the redis server is running I can see the two new connections being established when a client connects to the websocket server and I can also publish data to the client, but when the client drops the connection to the websocket server I also want to disconnect from Redis . How can I do this?</p> <p>Maybe I'm doing it wrong, but this is my code.</p> <pre><code>#require 'redis' require 'em-websocket' require 'em-hiredis' require 'json' CLIENTS = Hash.new class PubSub def initialize(client) @socket = client.ws # These clients can only be used for pub sub commands @publisher = EM::Hiredis.connect #Later I will like to disconnect this @subscriber = EM::Hiredis.connect #Later I will like to disconnect this client.connections &lt;&lt; @publisher &lt;&lt; @subscriber end def subscribe(channel) @channel = channel @subscriber.subscribe(channel) @subscriber.on(:message) { |chan, message| @socket.send message } end def publish(channel,msg) @publisher.publish(channel, msg).errback { |e| puts [:publisherror, e] } end def unsubscribe() @subscriber.unsubscribe(@channel) end end class Client attr_accessor :connections, :ws def initialize(ws) @connections = [] @ws = ws end end EventMachine.run do # Creates a websocket listener EventMachine::WebSocket.start(:host =&gt; '0.0.0.0', :port =&gt; 8081) do |ws| ws.onopen do # I instantiated above puts 'CLient connected. Creating socket' @client = Client.new(ws) CLIENTS[ws] = @client end ws.onclose do # Upon the close of the connection I remove it from my list of running sockets puts 'Client disconnected. Closing socket' @client.connections.each do |con| #do something to disconnect from redis end CLIENTS.delete ws end ws.onmessage { |msg| puts "Received message: #{msg}" result = JSON.parse(msg) if result.has_key? 'channel' ps = PubSub.new(@client) ps.subscribe(result['channel']) elsif result.has_key? 'publish' ps = PubSub.new(ws) ps.publish(result['publish']['channel'],result['publish']['msg']); end } end end </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload