私の Rails アプリケーションには 3 つの部分があります。
- HTML5 Web ソケットをリッスンする部分 ( em-websocket )
- それらに接続する JavaScript の一部
- そして、タスクが同じ Web アプリケーション ( em-websocket-client )の内部からこれらのソケットに接続することである部分(はい、Phusion Passenger 環境でいくつかの IPC を実行しようとしています)
JavaScript コードは正常に接続し、Web ソケット サーバーはそのようなクライアントに満足していますがem-websocket-client
、奇妙なことが起こっています:onclose
を呼び出すことなくハンドラーが呼び出されonopen
、さらに、Web ブラウザーによって開かれたソケットに対して呼び出されます。ありませんem-websocket-client
。
コマンドラインから別の Ruby スクリプトで実行すると、同じem-websocket-client
コードが計画どおりに機能します。em-websocket-client
コードのサンプルは次のとおりです。
require 'em-websocket-client'
class WebSocketsClient
def initialize
Thread.new do
log 'In a thread'
EventMachine.run do
log 'EM run'
@conn = EventMachine::WebSocketClient.connect("ws://localhost:5050?user_id=1&page_token=JYUTbfYDTTliglififi")
@conn.callback do
log 'Callback'
@conn.send_msg({ message_type: 'phone_call', user_id: 1, order_id: 1}.to_json)
@conn.close_connection
end
@conn.errback do |e|
log 'Errback'
puts "Got error: #{e}"
end
@conn.stream do |msg|
#log 'Stream'
#puts "<#{msg}>"
#if msg.data == 'done'
# @conn.close_connection
#end
end
@conn.disconnect do
puts 'gone'
EventMachine::stop_event_loop
end
end
end
end
def send_phone_call(order_id, user_id)
@conn.send_msg({ message_type: 'phone_call', user_id: user_id, order_id: order_id}.to_json)
end
def log(text)
puts "WebSocketsClient: #{text}\n"
end
end
WebSocketsClient.new
onclose
サーバー側ではEventMachine::WebSocketClient.connect
、クライアント側で実行されるとすぐに呼び出されます。@conn.disconnect
呼びにも来ない。
私が推測できるもう 1 つのことは、この動作はEventMachine
、同じ Rails アプリケーション内でサーバーとクライアントが同じメカニズムを使用しているためであるということです。