JAVA项目中常见的网络异常

1、 java.net.SocketTimeoutException: Read timed out

SocketTimeoutException是jdk中的异常,继承于java.io.InterruptedIOException;表示套接字读取或接受时发生超时。

触发场景

用一张图片说明
在这里插入图片描述
虽然报文(“abc”)返回总共用了6秒,如果SocketTimeout设置成4秒,实际程序执行的时候是不会抛出java.net.SocketTimeoutException: Read timed out异常的。
因为SocketTimeout的值表示的是“a”、”b”、”c”这三个报文,每两个相邻的报文的间隔时间不能超过SocketTimeout。

原因及解决方法

httpclient作为http工具包,是基于socket的封装,所以httpclient的connectTimeout、socketTimeout到底层都是socket的connectTimeout、socketTimeout。
首先看一下java api中对connectTimeout、socketTimeout的解释
socket的connect方法
使用指定的超时值将此套接字连接到服务器。零超时被解释为无限超时。然后连接将被阻塞,直到建立或发生错误。意思就是说,建立链接的最大时间,也就是完成三次握手,建立tcp链接所用的时间。
socket的setSoTimeout方法
以指定的超时时间(以毫秒为单位)。通过将此选项设置为非零超时,与此套接字关联的InputStream上的read()调用将仅在此时间量内阻塞。如果超时到期,则尽管Socket仍然有效,但会引发java.net.SocketTimeoutException。在进入阻止操作之前,必须启用选项。超时时间必须大于0。如果是0则是无限时间。
解决方法:
a.增大超时时长
b.去掉超时时长配置
c.异常打印输出不抛出

2、org.apache.http.conn.HttpHostConnectException

触发场景

这个异常是HttpClient中的异常,继承了jdk中ConnectException异常,当然也就继承了SocketException
引起这个异常的原因有 Connection to refused;或者 Connection timed out;

原因及解决方法

Connection to refused:抛出此类异常,表示无法连接,也就是说当前主机不存在,或者是因为某些权限的原因拒绝链接;
如果提示 Connection timed out:一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 个 超 时 参 数 由connect(SocketAddress endpoint,int timeout) 中的后者来决定,还有就是 setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成 0 均表示无限大。
解决方法就是检查网络,设置符合当前业务场景的超时时间。

3、org.apache.catalina.connector.ClientAbortException java.io.IOException: Broken pipe

触发场景

此异常是tomcat中的异常,继承于IOException。源码中解释:它是包装一个IOException,将其标识为由远程客户端的请求中止引起的异常。

原因及解决方法

产生这个异常的原因说白了就是由于远程客户端的请求终止了,但是这时候服务器响应流还没有输出完全。
浏览器端去解决,提高和后端连接的时间;tomcat去做优化配置;或者nignx去优化修改。
JAVA处理办法:增加全局异常拦截,并且判断异常名称,如果每次org.apache.catalina.connector.ClientAbortException,则返回null或者其他。

4、org.apache.http.client.ClientProtocolException:xxx

此异常是HttpClient中的异常,继承于IOException,表示HTTP协议中有错误;

触发场景

有可能是由于重定向到了一个达不到的网站,或者是Content-type=0导致。具体要分析冒号后的
第二段信息,还有由于重定向导致的

原因及解决方法

产生这个异常的原因有各种各样,但是统归就是HTTP请求协议格式不正确导致的,违反了Http协议规范。
原因一:Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity。
根据这个异常提示"Cannot retry request with a non-repeatable request entity."可以确定抛出异常的原因是程序中使用了不可重复的请求实体(non-repeatable request entity)。
HttpClient有ByteArrayBody、FileBody、InputStreamBody和StringBody四种Body。其中只有用InputStreamBody构建multipartEntity才是non-repeatable entity。最后,使用ByteArrayBody代替InputStreamBody可以解决。
原因二、没有请求路径种没有http:// 或者 https:// 或者域名是null。

5、java.net.UnknownHostException

此异常是jdk中的异常,表示抛出该信号以指示无法确定主机的IP地址。

触发场景

1.服务器没网,调不到公网域名,无法解析出IP,从而无法识别host,导致无法连接;
2.网络端口映射做了策略,调用不到自己路由的域名,必须调内网IP;

原因及解决方法

问题原因可能是在系统的 /etc/Hostname中配置了主机名,而在/etc/hosts文件中没有相应的配置。
简单的解决办法是对应关系配好就可以,甚至删除/etc/Hostname这个文件也可以。
深层的原因: 在大多数Linux操作系统中,都是以/etc/hosts中的配置查找主机名的,但是某些系统用/etc/Hostname文件中的配置做主机名。

因为Web服务器没有配置和单点登录服务 域名/IP的映射关系,所以访问不到,需要在hosts文件中把接口的 IP/域名 写上,在服务器发送请求时,就会自动把域名转成IP进行调用了。
方法:打开hosts文件, C:\Windows\System32\drivers\etc\hosts (Linux中一般在:/etc/hosts)。修改hosts文件,把域名和IP写到hosts文件中,用于域名解析成IP。最后执行:ipconfig /flushdns #清除DNS缓存,刷新。(现在很多Linux发行版都没有内置DNS本地缓存,Linux不像Windows那样可以使用ipconfig /flushdns来刷新,在Linux下无需刷新,因为本身没有缓存;
当然,如果非要缓存刷新,可以安装nscd,然后刷新这个守护进程。
CentOS:
yum install -y nscd
使用:
service nscd restart 命令)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3R5hB15F-1619406365233)(http://docs.dev.com/server/…/Public/Uploads/2021-04-23/608270514472d.png)]

6、org.apache.http.conn.ConnectTimeoutException: Connect to IP:port failed: Read timed out/Connection refused

这个异常是httpclient中的异常继承了InterruptedIOException
表示连接到HTTP服务器或等待HttpConnectionManager可用连接时超时。

触发场景

网络波动
防火墙阻拦
DNS解析被污染,导致DNS解析过程无法通过域名取得正确的IP地址

原因及解决方法

指客户端和服务器建立连接读超时,就是http请求的三个阶段,一:建立连接;二:数据传送;三,断开连接。读超时后会提示Read timed out。
解决方法,增加connection的超时时间,或者检查主机dns。

7、org.apache.commons.httpclient.NoHttpResponseException

触发场景

服务器端由于负载过大等情况下

原因及解决方法

在某些情况下,通常在高负载时,web server可以接收到请求,但无法处理它们。缺乏足够的资源,如缺少工作线程。这可能会导致服务器将连接丢回到客户端,而不给予任何回应。HttpClient抛出nohttpresponseexception遇到这种情况的时候。在大多数情况下,一个方法抛出NoHttpResponseException,重试是一个安全的办法。
当服务器端由于负载过大等情况发生时,可能会导致在收到请求后无法处理(比如没有足够的线程资源),会直接丢弃链接而不进行处理。此时客户端就回报错:NoHttpResponseException。
官方建议出现这种情况时,可以选择重试。但是重试一定要限制重试次数,避免雪崩

8、java.net.ConnectException: Connection refused: connect

此异常是java种的异常继承于SocketException,表示尝试将套接字连接到远程地址和端口时发生错误。通常,远程拒绝连接(例如,没有进程在远程地址端口上侦听)。

触发场景

例如:没有进程在远程地址端口上侦听

原因及解决方法

该异常发生在客户端进行 new Socket(ip, port)或者 socket.connect(address,timeout)操作时,原因:指定 ip 地址的机器不能找到(也就是说从当前机器不存在到指定 ip 路由),或者是该 ip 存在,但找不到指定的端口进行监听。
应该首先检查客户端的 ip 和 port是否写错了,假如正确则从客户端 ping 一下服务器看是否能 ping 通,假如能 ping 通(服务服务器端把 ping 禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动。
解决办法就是检查应用端口是否有效,网络是否联通,有没有防火墙等因素。

9、java.net.SocketException: Connection reset、:connect reset by peer

java种的异常,抛出该错误以指示创建或访问Socket时出错。冒号后是原因

触发场景

网络原因导致的: Connection timed out

原因及解决方法

客户端或者服务端某一退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
Connection reset 抛出此类异常,表示一端关闭连接,而另一端此时正在读数据
Connection reset by peer  抛出此类异常,表示一端关闭连接,而另一端此时在发送数据

10、java.net.SocketException: Too many open files

java种的异常,抛出该错误以指示创建或访问Socket时出错。

触发场景

常常发生在很多个并发用户访问服务器的时候

原因及解决方法

原因: 操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。
因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。 
解决方式: 
a) 尽量把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
b) java的GC不能关闭网络连接打开的文件句柄,如果没有执行close()则文件句柄将一直存在,而不能被关闭。
也可以考虑设置socket的最大打开 数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量

11、java.net.BindException:Address already in use: JVM_Bind

触发场景

端口号被占用

原因及解决方法

该异常发生在服务器端进行newServerSocket(port)或者socket.bind(SocketAddressbindpoint)操作时。
原因:跟当前应用的port一样的一个端口已经被启动,并进行监听。此时用netstat–an命令,可以看到一个Listending状态的端口。
只需要找一个没有被占用的端口就可以解决端口号冲突问题。

12、java.io.EOFException

这个异常是java中的,继承了IOException,属于一种IO异常。表示在输入过程中意外到达文件末尾或流末尾。
此异常主要由数据输入流用来通知流结束。注意,许多其他输入操作在流的末尾返回一个特殊值,而不是引发异常。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java项目,包(package)是用来组织和管理类的一种机制。它可以将相关的类组织在一起,提供更好的可读性和维护性。每个包都代表一个命名空间,它可以包含其他包、类和接口。 包的命名通常使用逆域名(reverse domain name)的方式,以确保全局唯一性。例如,com.example.project是一个常见的包命名规范,其com是公司或组织的域名,example是项目名称,project是模块名称。 各个包通常代表不同的功能模块或层次,以下是一些常见的包的作用: 1. java.lang:Java语言的核心类库,提供了基本类型、异常处理、线程、字符串等基础功能。 2. java.util:提供了各种实用工具类,如集合框架、日期和时间、随机数生成等。 3. java.io:处理输入输出相关的类,包括文件操作、流操作等。 4. java.net:用于网络编程,提供了网络通信相关的类和接口。 5. java.awt和javax.swing:用于图形用户界面(GUI)开发,提供了窗口、组件、布局管理等。 6. java.sql:用于数据库操作,提供了访问数据库的接口和类。 7. com.example.project.controller:通常用于存放控制器类,处理用户请求和调度业务逻辑。 8. com.example.project.service:用于存放服务类,实现业务逻辑。 9. com.example.project.dao:用于存放数据访问对象(DAO),负责与数据库进行交互。 10. com.example.project.model:存放实体类、POJO(Plain Old Java Object)等数据模型。 这只是一些常见的包的示例,实际项目的包结构根据具体需求和设计进行组织。包的使用可以提高代码的可维护性和可扩展性,遵循良好的包命名规范和结构设计是一个良好的编程实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值