gpt4 book ai didi

Ruby,Telnet,无超时读取多行响应

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:44 24 4
gpt4 key购买 nike

我需要一些提示/帮助,如何将多行响应读入变量。我当前的命令导致多行响应,但在那之后我超时。

这是我的连接设置方式:

connection = Net::Telnet.new('Host' => host,'Port' => 4800, 'Telnetmode' => false, 'Timeout' => 1)

这是我的请求以及我如何保存它:

puts "Weather request\n"
connection.cmd("{weather}"){ |c| print c }
parsed = JSON.parse(str)
puts "#{parsed}\n\n"

这里是错误:

/usr/lib/ruby/1.9.1/net/telnet.rb:558:in `waitfor': timed out while waiting for more data (Timeout::Error)
from /usr/lib/ruby/1.9.1/net/telnet.rb:695:in `cmd'
from ruby_check.rb:37:in `<main>'

我的响应是多行 JSON,如下所示:

{"City":"Tallinn", "Degrees":"23"}
{"City":"Berlin", "Degrees":"23"}
{"City":"Helsinki", "Degrees":"23"}
{"City":"Stockholm", "Degrees":"23"}

最佳答案

为什么超时?

Net::Telnet documentation说:

For some protocols, it will be possible to specify the Prompt option once when you create the Telnet object and use cmd() calls; for others, you will have to specify the response sequence to look for as the Match option to every cmd() call, or call puts() and waitfor() directly; for yet others, you will have to use sysread() instead of waitfor() and parse server responses yourself.

这在与 Net::Telnet#cmd method's documentation 结合使用时更有意义,它表示该方法:

sends a string to the host, and reads in all received data until is sees the prompt or other matched sequence.

您没有指定自定义 PromptMatch 选项,因此 #cmd 正在等待来自服务器的与默认匹配的内容Net::Telnet 提示符(/[$%#>]\z/n)表示消息结束。如果消息没有以这种提示结束,那么它将永远等待。

可能的解决方案

匹配服务器的提示

如果服务器确实发送了某种提示来指示它已完成发送数据并且您应该键入下一个命令,您可以将匹配它的正则表达式传递给 Net::Telnet 初始化程序。例如,如果服务器提示您使用 command:,您可以使用:

connection = Net::Telnet.new(
"Prompt" => /command: \z/,
# …
)

匹配响应的结尾

如果没有提示,但您等待的响应以特定字符序列结束,您可以在调用 #cmd 时显式指定 Match 选项。例如,如果您的响应是单个 JSON 数组,它将以 ] 结尾,因此您可以使用:

connection.cmd("String" => "{weather}", "Match" => "]") { |c| print c }

放弃 Net::Telnet 并使用 TCPSocket

如果没有提示也没有已知的结局,您可以尝试使用 Net::Telnet 对象的底层 TCPSocket在不使用 #cmd 的情况下读取数据:

connection.puts("{weather}")
connection.sock.readline

在这一点上,使用 Net::Telnet 而不是普通的 TCPSocket 可能没有太大好处。

关于Ruby,Telnet,无超时读取多行响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35509876/

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