我正在尝试为 Ruby 制作一个交互式 telnet 客户端。当前的库非常缺乏,因此我一直在尝试通过创建一个交互式 gem 来添加它,该 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