Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby EventMachine WebSockets-订阅ws到EM通道与将套接字保留在集合中_Ruby_Websocket_Eventmachine - Fatal编程技术网

Ruby EventMachine WebSockets-订阅ws到EM通道与将套接字保留在集合中

Ruby EventMachine WebSockets-订阅ws到EM通道与将套接字保留在集合中,ruby,websocket,eventmachine,Ruby,Websocket,Eventmachine,我正在建立一个使用EM和WebSockets的项目,包括向订阅的客户广播数据 我想知道为什么人们更喜欢订阅一个频道的websocket,如下所示: EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws| ws.onopen { sid = @channel.subscribe { |msg| ws.send msg } @channel.push "#{sid} connected!"

我正在建立一个使用EM和WebSockets的项目,包括向订阅的客户广播数据

我想知道为什么人们更喜欢订阅一个频道的websocket,如下所示:

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|

ws.onopen {
  sid = @channel.subscribe { |msg| ws.send msg }
  @channel.push "#{sid} connected!"

  ws.onmessage { |msg|
    @channel.push "<#{sid}>: #{msg}"
  }

  ws.onclose {
    @channel.unsubscribe(sid)
  }
}

end
EventMachine::WebSocket.start(:host=>“0.0.0.0”,:port=>8080)do | ws|
ws.onopen{
sid=@channel.subscribe{| msg | ws.send msg}
@channel.push“#{sid}已连接!”
ws.onmessage{| msg|
@channel.push“{msg}”
}
ws.onclose{
@频道取消订阅(sid)
}
}
结束
将每个websocket过度添加到数组:

EM::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen {
  puts "Websocket connection opened"
  websocket_connections << ws
}
ws.onclose {
  puts "Websocket connection closed"
  websocket_connections.delete(ws)
}
end
EM::WebSocket.start(:host=>“0.0.0.0”,:port=>8080)do | ws|
ws.onopen{
将“Websocket连接打开”

websocket_connectionsEventMachine::Channel类只是一个处理订阅者数组迭代的抽象。如果您查看的是Ruby源代码,您会发现它与您建议的类似:

def push(*items)
  items = items.dup
  EM.schedule { @subs.values.each { |s| items.each { |i| s.call i } } }
end
事实上,如果您不需要复制items数组,它实际上比手动迭代列表要慢。但是,我怀疑性能影响是否显著。EventMachine::Channel只是一个使管理客户端列表更简单的抽象