創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
今天就跟大家聊聊有關(guān)深入淺析java中connection reset 的異常處理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
在Java中常看見的幾個connection rest exception, Broken pipe, Connection reset,Connection reset by peer
Socked reset case
Linux中會有2個常見的sock reset 情況下的錯誤代碼
ECONNRESET
該錯誤被描述為“connection reset by peer”,即“對方復(fù)位連接”,這種情況一般發(fā)生在服務(wù)進(jìn)程較客戶進(jìn)程提前終止。當(dāng)服務(wù)進(jìn)程終止時會向客戶 TCP 發(fā)送 FIN 分節(jié),客戶 TCP 回應(yīng) ACK,服務(wù) TCP 將轉(zhuǎn)入 FIN_WAIT2 狀態(tài)。此時如果客戶進(jìn)程沒有處理該 FIN (如阻塞在其它調(diào)用上而沒有關(guān)閉 Socket 時),則客戶 TCP 將處于 CLOSE_WAIT 狀態(tài)。當(dāng)客戶進(jìn)程再次向 FIN_WAIT2 狀態(tài)的服務(wù) TCP 發(fā)送數(shù)據(jù)時,則服務(wù) TCP 將立刻響應(yīng) RST。一般來說,這種情況還可以會引發(fā)另外的應(yīng)用程序異常,客戶進(jìn)程在發(fā)送完數(shù)據(jù)后,往往會等待從網(wǎng)絡(luò)IO接收數(shù)據(jù),很典型的如 read 或 readline 調(diào)用,此時由于執(zhí)行時序的原因,如果該調(diào)用發(fā)生在 RST 分節(jié)收到前執(zhí)行的話,那么結(jié)果是客戶進(jìn)程會得到一個非預(yù)期的 EOF 錯誤。此時一般會輸出“server terminated prematurely”-“服務(wù)器過早終止”錯誤。
EPIPE
錯誤被描述為“broken pipe”,即“管道破裂”,這種情況一般發(fā)生在客戶進(jìn)程不理會(或未及時處理)Socket 錯誤,繼續(xù)向服務(wù) TCP 寫入更多數(shù)據(jù)時,內(nèi)核將向客戶進(jìn)程發(fā)送 SIGPIPE 信號,該信號默認(rèn)會使進(jìn)程終止(此時該前臺進(jìn)程未進(jìn)行 core dump)。結(jié)合上邊的 ECONNRESET 錯誤可知,向一個 FIN_WAIT2 狀態(tài)的服務(wù) TCP(已 ACK 響應(yīng) FIN 分節(jié))寫入數(shù)據(jù)不成問題,但是寫一個已接收了 RST 的 Socket 則是一個錯誤。
Java 中的socket input stream/output stream 的處理
先看代碼片段
SocketInputStream.c
switch (errno) { case ECONNRESET: case EPIPE: JNU_ThrowByName(env, "sun/net/ConnectionResetException", "Connection reset"); break; ....