有没有一种方法可以通知SSLSocket(Ruby)中的新数据可用?
我正在Ruby的基础上构建一个定制客户端。为了接收数据,我一直在使用模块提供的有没有一种方法可以通知SSLSocket(Ruby)中的新数据可用?,ruby,sockets,asynchronous,tcpsocket,Ruby,Sockets,Asynchronous,Tcpsocket,我正在Ruby的基础上构建一个定制客户端。为了接收数据,我一直在使用模块提供的read和read\u nonblock方法 我现在正试图利用目前为止所拥有的,这样我就可以定义一个回调(通过用户定义的块),在收到消息时运行该回调。看起来我基本上需要单独实现以下几行: thread = Thread.new do while !socket.closed? while (data = socket.read_nonblock(1024) rescue nil) @buffer
read
和read\u nonblock
方法
我现在正试图利用目前为止所拥有的,这样我就可以定义一个回调(通过用户定义的块),在收到消息时运行该回调。看起来我基本上需要单独实现以下几行:
thread = Thread.new do
while !socket.closed?
while (data = socket.read_nonblock(1024) rescue nil)
@buffer << data
end
sleep 0.1
# ... parse full messages from @buffer & deliver to callbacks ...
end
end
thread.run
thread=thread.new do
虽然插座,关了吗?
while(数据=socket.read\u非块(1024)rescue nil)
@缓冲我建议两种方法来实现它
1)使用内核。选择或IO。选择方法(两者相同):
IO.select
会等待一些数据到达,而不会出现繁忙循环。这个解决方案的好处是,它只使用标准的Ruby库
2)使用EventMachine
库:
require 'eventmachine'
module Client
def post_init
start_tls
end
def receive_data data
# include callback code
puts data
puts '...'
end
end
EM.run do
# start event loop
EM.connect 'localhost', 9000, Client
end
EventMachine
,根据文档,是一种使用Reactor模式的事件驱动I/O
EventMachine
提供了您所需的一切。该反应器是用C++实现的,线程模型位于Ruby吉尔(全局解释器锁)之外,使库非常快。
我已经在生产中使用了一段时间,效果非常好
这两种方法都能满足您的要求,因此我建议您对它们进行基准测试,看看哪种方法最适合您的需要。我建议两种方法来实现它
1)使用内核。选择或IO。选择方法(两者相同):
IO.select
会等待一些数据到达,而不会出现繁忙循环。这个解决方案的好处是,它只使用标准的Ruby库
2)使用EventMachine
库:
require 'eventmachine'
module Client
def post_init
start_tls
end
def receive_data data
# include callback code
puts data
puts '...'
end
end
EM.run do
# start event loop
EM.connect 'localhost', 9000, Client
end
EventMachine
,根据文档,是一种使用Reactor模式的事件驱动I/O
EventMachine
提供了您所需的一切。该反应器是用C++实现的,线程模型位于Ruby吉尔(全局解释器锁)之外,使库非常快。
我已经在生产中使用了一段时间,效果非常好
这两种方法都能满足您的要求,因此我建议您对它们进行基准测试,看看哪一种最适合您的需要。好的,首先,如果您已经将其线程化,为什么还要专注于非阻塞?@MartinJames-我的假设是,如果我取消睡眠呼叫,它最终只会消耗循环中的内存。也许我的印象是错误的。你看过Kernel.select
method了吗?这个[将此方法用于纯Ruby实现。我以前不熟悉此方法,我会检查它!谢谢,@tlewin:)它应该可以工作。EventMachine
gem开箱即用。这是一个非常好的软件。好吧,首先,如果你已经将其线程化,为什么要专注于非阻塞?@MartinJames-我的假设是:如果我取消了sleep调用,它会消耗循环中的内存。不过,也许我的印象是错误的。您是否查看了内核。选择了方法[将此方法用于纯Ruby实现。我以前不熟悉此方法,我会检查它!谢谢,@tlewin:)它应该可以工作。EventMachine
gem开箱即用。这是一款非常好的软件。感谢您的全面响应,并让我接触到一些我从未见过/使用过的方法!我很熟悉使用EventMachine,但不知道我可以将其用于SSL套接字。我一定会检查它!感谢您的全面响应,并让我接触到一些我从未见过/使用过的方法!我熟悉EventMachine,但不知道我可以将其用于SSL套接字。我一定会检查它!