一、 java.net.BindException:Address already in use:JVM_Bind
該異常發(fā)生在服務(wù)器端進行 new ServerSocket(port)(port 是一個 0-65536 的整型值)操作時乳蓄。異常的原因是因為與 Tcp port 一樣的端口已經(jīng)被占用與監(jiān)聽咪橙。此時用 netstat –an 或者 lsof -i:port 命令,可以看到一個 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地址的機器找不到,或者是該ip存在但找不到指定的端口
1耻煤、檢查客戶端的 ip 和 port 是否寫錯了
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ò)連接進行讀寫操作
四攘已、java.net.SocketException Connection reset 與
Connect reset by peer:Socket write error
一端退出,但退出時并未調(diào)用 close 方法怜跑,另一端如果繼續(xù)從連接中讀數(shù)據(jù)則拋出異常 Connection reset
一端 Socket 被關(guān)閉(主動關(guān)閉或因為異常退出而引起關(guān)閉)样勃,另一端仍發(fā)送數(shù)據(jù),發(fā)送的第一個數(shù)據(jù)包引發(fā)異常 Connect reset by peer
關(guān)閉的原因大概有如下幾種
1性芬、請求服務(wù)器數(shù)據(jù)的時候峡眶,服務(wù)器突然掛了
2、請求服務(wù)器數(shù)據(jù)的時候植锉,強行手動停止連接
3辫樱、處理的報文過大,超出了接收緩沖區(qū)的尺寸汽煮,導(dǎo)致數(shù)據(jù)包丟失
4搏熄、處理時間過長棚唆,觸發(fā) tomcat 超時直接結(jié)束進程
5暇赤、tcp 重試次數(shù)過多,直接觸發(fā) socket 連接中斷
解決的思路:一是增加接收緩沖區(qū)的空間宵凌,二是增加 tomcat 和 tcp的超時時間
tcp_wmem【接收緩沖區(qū)】
tcp_rmem【發(fā)送緩沖區(qū)】
tcp_mem【tcp 內(nèi)存】
net.ipv4.tcp_fin_timeout【fin 超時時間】