我正在尝试使用一些外部 API 来获取一些数据。当数据量很小时,一切正常,但是当 API 返回的数据量很大时,我得到连接重置例外。下面的代码来自java类InterfaceHelper,我还在出现异常的行no处标记了注释[它在尝试从 InputStream 读取数据时].
我尝试搜索有关 STACKOVERFLOW 本身的很多问题,但没有找到合适的答案。因此,请不要将其标记为重复问题。我想知道这个问题背后的原因是什么,以及这个问题的正确解决方案是什么。如果您发现此问题重复,请先回答它,然后再将其标记为重复。我赌你。
在下面找到我使用过的代码。 URL 是一些虚拟 URL,出于安全原因,我无法提及我使用的实际 URL。
try{
URL url = new URL("http://example.com/someParams/SOME-ACCESS-TOKEN");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Language", "en-US");
connection.setRequestProperty("X-EXAMPLE-LOGIN", "XXXXXXXX");
connection.setRequestProperty("X-EXAMPLE-PASSWORD", "XXXXXX");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
DataInputStream input = new DataInputStream(connection.getInputStream());
String ret = "";
if(input!=null){
for( int c = input.read(); c != -1; c = input.read() ) { //InterfaceHelper.java:695
ret = ret + String.valueOf((char)c);
}
}
if(input!=null)
input.close();
if(connection!=null)
connection.disconnect();
if(ret!=null && ret.length()>0){
return ret;
}
}catch(Exception e) {
e.printStackTrace();
}
这是我得到的例外
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:554)
at sun.security.ssl.InputRecord.read(InputRecord.java:509)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.net.www.http.ChunkedInputStream.fastRead(ChunkedInputStream.java:244)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:689)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3053)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3047)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3035)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at com.lsa.akosha.util.InterfaceHelper.hitApiBrandWatch(InterfaceHelper.java:695)
at com.lsa.akosha.service.brand.BrandCronService.brandSentiments(BrandCronService.java:288)
at com.lsa.akosha.util.thread.BrandWatchCronConverse.executeInternal(BrandWatchCronConverse.java:60)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
也许这只是怪癖,但我在你的帖子中发现了一些“奇怪”的东西。
- 您使用 SSL 连接(如堆栈跟踪中所示),但在提供的示例中,这根本不是 HTTPS。
- application/x-www-form-urlencoded 标头通常与 POST 请求一起使用。对此的完整解释请阅读here https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
我只是说这在某种程度上可能会产生误导。
现在关于问题本身。
总而言之 - 连接重置意味着由于某种原因客户端和服务器之间的连接被破坏。例如,服务器决定关闭连接。
这里的调试过程可能非常棘手,所以如果我是你,
我会尝试几种技术,具体取决于您正在工作的环境:
删除 SSL 并使用纯 HTTP。这样您就可以在中间放置代理并更好地分析网络流量。像这样的东西Burp http://portswigger.net/burp/可以在这里提供帮助。
尝试消除某些防火墙/代理/任何东西因其自身原因而转储连接的可能性。也许值得在与服务器相同的机器上运行此代码(当然,如果它是一个可行的选项),只是为了测试它如何与“localhost”一起工作,你知道。
我不太熟悉这个相当低级的 API,但知道它的所有怪癖。
但也许您可以使用 HttpClient 来代替,这样您可能就不需要知道所有“低级”标志,也许那里出了问题。
希望这可以帮助
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)