多线程IO

时间:2014-08-10 16:08:55

标签: ruby multithreading telnet telnetlib

我正在尝试为Ruby创建一个交互式telnet客户端。当前的库非常缺乏,所以我一直试图通过创建一个交互式gem来添加它,允许用户使用telnet实时简化数据。为此,我需要使用多线程:

t1接受用户输入。用户必须始终具有通过整个应用程序输入数据的能力。一旦发送了用户数据,我们将立即收到数据,这些数据将被我们的块{ |c| print c }捕获。问题是我们希望简化数据给我们。换句话说,现在我们只获取在发送内容后发回的数据,我们希望在发送命令后的一分钟内收到数据。我们希望数据不断流向我们。

我为此目的做了t2。 t2等待接收数据,然后在匹配正则表达式模式时显示它。 t2的问题是,如果从未收到数据,则用户无法在t1中输入信息。

t3在t1和t2上运行。 我的问题是如何以这样的方式组织我的线程:用户可以不断键入控制台并提交命令,同时不断地从服务器接收信息?

t1 = Thread.new {
  while true
    input = gets.chomp
    localhost.cmd(input) { |c| print c }
  end
}

t2 = Thread.new {
  puts localhost.waitfor("Prompt" => /[$%#>:?.|](\e\[0?m\s*)* *\z/)
}

t3 = Thread.new {
  t1.join
  t2.join
}

t3.join

1 个答案:

答案 0 :(得分:0)

  

问题是我们希望简化数据给我们。其他   单词,现在我们只收到发送后发回的数据   东西,

require 'thread'

user_data = Queue.new

t1 = Thread.new do
  loop do
    print "Enter data: "
    line = gets.chomp

    if line == ""
      user_data << "END_OF_DATA"
      break
    else
      user_data << line
    end

  end
end.join

t2 = Thread.new do
  processed_data = []

  loop do
    line = user_data.shift
    break if line == "END_OF_DATA"
    processed_data << line
  end

  p processed_data
end.join

您可能想要阅读此内容:

http://tools.ietf.org/html/rfc854