Java URLConnection getInputStream块线程

Java URLConnection getInputStream块线程,java,android,urlconnection,Java,Android,Urlconnection,我在URLConnection类中遇到了getInputStream方法的问题。我知道在其他线程中还讨论了一些其他类似的问题,但在我的案例中似乎没有一个单一的解决方案 有趣的是,随着第一次执行的顺利进行,更多的执行失败(阻塞)。在描述这个问题之前,我想写一些背景知识。给你 基本上我有简单的客户机-服务器配置。因为我不想在客户端应用程序中硬编码服务器地址和端口,所以我使用HTTP服务器(nginx),从中可以检索实际的连接参数 在客户端,有一个由服务控制的“网络线程”。服务启动线程并在需要时中断它

我在
URLConnection
类中遇到了
getInputStream
方法的问题。我知道在其他线程中还讨论了一些其他类似的问题,但在我的案例中似乎没有一个单一的解决方案

有趣的是,随着第一次执行的顺利进行,更多的执行失败(阻塞)。在描述这个问题之前,我想写一些背景知识。给你

基本上我有简单的客户机-服务器配置。因为我不想在客户端应用程序中硬编码服务器地址和端口,所以我使用HTTP服务器(
nginx
),从中可以检索实际的连接参数

在客户端,有一个由服务控制的“网络线程”。服务启动线程并在需要时中断它。在
run()
方法的一开始,调用了以下函数:

private ConnectionParameters obtainConnectionParameters(String url) throws MalformedURLException, IOException {
    URLConnection connection = new URL(url).openConnection();
    InputStream in = connection.getInputStream(); // here the problem occurs

    ... // do some processing

    in.close();     
    return connectionParameters;
}
获取连接参数后,将打开另一个套接字连接。一段时间后,线程可能会关闭,或者仅仅到达
run()
方法的末尾。我仔细检查了它是否干净地退出

回到问题上来,我不知道是什么导致了这种情况的发生。你有什么线索可能导致这种行为吗

我还想提到的是,服务和网络线程与活动在单独的(后台)进程中运行。在这个过程中没有其他地方使用
URLConnection
。值得注意的是,方法中使用的所有变量都是局部变量

我想描述中没有遗漏任何重要的东西。否则请让我知道,这样我可以编辑我的文章

编辑(1):

我刚刚在线程中尝试了ApacheHTTP客户端
而且效果很好。不过,我很想找出
URLConnection
的问题所在。

如果我理解正确,上面的代码片段会被多次调用,第一次可以正常工作,但第二次会阻塞getInputStream()调用


问题可能出在服务器端。可能服务器一次只接受一个连接,而您建立的第一个连接仍处于打开状态?是否可以使用浏览器多次打开url,以验证服务器是否按预期工作?

这是我第一次尝试解决此问题,但服务器似乎工作正常。我在
nginx
conf文件中没有魔法,我在多个选项卡上检查了多个页面刷新(Shift+Ctrl+R)。一切正常。您是否正在读取完整的输入流,直到没有更多的字节可用(-1)?我正在使用以下循环:
while((line=reader.readLine())!=null)
,因此我假设我读取“直到EOF”。如果我错了,请纠正我。读卡器的构造如下<代码>BufferedReader reader=新的BufferedReader(新的InputStreamReader(即“UTF-8”)看起来很完美。对不起,我想不出别的了。很高兴知道它可以与apache的httpclient一起工作。连接具有超时属性(ReadTimeout和ConnectTimeout)。默认情况下,每个属性都有0值(表示无限时间)。线程可以等待连接或读取数据。