【问题标题】:How to keep track of connections/clients in EventMachine?如何在 EventMachine 中跟踪连接/客户端?
【发布时间】:2015-04-29 06:31:58
【问题描述】:

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

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

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

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

使用websocket-eventmachine-server 创建具有许多用户的一对一消息传递系统的正确方法是什么?如果我应该跟踪客户,我该怎么做呢?

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'] 
    }

【问题讨论】:

  • 看看这是否对你有任何帮助link

标签: ruby websocket eventmachine


【解决方案1】:

您可能想看看EventMachine 存储库中的这个示例:EventMachine Repo

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多