1

TCPSoket同じソケットへのデータ送信をブロックしないクライアントのリッスン ループを実装する必要があります。

おおよその構造は次のとおりです。

class SocketWrapper
  def initialize
    @messages = []
    @socket = TCPSocket.open('192.168.0.25', 2000)
    Thread.new do
       loop do
          @messages.push @socket.read
       end
    end
  end

  def send_message(msg)
    @socket.write msg
  end

  def read_messages
    @messages.dup
    @messages.clear
  def
end

この構造で大丈夫でしょうか?

ここで 2 つの戦略を実装する必要があります。

  1. 応答 = send_request(request_data)
  2. リスナー - 着信データがリクエストに対する応答ではなく、リッスンする必要がある非同期データの場合。
4

1 に答える 1

4

Rubyには、そのために特別に設計されたクラスがあります- Queue

class SocketWrapper
  def self.instance
    @inst ||= self.new
  end

  def initialize
    @messages = Queue.new
    @socket = TCPSocket.open('192.168.0.25', 2000)
    Thread.new do
       loop do
          @messages << @parse_message.nil? ? @socket.read : @parse_message.call(@socket.read)
       end
    end
  end

  def parse_message(&block)
    @parse_message = block
  end

  def send_message(msg)
    @socket.write msg
  end

  def read_messages
    result = []
    begin
      while message = @messages.pop(true)
        result << message
      end
    rescue ThreadError
      #raised if queue is empty
    end
    result
  def
end

初期化子で:

SocketWrapper.instance.parse_message do |raw|
  JSON.parse(raw)
  # or any other awesome thing with raw
end

コントローラーで:

SocketWrapper.instance.send_message('blah blah blah')
于 2014-05-30T13:55:43.990 に答える