我的 Rails 应用程序包含三个部分:
- 侦听 HTML5 Web 套接字 ( em-websocket )的部分
- 一段连接到它们的 JavaScript
- 还有一部分任务是从同一个 Web 应用程序(em-websocket-client)内部连接到这些套接字(是的,我正在尝试在 Phusion Passenger 环境中做一些 IPC)
JavaScript 代码连接良好,Web 套接字服务器对这样的客户端很满意,但是当我从em-websocket-client
一个奇怪的事情连接时发生了:onclose
正在调用处理程序而不调用onopen
,而且 - 它被称为已由 Web 浏览器打开的套接字,不是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
来电。
我可以推测的另一件事是,这种行为是由于EventMachine
服务器和客户端在同一个 Rails 应用程序中使用了相同的机制。