2016-12-25 70 views
2

得到這是一個服務器端的WebSocket客戶端。我試圖讓用戶輸入一個循環,然後發送,作爲一個WebSocket的消息發送到服務器。基本操作正在工作,我可以ping/pong服務器。但它不工作放置一個循環中的WebSocket on(:open)功能:循環中EventMachine的/王菲的WebSocket

客戶端(節選):

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輸出那裏。但我希望有一個更簡單的方法。

回答

0

它結束了工作,把蜱循環內螺紋:

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