我的Rails应用程序中有三个部分:
JavaScript代码连接正常,Web套接字服务器对这样的客户端很满意,但是当我从em-websocket-client
连接时发生了一件奇怪的事情:onclose
处理程序被调用而没有调用onopen
,而且 - 它被称为一个由网络浏览器打开的套接字,而不是em-websocket-client
。
相同的em-websocket-client
代码,当通过命令行在单独的Ruby脚本中执行时,按计划工作。以下是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
打电话。
我可以推测的另一件事是,这种行为是由于同一个Rails应用程序中服务器和客户端使用相同的EventMachine
机制。