性能測試中的SocketException異常與解決方案

一、 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í)間】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容