2018-03-15更新:弄明白connection reset產生的緣由,見從新分析connection reset by peer, socket write error錯誤緣由html
在開發文件上傳功能時遇到了connection reset by peer, socket write error的錯誤,排查廢了一番功夫,記錄一下。apache
在網上搜索了一下,獲得的緣由有這些:瀏覽器
可是看了服務器,不太可能;網絡情況了也挺好(測試環境而已)。
跟瀏覽器也不要緊,由於這裏上傳文件使用的是apache httpclient在上傳文件,並且timeout都設置比較長。服務器
最後分析到的問題緣由,出在服務端上。服務端是這麼處理的:上傳文件時在header裏含有了文件信息,上傳文件成功,記錄文件相關信息在DB;若是再次上傳這個文件,根據header的文件信息在DB判斷是否已經上傳,若是確認是重複文件,則直接返回「文件重複」。(這個業務設計有點bug,暫時忽略)網絡
可是如今卻遇到重複上傳時,客戶端httpclient報了「connection reset by peer, socket write error」的錯誤。併發
是因爲在重複上傳時,服務端只取了header就判斷了文件重複直接response了,這個時候客戶端還在「歡快」的傳輸文件呢,而服務端直接response把鏈接關閉了,因此客戶端就懵逼了,報了錯誤。socket
這個問題暫時尚未找到技術上如何解決(若是找到,後面再補充),因此在業務上進行解決的。在客戶端遇到SocketException時,嘗試從新上傳前,先查詢服務端是否已經完成了此文件的上傳,若是已經存在,則不用重複上傳了,也就能夠避免由於重複上傳致使的問題,畢竟重複上傳也是爲了保證在網絡不佳時能補償。測試