Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以通知SSLSocket(Ruby)中的新数据可用?_Ruby_Sockets_Asynchronous_Tcpsocket - Fatal编程技术网

有没有一种方法可以通知SSLSocket(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

我正在Ruby的基础上构建一个定制客户端。为了接收数据,我一直在使用模块提供的
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套接字。我一定会检查它!