Java使用HttpURLConnection请求异常:java.net.SocketException: Software caused connection abort: recv failed

时间:2022-11-15 23:57:49

java.net.SocketException: Software caused connection abort: recv failed根据异常信息来看是SocketException,我搜了下这个异常信息的解决方案,几乎没有能解决我遇到的这个问题的方案,主要的方案都是说,要使用一个while(true)的循环,在循环内部,进行判断,如果当前的inputStream的available()方法返回的值大于零表示服务端响应了,但是如果等于零表示服务端没响应,这里的解决方式,我认为和没解决一样,这里只是避免了异常的产生,也就是只保证了输出的时候不是输出异常信息,而是输出自定义的信息,但是根本上的问题依旧是没有解决。



一开始把主要精力放在了上面所说的解决方式上,我以为是服务端断开连接导致inputStream输入流获取失败导致的,一直到半夜也没找到问题在哪里,第二天早晨Debug了一遍发现我的程序是在打开连接的时候失败了,hashCode=-1,然后导致后面程序在获取流的时候也失败,最终导致获取数据的时候抛出异常信息:

java.net.SocketException: Software caused connection abort: recv failed




我的原因是,拼接好的URL字符串中间有空格,尤其日期格式的数据,在格式化的时候往往会使用yyyy-MM-dd HH:mm:ss这样的格式,一般中间是保留了一个空格的,这个时候需要主要一下,隐含的空格在里面了,在格式化的时候,最好直接将空格处填充为%20,在浏览器中,空格一般会直接被转义为%20的,但是我们自己写的这种请求中往往会忽略这个问题,以至于,这个URL本身就是错误的,当你用这个URL去打开连接的时候,就会因为URL的问题(URL中的格式和协议中规定的格式不一致)导致无法获得连接。后面自然会发生一系列的异常问题。


注意:说到这里,当你的URL中存在中文的时候,注意将中文的部分进行编码。


下面是部分的代码:

            URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
connection = realUrl.openConnection();
connection.setConnectTimeout(30000);
connection.setReadTimeout(30000);

// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();

// 定义 BufferedReader输入流来读取URL的响应
InputStream inputStream = connection.getInputStream();

in = new BufferedReader(new InputStreamReader(
inputStream));

String line;
while (true) {
if((line = in.readLine()) != null)
result += line;
else
break;

}

我不敢保证这一定是您遇到的问题,不过也是实际会发生的情况之一,希望对于看到这篇博客的读者来说,可以有所用处。


总结一下:

1. 遇到问题直接Debug运行,看到底是哪一步出现的问题。

2. 找导致Bug的根本原因,尽量避免异常是必要的,但是根本原因我认为是最终的目的。

3. 要通过多种途径进行测试,便于发现存在的问题。