簡體   English   中英

套接字服務器設計建議

[英]Sockets server design advice

我們正在用C#編寫套接字服務器,需要有關設計的一些建議。

背景:客戶端(通過移動設備)連接到我們的服務器應用程序,並且我們保持其套接字處於打開狀態,因此我們可以在需要時向其發送數據。 數據量各不相同,但我們通常每隔幾秒鍾就從每個客戶端發送/接收一次數據,因此它非常密集。 同時連接的數量范圍可以從50-500(將來還會更多)。

我們已經使用異步套接字編寫了一個服務器應用程序,並且可以運行,但是遇到了一些絆腳石,我們需要確保我們正在做的事情是正確的。

我們有一個保存客戶狀態的集合(目前我們沒有套接字/連接池,對吧?)。

每次客戶端連接時,我們都會創建一個套接字,然后等待它們向我們發送一些數據,然后在receiveCallBack中,將其clientstate對象添加到我們的連接字典中(一旦我們驗證了他們是誰)。

當客戶端對象退出時,我們將關閉其套接字,然后將其關閉,並將其從客戶端字典集合中移除。

大概一切都以正確的順序發生,一切都按預期工作。

但是,幾乎每天它都停止接受連接,或者我們認為,要么是它要么連接,但實際上並沒有做任何事,因此我們無法弄清為什么它只是停止了。

我們不確定的幾件事

1)我們是否應該創建某種類型的連接池,而不只是客戶端套接字的字典

2)連接的套接字會發生什么,但隨后沒有添加到我們的字典中,它們只是在內存中徘徊而無所事事,我們是否應該創建一個能在創建套接字后立即保存套接字的另一個字典?

3)查找客戶端是否不再連接的最佳方法是什么? 我們已經閱讀了許多方法,但是我們不確定使用哪種最佳方法,發送數據或讀取數據,如果可以的話,該怎么辦?

4)如果我們遍歷連接字典以檢查已處置的客戶端,我們是否應該鎖定字典,如果這樣,這會對嘗試同時使用它的其他客戶端對象有什么影響,它會拋出錯誤還是只是等待?

5)我們經常會在隨機時間在ReceiveCallBack方法中獲得處置套接字異常,這是否意味着我們可以安全地從集合中刪除該套接字?

我們似乎找不到任何生產類型的示例來說明上述工作。

任何建議將不勝感激

4)是的,將其鎖定。 其他線程將只需要等待。

通常,您必須在每次訪問(包括讀取)時鎖定字典。 否則,結構可能會損壞,這可能是導致問題的原因之一。

Daryn Kiely 撰寫了一篇有關.NET中套接字編程好文章 ,我認為它回答了您的幾個問題。 它提供了一些良好的背景以及客戶端和服務器實現的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM