一、 java.net.BindException:Address already in use:JVM_Bind
该异常发生在服务器端进行 new ServerSocket(port)(port 是一个 0-65536 的整型值)操作时。异常的原因是因为与 Tcp port 一样的端口已经被占用与监听。此时用 netstat –an 或者 lsof -i:port 命令,可以看到一个 Listeding 状态的端口。出现这种情况的原因可能有下面几种
1、Tcp port 范围太小
可以把 tcp 的 port 范围改成 65535
net.ipv4.ip_local_port_range= 0 65535
2 、大量的 tcp 连接堆积在 timewait 状态,导致新的连接没有端口可用
可以开启端口复用net.ipv4.tcp_tw_reuse = 1
或调整 timewait 阈值net.ipv4.tcp_max_tw_buckets
二、java.net.SocketException: Connection refused: connect
异常原因是ip地址的机器找不到,或者是该ip存在但找不到指定的端口
1、检查客户端的 ip 和 port 是否写错了
2、从客户端 ping 服务器看是否能 ping 通
3、看服务器端的监听程序是否启动
三、java.net.SocketException: Socket is closed
该异常在客户端和服务器均可能发生。原因是己方主动关闭了连接后(调用了 Socket 的 close 方法)又试图对网络连接进行读写操作
四、java.net.SocketException Connection reset 与
Connect reset by peer:Socket write error
一端退出,但退出时并未调用 close 方法,另一端如果继续从连接中读数据则抛出异常 Connection reset
一端 Socket 被关闭(主动关闭或因为异常退出而引起关闭),另一端仍发送数据,发送的第一个数据包引发异常 Connect reset by peer
关闭的原因大概有如下几种
1、请求服务器数据的时候,服务器突然挂了
2、请求服务器数据的时候,强行手动停止连接
3、处理的报文过大,超出了接收缓冲区的尺寸,导致数据包丢失
4、处理时间过长,触发 tomcat 超时直接结束进程
5、tcp 重试次数过多,直接触发 socket 连接中断
解决的思路:一是增加接收缓冲区的空间,二是增加 tomcat 和 tcp的超时时间
tcp_wmem【接收缓冲区】
tcp_rmem【发送缓冲区】
tcp_mem【tcp 内存】
net.ipv4.tcp_fin_timeout【fin 超时时间】