2

我的 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 应用程序中使用了相同的机制。

4

0 回答 0