一、 java.net.BindException:Address already in use:JVM_Bind
該異常發(fā)生在服務(wù)器端進(jìn)行 new ServerSocket(port)(port 是一個(gè) 0-65536 的整型值)操作時(shí)。異常的原因是因?yàn)榕c Tcp port 一樣的端口已經(jīng)被占用與監(jiān)聽。此時(shí)用 netstat –an 或者 lsof -i:port 命令,可以看到一個(gè) Listeding 狀態(tài)的端口。出現(xiàn)這種情況的原因可能有下面幾種
1、Tcp port 范圍太小
可以把 tcp 的 port 范圍改成 65535
net.ipv4.ip_local_port_range= 0 65535
2 、大量的 tcp 連接堆積在 timewait 狀態(tài),導(dǎo)致新的連接沒有端口可用
可以開啟端口復(fù)用net.ipv4.tcp_tw_reuse = 1
或調(diào)整 timewait 閾值net.ipv4.tcp_max_tw_buckets
二、java.net.SocketException: Connection refused: connect
異常原因是ip地址的機(jī)器找不到,或者是該ip存在但找不到指定的端口
1、檢查客戶端的 ip 和 port 是否寫錯(cuò)了
2、從客戶端 ping 服務(wù)器看是否能 ping 通
3、看服務(wù)器端的監(jiān)聽程序是否啟動
三、java.net.SocketException: Socket is closed
該異常在客戶端和服務(wù)器均可能發(fā)生。原因是己方主動關(guān)閉了連接后(調(diào)用了 Socket 的 close 方法)又試圖對網(wǎng)絡(luò)連接進(jìn)行讀寫操作
四、java.net.SocketException Connection reset 與
Connect reset by peer:Socket write error
一端退出,但退出時(shí)并未調(diào)用 close 方法,另一端如果繼續(xù)從連接中讀數(shù)據(jù)則拋出異常 Connection reset
一端 Socket 被關(guān)閉(主動關(guān)閉或因?yàn)楫惓M顺龆痍P(guān)閉),另一端仍發(fā)送數(shù)據(jù),發(fā)送的第一個(gè)數(shù)據(jù)包引發(fā)異常 Connect reset by peer
關(guān)閉的原因大概有如下幾種
1、請求服務(wù)器數(shù)據(jù)的時(shí)候,服務(wù)器突然掛了
2、請求服務(wù)器數(shù)據(jù)的時(shí)候,強(qiáng)行手動停止連接
3、處理的報(bào)文過大,超出了接收緩沖區(qū)的尺寸,導(dǎo)致數(shù)據(jù)包丟失
4、處理時(shí)間過長,觸發(fā) tomcat 超時(shí)直接結(jié)束進(jìn)程
5、tcp 重試次數(shù)過多,直接觸發(fā) socket 連接中斷
解決的思路:一是增加接收緩沖區(qū)的空間,二是增加 tomcat 和 tcp的超時(shí)時(shí)間
tcp_wmem【接收緩沖區(qū)】
tcp_rmem【發(fā)送緩沖區(qū)】
tcp_mem【tcp 內(nèi)存】
net.ipv4.tcp_fin_timeout【fin 超時(shí)時(shí)間】