0

2 つの websocket クライアントがあり、それらの間で情報を交換したいと考えています。

ソケット サーバーの 2 つのインスタンスがあり、1 つ目は個人情報を取得し、フィルター処理して 2 つ目に送信するとします。

require 'em-websocket'

EM.run do
  EM::WebSocket.run(host: '0.0.0.0', port: 19108) do |manager_emulator|
    # retrieve information. After that I need to send it to another port (9108)
  end

  EM::WebSocket.run(host: '0.0.0.0', port: 9108) do |fake_manager|
    # I need to send filtered information here
  end
end

何かをしようとしましたが、通常のダークコードを取得しました。この機能を実装する方法がわかりません。

4

2 に答える 2

0

em-websocket私は宝石を通してそれを行う方法を見つけました! eventmachine ブロックの外側で変数を定義するだけです。そんな感じ

require 'em-websocket'

message_sender = nil

EM.run do
  # message sender
  EM::WebSocket.run(host: '0.0.0.0', port: 19108) do |ws|
    ws.onopen { message_sender = ws }
    ws.onclose { message_sender = nil }
  end

  # message receiver
  EM::WebSocket.run(host: '0.0.0.0', port: 9108) do |ws|
    ws.onmessage { |msg| message_sender.send(msg) if message_sender }
  end
end
于 2015-05-30T07:31:53.340 に答える
0

EMを使用してそれを行う方法がわかりません。

manager_emulator によってトリガーされたイベントを fake_manager にリッスンさせる必要があると思います。

Websocket Web アプリ フレームワークを使用している場合は、非常に簡単です。たとえば、Plezi ウェブアプリ フレームワークでは、次のように記述できます。

# try the example from your terminal.
# use http://www.websocket.org/echo.html in two different browsers to observe:
#
# Window 1: http://localhost:3000/manager
# Window 2: http://localhost:3000/fake

require 'plezi'

class Manager_Controller
    def on_message data
        FakeManager_Controller.broadcast :_send, "Hi, fake! Please do something with: #{data}\r\n- from Manager."
        true
    end
    def _send message
        response << message
    end
end
class FakeManager_Controller
    def on_message data
        Manager_Controller.broadcast :_send, "Hi, manager! This is yours: #{data}\r\n- from Fake."
        true
    end
    def _send message
        response << message
    end
end
class HomeController
    def index
        "use http://www.websocket.org/echo.html in two different browsers to observe this demo in action:\r\n" +
        "Window 1: http://localhost:3000/manager\r\nWindow 2: http://localhost:3000/fake\r\n"
    end
end

# # optional Redis URL: automatic broadcasting across processes or machines:
# ENV['PL_REDIS_URL'] = "redis://username:password@my.host:6379"

# starts listening with default settings, on port 3000
listen

# Setup routes:
# They are automatically converted to the RESTful route: '/path/(:id)'
route '/manager', Manager_Controller
route '/fake', FakeManager_Controller
route '/', HomeController

# exit terminal to start server
exit

幸運を!

PS

EM を維持する場合は、Redis を使用して 2 つのポート間でイベントをプッシュおよびサブスクライブすることを検討してください。

于 2015-05-29T04:01:16.743 に答える