connection reset by peer, socket write error問題排查

2018-03-15更新:弄明白connection reset產生的緣由,見從新分析connection reset by peer, socket write error錯誤緣由html

在開發文件上傳功能時遇到了connection reset by peer, socket write error的錯誤,排查廢了一番功夫,記錄一下。apache

在網上搜索了一下,獲得的緣由有這些:瀏覽器

  1. 服務器的併發鏈接數超過了其承載量,服務器會將其中一些鏈接Down掉;
  2. 客戶關掉了瀏覽器,而服務器還在給客戶端發送數據;
  3. 瀏覽器端按了Stop;

可是看了服務器,不太可能;網絡情況了也挺好(測試環境而已)。
跟瀏覽器也不要緊,由於這裏上傳文件使用的是apache httpclient在上傳文件,並且timeout都設置比較長。服務器

最後分析到的問題緣由,出在服務端上。服務端是這麼處理的:上傳文件時在header裏含有了文件信息,上傳文件成功,記錄文件相關信息在DB;若是再次上傳這個文件,根據header的文件信息在DB判斷是否已經上傳,若是確認是重複文件,則直接返回「文件重複」。(這個業務設計有點bug,暫時忽略)網絡

可是如今卻遇到重複上傳時,客戶端httpclient報了「connection reset by peer, socket write error」的錯誤。併發

是因爲在重複上傳時,服務端只取了header就判斷了文件重複直接response了,這個時候客戶端還在「歡快」的傳輸文件呢,而服務端直接response把鏈接關閉了,因此客戶端就懵逼了,報了錯誤。socket

這個問題暫時尚未找到技術上如何解決(若是找到,後面再補充),因此在業務上進行解決的。在客戶端遇到SocketException時,嘗試從新上傳前,先查詢服務端是否已經完成了此文件的上傳,若是已經存在,則不用重複上傳了,也就能夠避免由於重複上傳致使的問題,畢竟重複上傳也是爲了保證在網絡不佳時能補償。測試

相關文章
相關標籤/搜索