我编写了一个程序,用于使用 websocket 将数据从 html 文件读取到 ruby 程序。我包含以下代码:
EventMachine::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen { |handshake|
puts "WebSocket connection open #{ws}"
# Access properties on the EM::WebSocket::Handshake object, e.g.
# path, query_string, origin, headers
# Publish message to the client
# ws.send "Hello Client, you connected to #{handshake.path}"
}
ws.onclose { puts "Connection closed" }
ws.onmessage { |msg|
puts "Recieved message: #{msg}"
ws.send "#{msg}"
}
end
这工作正常。它接收从我的 html 页面发送的任何数据。现在,我需要的是跟踪与此服务器的连接,并将收到的消息发送到所有可用连接。这里使用的"发送"功能只能发送到指定的连接。
您需要基本的聊天服务器?
只需将连接存储在列表(或哈希)中即可。人们倾向于包含在哈希中,以便更容易删除它们如果这是在类中,请使用 @connections
而不是$connections
GL
$connections = {}
EventMachine::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen
$connections[ws] = true
end
ws.onclose do
$connections.delete(ws)
end
ws.onmessage do |msg|
$connections.each { |c, b| c.send msg }
end
end
您可以将 EventMachine 与 Faye 和 Faye/Websocket 结合使用
您将需要 faye/websocket 用于基于浏览器的客户端,或者只需要 faye 用于您的 ruby 客户端。
这个想法是,通过Faye创建一个频道,然后为您的客户订阅该频道。然后,您将所需的数据从服务器推送到此通道,订阅的客户端将收到此数据。