手动关闭请求流HTTP.jl中的连接
我的问题如下。我正在发出一个GET请求,该请求返回一个流,一段时间后,我得到了所需的数据,但Web服务器没有关闭连接,因此我想在我这边关闭它。我的代码如下:手动关闭请求流HTTP.jl中的连接,http,julia,Http,Julia,我的问题如下。我正在发出一个GET请求,该请求返回一个流,一段时间后,我得到了所需的数据,但Web服务器没有关闭连接,因此我想在我这边关闭它。我的代码如下: using HTTP HTTP.open(:GET, "https://someurl.com", query=Dict( "somekey"=>"somevalue" )) do io for i = 1:4 println("D
using HTTP
HTTP.open(:GET, "https://someurl.com", query=Dict(
"somekey"=>"somevalue"
)) do io
for i = 1:4
println("DATA: ---")
@show io
println(String(readavailable(io)))
end
@info "Close read"
closeread(io)
@info "After close read"
@show io
end
println("At the end!")
然而,我从未到达最后一行。通过查阅HTTP.jl
的文档,我尝试了几十种不同的方法,但是没有一种方法对我有效,我怀疑是这样,因为这个Web服务器没有发送Close:Connection
,但是我没有找到一个在客户端手动/强制关闭连接的示例
有趣的提示:当从REPL运行此脚本并通过点击Ctrl-C关闭连接几次,然后重新运行脚本时,它将永远挂起。我必须等待几秒钟到几分钟,然后才能再次“成功”运行它。我怀疑这与旧连接未正确关闭有关
很明显,我既不精通网络编程,也不精通julia,因此非常感谢您的帮助
编辑:我怀疑我对Web服务器的行为不够清楚,我想做什么,所以我会尽可能简单地将其分解:我想从Web服务器获得响应,直到我检测到某个关键字。之后,我想关闭连接-网络服务器将继续向我发送数据,但我已经得到了我感兴趣的所有数据,所以我不想再等待几分钟,让网络服务器为我关闭连接 您的代码假设您将通过调用
readavailable
获取数据的4次,根据缓冲区状态,这可能不是真的
而不是你的循环应该是:
while !eof(io)
println("DATA: ---")
println(String(readavailable(io)))
end
在您的例子中,连接被堆叠,因为您尝试读取四个数据块,并且可能您正在获取第一个数据块中的所有内容,而不是连接块
最重要的是,如果您的a使用
do
语法,您不应该自己关闭资源-它将在块的末尾自动完成。这不起作用,因为eof永远不会变为真(在我的测试中)。已经试过了,等了3分钟。。。您对这4件事的看法相当正确,但是我知道对于这个特定的Web服务器,我会得到无数的响应,正如我在问题中所说的(我的意思是肯定会有一些超时(>=3分钟)服务器端)。在我未来的代码中,我将有一个while循环,等待某个关键字出现。我在原始问题中添加了一个编辑,以更好地解释我想要的行为:)如果此服务器是非标准的,也许您可以尝试使用HTTP.openraw
打开一个直接套接字连接,从而对正在发生的事情进行更广泛的控制。此外,我不喜欢将readavailable
与读取无休止的数据流相结合——同样,这应该使用一些较低级别的API进行处理。感谢您的提示。这听起来对我来说有点太复杂了,我已经用python重写了脚本,在那里它就像在iter_line()
上迭代一样简单,当我得到我需要的东西时,只需break
。我一定很快会让朱莉娅再试一次。