循环获取 Eventmachine / faye websocket
looping gets in Eventmachine / faye websocket
这是一个服务器端的 websocket 客户端。我正在尝试循环获取用户输入,然后将其作为 websocket 消息发送到服务器。基本操作正常,我可以 ping/pong 服务器。但是在 websocket on(:open)
函数中放置一个循环是行不通的:
客户(摘录):
require 'faye/websocket'
require 'eventmachine'
EM.run do
ws = Faye::WebSocket::Client.new('ws://localhost:3000/')
ws.on :message do |event|
puts event.data
end
ws.on :open do |event|
ws.send "predefined" # this works
ws.send gets.chomp # this does too
loop { ws.send gets.chomp } # this does not
end
end
似乎工作正常的服务器(摘录):
def self.onmessage(request, ws, msg)
EM.next_tick { Sockets.each{|s| s.send msg.data } }
end
我认为问题是循环阻止了 on(:open)
函数返回并将事件机器移动到下一个时间点。
我可以使用 TickLoop:
解锁活动机器
def start_tick_loop
EM.tick_loop do
Ws.send gets.chomp
end.on_stop { EM.stop }
end
EM.run {
Ws.on :open do |event|
start_tick_loop
end
}
但这并不理想,因为每个客户端都被 gets.chomp
阻止了。我希望用户输入不会阻止 on(:message)
处理程序工作。
在一天结束时,我想我可以制作一个包装脚本来监视文件的更改,并将 gets.chomp
输出发送到那里。但我希望有一个更简单的方法。
最终将一个线程放入 tick 循环中:
EM.tick_loop do
Thread.new {
inp = gets.chomp
Ws.send inp
}
end.on_stop { EM.stop }
这是一个服务器端的 websocket 客户端。我正在尝试循环获取用户输入,然后将其作为 websocket 消息发送到服务器。基本操作正常,我可以 ping/pong 服务器。但是在 websocket on(:open)
函数中放置一个循环是行不通的:
客户(摘录):
require 'faye/websocket'
require 'eventmachine'
EM.run do
ws = Faye::WebSocket::Client.new('ws://localhost:3000/')
ws.on :message do |event|
puts event.data
end
ws.on :open do |event|
ws.send "predefined" # this works
ws.send gets.chomp # this does too
loop { ws.send gets.chomp } # this does not
end
end
似乎工作正常的服务器(摘录):
def self.onmessage(request, ws, msg)
EM.next_tick { Sockets.each{|s| s.send msg.data } }
end
我认为问题是循环阻止了 on(:open)
函数返回并将事件机器移动到下一个时间点。
我可以使用 TickLoop:
解锁活动机器def start_tick_loop
EM.tick_loop do
Ws.send gets.chomp
end.on_stop { EM.stop }
end
EM.run {
Ws.on :open do |event|
start_tick_loop
end
}
但这并不理想,因为每个客户端都被 gets.chomp
阻止了。我希望用户输入不会阻止 on(:message)
处理程序工作。
在一天结束时,我想我可以制作一个包装脚本来监视文件的更改,并将 gets.chomp
输出发送到那里。但我希望有一个更简单的方法。
最终将一个线程放入 tick 循环中:
EM.tick_loop do
Thread.new {
inp = gets.chomp
Ws.send inp
}
end.on_stop { EM.stop }