[英]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: 我需要在这里实施两种策略:
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.