gpt4 book ai didi

java - 在响应完成之前关闭 HttpURLConnection

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:53 26 4
gpt4 key购买 nike

背景

我正在使用 HttpURLConnection在客户端使用 HTTP 流(服务器推送)情况下的响应。尽管服务器可能会通过关闭响应来关闭连接,但也需要客户端能够执行此操作。

问题

客户端在单独的线程中处理 InputStream,如下所示:

@Override
public void run() {
try {
for (int b = in.read(); b >= 0; b = in.read()) {
char c = (char) b;
// Do something with the character
// ...
}
}
catch (IOException e) {
}
}

所以当我调用 HttpURLConnection.disconnect()从发起连接的线程(重要的信息是它与处理输入的线程不同),该调用无限期挂起。我什至把它放了一夜,它仍然挂着。甚至打电话Thread.interrupt()没有帮助。

建议?

最佳答案

如果不更改读取线程以使用 InputStream.available() 进行轮询,这似乎无法完成。并在没有可用字节时 hibernate 一小段时间,同时检查一些标志以查看线程是否应该结束。

解决方案是只使用 Apache HTTP 组件。通过将 GET 请求的代码封装在一个类中,可以很容易地将其集成到现有代码中。

public class HttpGetConnection implements AutoCloseable {
public HttpGetConnection(String url) throws IOException {
client = new DefaultHttpClient();
get = new HttpGet(url);
response = client.execute(get);
entity = response.getEntity();
}

public InputStream getContent() throws IOException {
content = entity.getContent();
return content;
}

@Override
public void close() throws Exception {
get.abort();
try {
content.close();
}
catch (IOException e) {
}
}

private HttpClient client;
private HttpGet get;
private HttpResponse response;
private HttpEntity entity;
private InputStream content;
}

原帖中的循环可以保持原样,读取线程将在调用 HttpGetConnection.close() 后不久结束。

关于java - 在响应完成之前关闭 HttpURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com