2010-03-30 109 views
1

我們正在用c#寫一個套接字服務器,並且需要一些關於設計的建議。套接字服務器設計建議

背景:客戶端(來自移動設備)連接到我們的服務器應用程序,我們將其套接字打開,以便我們可以在需要時將數據發回給他們。數據量有所不同,但我們通常每隔幾秒鐘就會發送/接收來自每個客戶端的數據,因此它非常密集。同時連接的數量可以在50-500之間(將來會更多)。

我們已經編寫了一個使用異步套接字的服務器應用程序,它可以工作,但是我們遇到了一些絆腳石,我們需要確保我們所做的是正確的。

我們有一個包含我們客戶端狀態的集合(我們現在沒有套接字/連接池,我們應該嗎?)。

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

當一個客戶端對象退出時,我們關閉它們的套接字,然後關閉它並將它從我們的客戶端字典集中刪除。

想必所有事情都以正確的順序發生,一切都按預期工作。

然而,幾乎每天它都會停止接受連接,或者我們認爲,無論是連接還是連接,但實際上並沒有做任何事情,我們也無法弄清楚爲什麼它只是停止。

有跡象表明,we'r'e不確定

1)幾件事情,我們應該建立某種連接池,而不是隻是一個客戶端套接字的字典

2)發生了什麼我們應該創建另一個字典,它們一旦創建就擁有這些套接字,但它們只是連接在我們的字典上,卻不會被添加到我們的字典中。

3)如果客戶端不再連接,最好的方法是什麼?我們已經閱讀了很多方法,但是我們不確定最好使用哪種方法,發送數據或讀取數據,如果是這樣的話?

4)如果我們通過連接dictonary來檢查處置的客戶端,我們是否應該鎖定字典,如果是這樣會如何影響其他客戶端同時嘗試使用它的對象,它會拋出一個錯誤還是等一下?

5)我們經常在ReceiveCallBack方法中隨機獲取disposSocketException,這是否意味着我們可以安全地從集合中移除該套接字?

我們似乎無法找到任何生產類型的例子,顯示任何這種工作。

任何意見將大大收到

回答

0

4)是的,鎖定它。其他線程將不得不等待。

一般而言,您必須鎖定每次訪問的字典,包括讀取。否則,該結構可能會損壞,這是您的問題的一個可能原因。