当前位置: 首页 > 面试题库 >

在响应完成之前关闭HttpURLConnection

柳才良
2023-03-14
问题内容

背景

我正在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()在没有可用字节的情况下,如果不更改读取线程以进行轮询使用并睡眠一小段时间,似乎无法完成此操作,同时检查某个标志以查看线程是否应结束。

解决方案是仅使用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()



 类似资料:
  • 排定的方法保留有限数量的作业,并调用执行实际工作的上的方法。 异步处理机 @Async带注释的方法调用访问EntityManager的服务。

  • NodeJS的socket.io似乎不能作为websocket服务器工作 谢谢你的帮助

  • 问题内容: 有没有办法关闭回应?我可以使用,但实际上并没有关闭套接字。 我要实现的目标:我正在编写一个与网络连接的Java程序,并为此编写了一个node.js服务器。Java代码: 但是,这只是一直挂着。没有端连接,仍在等待来自套接字的输入。 节点: 但是,它不会关闭连接。如前所述,java一直认为下一步会发生什么,因此它陷入了while循环中。 谢谢 问题答案: 通过设置HTTP标头关闭连接而不

  • null 请参见REST API服务器的代码 REST客户端的代码 我从我的Spring Boot Main方法调用这个类为

  • 我必须从网页上阅读某个领域的内容。有人告诉我,我需要获取整个页面,然后从html内容中提取文本。我使用以下程序来获取所需的页面html内容。现在的问题是,这个网页需要几秒钟的时间来加载我想要读取的实际文本值,即使其他静态页面组件都是在前面加载的。我的程序在静态组件加载之后,但在我的值加载之前,返回html内容。因此,我得到的最终HTML具有页面加载过程pic,而不是实际值。有没有人可以指导我在这个

  • 我必须从网页上阅读某一领域的内容。我已经被告知,我需要获得整个页面,然后从html内容中提取文本。我正在使用下面的程序来获取所需的页面html内容。现在的问题是,这个网页加载我想要读取的实际文本值需要几秒钟的时间,即使前面加载了其余的静态页面组件。我的程序在静态组件加载之后但在我的值加载之前返回html内容。因此,我得到的最终HTML有页面加载过程pic,而不是实际值。有没有人可以指导我在这个程序