我正在使用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']
}
您可能想看看EventMachine
存储库中的这个示例:EventMachine Repo。
它的要点是您可以使用一个常量变量(用@@
表示)在客户端连接时跟踪它们。在EM::Connection
类的post_init
方法中进行连接尝试。如果连接成功,EM::Connection
将调用connection_completed
。如果连接不成功,将调用unbind
(非常适合清理)。
如果您使用一些唯一标识符将连接的客户端存储在数组中,那么查找客户端然后使用send_data
方法将内容发送到该客户端是微不足道的。