简体   繁体   English

一个TCPSocket,两个线程

[英]One TCPSocket, two threads

I need to implement a listening loop for TCPSoket client which will not block sending data to the same socket. 我需要为TCPSoket客户端实现一个侦听循环,该循环不会阻止将数据发送到同一套接字。

The approximate structure is so: 近似结构如下:

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

Is it everything ok with this structure? 这样的结构可以吗?

I need to implement two strategies here: 我需要在这里实施两种策略:

  1. response = send_request(request_data) 响应= send_request(请求数据)
  2. listener - when incoming data is not a response for my request, but asynchronous data which I have to listen to. 侦听器-传入数据不是我的请求的响应,而是我必须侦听的异步数据。

Ruby has a class especially designed for that - Queue : 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

In initializers: 在初始值设定项中:

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

In controller: 在控制器中:

SocketWrapper.instance.send_message('blah blah blah')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM