1. 程式人生 > >”Connection reset by peer“引發的思考

”Connection reset by peer“引發的思考

  閒來無事,把之前寫的一個遊戲伺服器框架(《一個java頁遊伺服器框架》),部署到阿里雲伺服器上,測試運行了下,結果看到後臺log中打印出了“Connection reset by peer”。出於好奇疑問就查了一下相關資料,網上說一般有這幾種:

  ①:伺服器的併發連線數超過了其承載量,伺服器會將其中一些連線Down掉;

  ②:客戶關掉了瀏覽器,而伺服器還在給客戶端傳送資料;

  ③:瀏覽器端按了Stop

  但是這幾種都可以排除,剛搭建的伺服器,就我測試連線了下不可能超過負載,而且我這是tcp長連線與瀏覽器沒半點關係。後來問了一些大神才知道,一個連線如果長時間不用防火牆或者路由器就會給你斷開,於是就會列印如上異常。現實中的解決方法就是,客戶端定時向伺服器傳送心跳包。才知道心跳包原來還有這個作用,說來甚是慚愧啊。

  說到了心跳包自然又想到了另一個功能。客戶端斷電等一些列強制連線斷開的情況,可以通過心跳包機制,讓伺服器端及時知道連結斷開,從而及時清除這些無法使用的連結屍體。反過來說,如果沒有心跳包,那麼客戶端強制斷開,伺服器是無法及時捕獲到連結斷開的事件的。然而在我測試下,強制關閉客戶端,伺服器端是會丟擲異常的(我的這個框架使用了mina,客戶端強制斷開後,會呼叫對應的exceptionCaught方法丟擲異常,然後又呼叫sessionClosed關閉連線)。既然伺服器會丟擲異常,自然我們不用通過心跳包,伺服器端也能及時知道客戶端連線斷開的情況。

  懷著強烈的好奇心就做了如下測試,由於java網路程式設計有bio和nio以及最新的aio,對於AIO,成產環境中我還沒有接觸到又用這個的,所以暫不做測試,就針對BIO和NIO做測試

      (以下程式碼比較簡單,就不做解釋了。僅僅用於測試我的疑惑,某些不合理的地方也就不必在意了)

  BIO測試程式:

    伺服器端測試程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 publicclassBIOServer { publicstaticvoidmain(String[] args)throwsUnsupportedEncodingException {
byte[] datas="hello".getBytes("UTF-8"); try{ ServerSocket ss =newServerSocket(810); while(true){ Socket s = ss.accept(); OutputStream os = s.getOutputStream(); os.write(datas); } }

相關推薦

Connection reset by peer引發思考

  閒來無事,把之前寫的一個遊戲伺服器框架(《一個java頁遊伺服器框架》),部署到阿里雲伺服器上,測試運行了下,結果看到後臺log中打印出了“Connection reset by peer”。出於好奇疑問就查了一下相關資料,網上說一般有這幾種:   ①:伺服器的併發連線數超過了其承載量,

thrift java.io.IOException: Connection reset by peer引發的oom

server 退出前的異常log資訊: [2015-06-20 10:45:56,713 WARN] Got an IOException in internalRead! java.io.IOException: Connection reset by peer at sun.

LR回放https協議腳本失敗:[GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX" failed:[10054] Connection reset by peer [MsgId:MERR-27780]

網絡連接 advance sgid 服務器 vuser con run load sgi 最近做一個負載均衡項目的性能測試,使用LR錄制腳本協議為https協議,回放腳本時出現報錯: [GENERAL_MSG_CAT_SSL_ERROR]connect to host "

CentOS7使用ssh不能登錄,報錯:Read from socket failed: Connection reset by peer

read from socket failed: connection reset by peer使用xshell登錄CentOS7,不能登錄,使用另外一臺Linux主機,telent 22端口是同的,ssh連接報以下錯誤:Read from socket failed: Connection reset b

ECS雲主機SSH連接提示“Connection reset by peer”的解決辦法和解決思路

阿裏雲 運維思想 工單支持 三周前剛從上家公司換到新的公司,這家公司與上家公司相比對阿裏雲的雲計算環境更加的依賴,使用的ECS實例和其他服務如SLB、RDS、OSS等更多了一個數量級。這篇文章的背景就是為了解決阿裏雲ECS雲主機SSH連接的一個問題,從故障發現到故障排除到最後反思的一個詳細

CentOS7 yum的一次報錯" 14: curl#56 - "Recv failure: Connection reset by peer" "

yum1、故障現象[[email protected]/* */ src]# yum update Loaded plugins: fastestmirror, langpacks Could not retrieve mirrorlist 7&arch=x86_64&repo

connection reset by peer, socket write error問題分析

getc 主動 連接 返回 知識 可能 -- 成功 connect 上次寫《connection reset by peer, socket write error問題排查》已經過去大半年,當時把問題“敷衍”過去了。 但是此後每隔一段時間就會又想起來,baidu、googl

connection reset by peer問題總結及解決方案

net 方維 catch 火墻 tst buffer 整理 pos 在服務器 找遍了 中英文網站,翻遍了能找的角落,發現了出現故障的原因和原理,及改如何處理,這裏記錄下,希望能幫助到有需要的小夥伴,少走點彎路, 以上就整理內容: connection res

Connection reset by peer的常見原因

路由 可能 tcp 個數 exc 時間 ... 連接 tst 1,如果一端的Socket被關閉(或主動關閉,或因為異常退出而 引起的關閉),另一端仍發送數據,發送的第一個數據包引發該異常(Connect reset by peer)。 Socket默認連接60秒,60秒之內

jumpserver開源跳板機用戶鏈接的時候終端顯示connection reset by peer

過去 客戶 跳板 鏈接 賬號 ica -- 映射 con 我們使用賬號鏈接的時候,在終端頁面顯示“connection reset by peer”,然後我們去看日誌信息,會顯示“FAILED: Authentication failed.FAILED: Authentic

Connection reset by peer原理解析

“Connection reset by peer”代表什麼?“Connection reset by peer”表示當前伺服器接受到了通訊對端傳送的TCP RST訊號,即通訊對端已經關閉了連線,通過RST訊號希望接收方關閉連線。 The remote server has sent you a RST p

ssh連線遠端伺服器:ssh_exchange_identification: read: Connection reset by peer

查閱資料這是伺服器超過使用者最大連線數,雲伺服器後臺遠端連線修改一下自動連線數: ----> -----> 輸入密碼遠端連線之後: 進入usr目錄,然後輸入:  vi /etc/ssh/sshd_config  按i編輯,修改這個引

Filebeat - Logstash connection reset by peer

2018-09-25T14:21:41.821+0800 ERROR logstash/async.go:252 Failed to publish events caused by: write tcp 127.0.0.1:45718->127.0.0.1:5044: write:

suse ssh連線拒絕,報錯 ssh_exchange_identification: read: Connection reset by peer

   操作報錯現象,ssh遠端伺服器,提示ssh_exchange_identification: read: Connection reset by peer  ,但是能夠ping的通  執行ssh -v [email protected]&n

下載標準庫libcxx出現svn: E000104: Error running context: Connection reset by peer的解決方案

使用svn co http://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_500/final libcxx下載標準庫libcxx出現svn: E000104: Error running context: Connection reset b

docker exec failed!!error from pipe caused \"read parent: connection reset by peer\"問題

一、復現報錯: docker exec -it  wsqtest  bash rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container p

Redis連接出現Error: Connection reset by peer的問題是由於使用Redis的安全模式

現在網上一查出現安全模式的連線,基本都是要關閉服務端的操作,其實這種方式是不正確的,最有效的解決方式是使用stunnel進行安全模式的連線。 我碰到的問題是微軟雲(其實我不想用!)連線Redis,預設採用6380做為SSL埠,而微軟雲同時還會啟用非SSL埠6379,如果嫌其麻煩,可以用非SSL進行連線。

Java.io.IOException: Connection reset by peer問題定位

相信不少兄弟都碰到過這類問題。很不幸,今天本人負責的一個系統突然大量出現該類錯誤,本身系統沒有做修改。 一般第一眼看到這類錯誤基本上就可以確定是本系統作為服務端跟客服端的長鏈斷了並進行了重連,但是是跟那條鏈路呢?由於報錯中一點鏈路資訊都沒帶,就僅僅丟擲了一個異常給問題定位帶

從tcp原理角度理解Broken pipe和Connection Reset by Peer的區別

以前我們經常會碰到Broken pipe或者Connection reset by peer之類的異常,但是tcp實現裡什麼情況下會丟擲這些異常呢,以前我給對方的回答都是模稜兩可的,自己說實話都沒把握,因為自己也沒有驗證過,對它們的認識都是從網上看來的,正確與否也不知道,昨天

Android Retrofit Post請求引數長度限制問題 retrofit sendto failed: ECONNRESET (Connection reset by peer)

retrofit sendto failed: ECONNRESET (Connection reset by peer)【android客戶端Post請求引數長度限制(引數過大)】解決辦法   一、問題的出現 post請求後臺,當引數字元太長超過900字時會報sendto