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

问题描述

我的问题如下。我正在执行一个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的文档尝试了数十种不同的方法,但是没有一种方法我有用,我怀疑那是因为此网络服务器未发送Close: Connection,但是我却找不到手动/强制关闭客户端连接的示例。

有趣的注释:从REPL运行此命令并通过按Ctrl-C几次关闭连接,然后重新运行该脚本时,它将永久挂起。我必须等待几秒钟到几分钟,然后才能“成功”再次运行它。我怀疑这与过时的连接未正确关闭有关。

很明显,我既不精通网络编程,也没有朱莉娅(Julia),所以我们将不胜感激!

编辑:我怀疑我对网络服务器的行为以及我想做的事情还不够清楚,所以我将尝试尽可能简单地将其分解:我想从网络服务器获得响应,直到我检测到某个问题为止。关键词。之后,我想关闭连接-网络服务器将继续向我发送数据,但是我已经获得了所有感兴趣的信息,因此我不想再等待几分钟让网络服务器为我关闭连接!

解决方法

您的代码假设您将通过调用readavailable获得4次数据,根据缓冲区状态,这可能不是正确的,

而不是循环应该是:

while !eof(io)
    println("DATA: ---")
    println(String(readavailable(io)))
end

在您的情况下,连接被堆叠,因为您尝试读取四个数据块,并且可能是在第一个数据块中获得了所有内容,而不是连接块中的所有数据。

最重要的是,如果您使用do语法,则您不应该自己关闭资源-它将在代码块结尾自动完成。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...