EventMachine :: WebSocketClient.connect导致onclose在服务器端触发

时间:2014-09-01 07:11:10

标签: ruby-on-rails inter-process-communicat em-websocket em-websocket-client

我的Rails应用程序中有三个部分:

  • 侦听HTML5网络套接字(em-websocket
  • 的部分
  • 连接到它们的一段JavaScript
  • 以及任务是从同一个Web应用程序(em-websocket-client)内部连接到这些套接字的部分(是的,我试图在Phusion Passenger环境中进行一些IPC)

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机制。

0 个答案:

没有答案