1

Ruby 言語 gem em-websocket: https://github.com/igrigorik/em-websocketを使用 して、eventmachine 上で websocket サーバーを実行したいと考えています。

エコー サーバーのデモを正常に実行します。

EM.run {
  EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|
    ws.onopen { |handshake|
      puts "WebSocket connection open"

      ws.send "Hello Client, you connected to #{handshake.path}"
    }

    ws.onclose { puts "Connection closed" }

    ws.onmessage { |msg|
      puts "Recieved message: #{msg}"
      ws.send "Pong: #{msg}"
    }
  end
}

ここで、サーバーが接続されたクライアントに websocket メッセージを介して n ミリ秒 (ランダム値) ごとにいくつかのデータをプッシュできるデモを開発したいと思います...事実上次のようなものです:

def periodic_push
    # random elapsed: from 100 milliseconds to 6 seconds
    msec_value =  (rand(100..6000) / 1000.0 )
    message = "time: #{Time.now} value: #{msec_value.to_s}"

    ws.send message
    puts message

    sleep (msec_value)
end

EM ループ内で sleep() システム コールを使用できないことは承知していますが、定期的なイベントをEM::WebSocket loop;に挿入する方法がわかりません。たぶん EventMachine::PeriodicTimer?どうやって ?

誰かがコード例のチャンクで私を助けることができますか? ありがとう!ジョルジオ

4

2 に答える 2

-1

私のロジックは、イベント マシンを可能な限り最小限の期間実行し、必要なランダム値の遅延を追加することです。例えば

'ws.onopen { |handshake|
  puts "WebSocket connection open"
  ws.send "Hello Client, you connected to: #{Socket.gethostname}. websocket server path: #{handshake.path}"


timer = EventMachine::PeriodicTimer.new(0.0) do #the delay is kept to minimum here

  value =  (rand(100..6000) / 1000.0 )
  message = "time: #{Time.now} value: #{value.to_s}"

  ws.send message
  puts message
 delay(2) #2 seconds delay or the dynamic delay you want
end
}`

コンテキスト: 自己試行

于 2016-07-12T14:04:49.870 に答える