Tomcat连接拒绝的原因
1.java.net.SocketTimeoutException: 连接超时或读取超时
连接超时: Socket.connect 超时,网络不稳定造成
读取超时:Socket.read 超时,可能由于下游服务响应时间长造成
2.java.net.BindException:Address already in use: JVM_Bind
端口被占用(服务端)
new ServerSocket(port) 或者 Socket.bind 函数时,端口被占用,抛出这个异常。
netstat -an 查看端口占用情况,选择未被占用的端口
Proto | Recv-Q | Send-Q | Local Address | Foreign Address | (state) |
---|---|---|---|---|---|
tcp4 | 0 | 0 | ip.port | ip2.port2 | SYN_SENT |
3.java.net.ConnectException:Connection refused:connect
连接被拒绝(客户端)
new Socket(ip,port) 或者 Socket.connect 时可能会抛出异常
原因:a) 未找到ip地址对应的机器 b) 机器未开启指定的监听端口
方法:a) 客户端ping一下ip b) 能ping通,查看服务是否崩溃
4.java.net.SocketException:Socket is closed
连接已关闭
原因:通信一方主动关闭Socket连接:调用Socket.close,接着又进行读写操作。
5.java.net.SocketException:Connection reset/Connect reset by peer:Socket write error
连接被重置
原因:a) 通信一方已将Socket关闭(主动关闭或异常退出),另一方还在写数据,抛出(Connect reset by peer)
b) 对方尝试从TCP连接中获取数据,抛出(Connection reset)
方法:a) 程序退出前主动关闭所有网络连接
b) 检测通信的另一方的关闭连接操作,当发现另一方关闭连接后自己也要关闭该连接
6.java.net.SocketException:Broke pipe
通信管道已坏
原因:通信的一方收到Connect by peer:Socket write error 后,再继续写数据会抛出次异常
7.java.net.SocketException:Too many open files
进程打开文件数超过限制
原因:并发用户数比较大时,服务器可能会报这个异常,每创建一个Socket连接,需要一个文件句柄,此外服务器程序处理请求时可能也会打开一些文件。
解决方案:a) lsof -p pid 查看进程打开了哪些文件,是不是有资源泄漏(文件没有及时被关闭)
b) 没有资源泄漏,可以通过设置最大文件句柄数。 ulimit -a 查看 系统资源限制,ulimit -n ${fileNums} 修改最大文件数
极客时间学习笔记