1

次のような複数のイベントマシンサーバーを開発しました

require 'eventmachine'

module EchoServer
 def post_init
  puts "-- someone connected to the echo server!"
 end
 def receive_data data
   send_data ">>>you sent: #{data}"
  close_connection if data =~ /quit/i
 end
 def unbind
  puts "-- someone disconnected from the echo server!"
 end
end

EventMachine::run {
EventMachine::start_server "127.0.0.1", 8081, EchoServer
EventMachine::start_server "127.0.0.1", 8082, EchoServer
EventMachine::start_server "127.0.0.1", 8083, EchoServer
}

ここで、ポート 8082 のみに従ってクライアントにデータを送信する必要があります。すべての接続が開いている場合。サーバーは特定のサーバーにデータを送り返す必要があります。したがって、8081 からリクエストを受け取った場合は、それを 8082 クライアントに送信する必要があります。どうやってそれを送りますか?

4

2 に答える 2

3

元の質問の修正に従って、新しい回答を投稿しました。

port接続ごとにサーバーを追跡する必要があります。また、ポート 8082 から新しい接続が確立されたら、その接続が閉じられるまで保存します。また、8081 ポートで接続されたクライアントからデータを取得すると、以前に保存されたすべての接続にデータを送信します。

require 'eventmachine'

$clients = []

module EchoServer
  def initialize(port)
    @port = port
  end

  def post_init
    puts "-- someone connected to the echo server!"
    $clients << self if @port == 8082
  end

  def receive_data data
    send_data ">>>you sent: #{data}"
    # data is from a client connected by 8081 port
    if @port == 8081
      $clients.each do |c|
        c.send_data ">>>server send: #{data}"
      end
    end
    close_connection if data =~ /quit/i
  end

  def unbind
    puts "-- someone disconnected from the echo server!"
    $clients.delete self if @port == 8082
  end
end

# Note that this will block current thread.
EventMachine.run {
  # arguments after handler will be passed to initialize method
  EventMachine.start_server "127.0.0.1", 8081, EchoServer, 8081
  EventMachine.start_server "127.0.0.1", 8082, EchoServer, 8082
  EventMachine.start_server "127.0.0.1", 8083, EchoServer, 8083
}
于 2013-06-18T13:30:59.693 に答える
2

telnet 127.0.0.1 8082コンソール/シェルの下で実行します。

-> ~ $ telnet 127.0.0.1 8082
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
hello
>>>you sent: hello
quit
Connection closed by foreign host.

Ruby コードからデータを送信する場合は、socketlibrary を参照してください。

require 'socket'

s = TCPSocket.new '127.0.0.1', 8082

s.puts "Hello"
puts s.gets     #=> >>>you sent: Hello

s.close
于 2013-06-18T12:50:00.787 に答える