2012-03-05 141 views
0

我有一個TCP套接字應用程序,客戶端在同一時間向服務器發送巨大的字符串消息。服務器將此消息寫入Access DB.So如果有這麼多的客戶端服務器端可以不能正確處理每個客戶端,並且有時會關閉服務器。我想問一下,有沒有什麼方法可以在發送消息等待隊列之前告訴客戶端的線程,如果有另一個客戶端當前在隊列中。這個服務器不需要同時處理例如30個客戶端的需求。C#Socket編程中的線程管理

例如;

  1. 客戶端發送消息=>服務器處理1個客戶端的需求
  2. 客戶端在等待1個客戶端的完整比2客戶端要求發送消息=>服務器處理1個客戶端的需求
  3. 客戶端在等待2客戶端的需求爲完整......

我使用Access數據庫時出現問題。雖然打開訪問連接將數據保存到表和關閉數據庫是花費時間和服務器去haywire :)如果我不使用訪問數據庫我可以得到巨大的消息沒有問題。

回答

0

我認爲你應該考慮爲你的應用程序使用Web服務器,並用HTTP代替你的協議。不要在TCP流上發送大量字符串,只需使用您最喜歡的HttpClient類將字符串發送到服務器即可。

通過轉移到HTTP,您或多或少地解決了所有性能問題。 Web服務器已經知道如何處理多個長請求,所以你不必擔心這一點。由於您發送大字符串,HTTP開銷不會影響您的性能。

+0

我的問題是不是巨大的strings.If我不寫進來的字符串消息到Access數據庫沒有problem.Problem是,當我使用Access數據庫出現。當打開訪問連接將數據保存到表和關閉數據庫需要時間和服務器就會失控:) – 2012-03-05 21:00:12

+0

如果你不使用成熟的Web應用程序服務器(如IIS和ASP.NET)。所有這些已經爲你解決了。 – zmbq 2012-03-05 21:19:22

3

是的,你可以做到這一點,但這不是最有效的方法。你的方案是單線程的。

你想要做的是創建一個線程池,並接受來自多個客戶端的消息和處理它們作爲單獨的線程。 如果這太複雜。你可以在你的服務器中有一個生產者消費者隊列,所有傳入的消息將被存儲在一個隊列中,而你的服務器將以先到先得的方式處理它們。