微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决手动关闭请求流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语法,则您不应该自己关闭资源-它将在代码块结尾自动完成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?