これはサーバー側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
の出力を送信することができます。しかし、もっと簡単な方法があると思っていました。