如何解决手动关闭请求流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 举报,一经查实,本站将立刻删除。