2016-12-25 14 views
2

これはサーバー側Webソケットクライアントです。私は、ループのユーザー入力を取得しようとしているし、サーバーにwebsocketメッセージとして送信します。基本的な動作が働いていて、サーバーにping/pongできます。しかし、WebSocketをon(:open)機能にループを配置するために働いていない:ループはEventmachine/faye 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 } 
関連する問題