手动关闭请求流HTTP.jl中的连接

手动关闭请求流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

我的问题如下。我正在发出一个GET请求,该请求返回一个流,一段时间后,我得到了所需的数据,但Web服务器没有关闭连接,因此我想在我这边关闭它。我的代码如下:

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
。我一定很快会让朱莉娅再试一次。