如何在EventMachine中跟踪连接/客户端?

时间:2014-05-22 04:38:45

标签: ruby websocket eventmachine

我正在使用websocket-eventmachine-server创建一个websocket服务器。

我想做的是创建一个Android应用程序,允许人们彼此进行多对一的对话。这意味着每个人都需要订阅他们正在进行一对一对话的一堆聊天室。

在线的所有示例似乎都提供了向所有人发送消息的回显服务器。这显然不是我想要的,所以我想知道如何跟踪个人发送直接消息?

在gem em-websocket中,在onopen方法中,有一个握手的返回变量,它可以从uri获取查询字段。请参阅下面的示例代码。我可以看到自己使用该查询获取连接,发送直接消息。问题是,em-websocket现在已经过时,websocket-eventmachine-server不在onopen中提供握手返回变量。

使用websocket-eventmachine-server的许多用户创建1对1邮件系统的正确方法是什么?如果我应该跟踪客户,我该怎么做呢?

clients = {}
EventMachine::WebSocket.run(host: '0.0.0.0', port: '8080') do |ws|
    ws.onopen { |handshake|
        query = handshake.query # in client side I pass an id field so I know who connected
        clients['query'] = ws
    }

    ws.onmessage{|msg_in_json|
        params = JSON.parse(msg_in_json)
        clients[params['recipient']].send params['message'] 
    }

1 个答案:

答案 0 :(得分:0)

您可能希望从EventMachine存储库EventMachine Repo查看此示例。

它的要点是你可以使用常量变量(用@@表示)来跟踪客户端连接时的情况。在post_init类的EM::Connection方法中进行连接尝试。如果连接成功,EM::Connection将调用connection_completed。如果连接不成功,将调用unbind(非常适合清理)。

如果使用某个唯一标识符将连接的客户端存储在数组中,那么查看客户端然后使用send_data方法将内容发送到该客户端是微不足道的。