gpt4 book ai didi

ruby - 一个TCPSocket,两个线程

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:19 26 4
gpt4 key购买 nike

我需要为 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

这个结构是否一切正常?

我需要在这里实现两个策略:

  1. 响应 = 发送请求(请求数据)
  2. 监听器 - 当传入数据不是对我的请求的响应,而是我必须监听的异步数据时。

最佳答案

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

在 Controller 中:

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

关于ruby - 一个TCPSocket,两个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23955882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com