2

私の Rails アプリケーションには 3 つの部分があります。

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 アプリケーション内でサーバーとクライアントが同じメカニズムを使用しているためであるということです。

4

0 に答える 0