循环进入Eventmachine / faye websocket

时间:2016-12-25 09:05:15

标签: ruby eventmachine faye

这是一个服务器端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输出。但我希望有一种更简单的方法。

1 个答案:

答案 0 :(得分:0)

它最终努力将一个线程放在tick循环中:

  EM.tick_loop do
    Thread.new {
      inp = gets.chomp
      Ws.send inp
    }
  end.on_stop { EM.stop }