環境為Socket服務端和對應客戶端以及一個安卓客戶端
現在服務端運行一段時間后出現客戶端連接不上服務端情況,有時徹底連不上,有時過5/6分鐘左右新的客戶端能連上,重啟服務端恢復正常。
客戶端數量大概在1-100之間
現在懷疑是資源不夠用,但客戶端斷開的時候也shutdown和close了,而且這連接數已經很少了應該不至于才對,想不到問題點在哪兒了
uj5u.com熱心網友回復:
好好檢查程式 buguj5u.com熱心網友回復:
現在問題不好復現,自己本地測驗模擬服務端和客戶端(不包括安卓客戶端)測驗都能正常,連接量上去也能正常uj5u.com熱心網友回復:
那還是“本地測驗”沒下功夫。uj5u.com熱心網友回復:
服務器針對一些無效的連接 ,也要及時的釋放資源的,如將物件dispose 或 null。也可以使用心跳包 來判斷該鏈接是否有效。超過多長時間,沒有通訊 就自動關閉連接。uj5u.com熱心網友回復:

句柄泄漏了。
偷懶就搞個守護重啟。
不偷懶就仔細回收資源。
uj5u.com熱心網友回復:
服務端別說接入1個或者100個客戶端,就算是同時接入上萬個客戶端請求也沒啥。而當客戶端斷掉的時候,服務器端是會收到客戶端中斷的通知,或者至少你可以每隔幾分鐘給客戶端發一個心跳來判斷。這都是比較標準的架構點。我從來沒有遇到說“客戶端然后就連不上服務器了”的機制,遇到這個可以百分之一千地知道,是代碼寫飄了。uj5u.com熱心網友回復:
至少在當前有問題階段,你應該在客戶端和服務器端分別寫日志檔案或往資料庫寫記錄資訊,哪個ip或什么用戶什么時間登陸和退出了,看看服務器沒收到socket關閉有什么規律沒。比較保險的方式是你客戶端關閉連接前給服務端發個專門的關閉命令訊息然后再關閉,服務端收到關閉命令訊息如果10秒內沒收到socket關閉,就主動進行關閉。服務端關閉socket后,也要把相應的資源釋放掉
uj5u.com熱心網友回復:
服務端代碼是怎么寫的?如果只是按照 MSDN 上的例子使用阻塞模式來寫,那么并發能力是很差的。使用 IOCP 模式會好很多。uj5u.com熱心網友回復:
建議不要直接用裸tcp協議進行通訊,你hold不住的.Http協議
Modbus協議
Mqtt協議
.....
等等現有的協議均已經處理好了各種例外的處理,站在巨人肩上吧,那些連接管理,心跳,斷包,粘包,資料可達性等問題,你都可以不用管了,只用你的關鍵業務邏輯.
你折騰一輩子,可能也就是重復造了幾個輪子,而且不一定比現有的圓.
uj5u.com熱心網友回復:
這個簡單,把代碼精簡到最精簡,然后再做連接測驗,如果沒有問題再慢慢豐滿代碼。有時候這個辦法在搞不清楚問題的時候,特別有效
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/9857.html
標籤:C#
上一篇:C# UI呼叫問題
