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

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. 要通过多种途径进行测试,便于发现存在的问题。






评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值