2012-02-06 36 views
2

我想構建一個簡單的多線程TCP服務器。客戶端連接併發送數據到服務器,服務器響應並再次等待數據。問題是我需要服務器在單獨的線程中偵聽傳入數據,並且能夠隨時向客戶端發送命令(例如通知新的更新)。據我瞭解,當客戶端向服務器發送數據時,如果服務器不響應任何數據,客戶端應用程序不會讓我發送更多數據,服務器根本不會收到它們。如果我以數據方式發送數據,是否需要爲tcpclient「確認」數據?多線程服務器,獨立發送數據?

下面是服務器的源:http://csharp.net-informations.com/communications/files/print/csharp-multi-threaded-server-socket_print.htm

我怎樣才能讓服務器發送命令在單獨的線程客戶端的「DoChat」功能外循環?或者我必須處理該線程中的所有內容?我必須回覆客戶發送給我的每個請求嗎?謝謝!

回答

1

的問題是我需要的服務器單獨的線程

沒有,有一個異步API來偵聽傳入的數據。你可以通過輪詢一個線程列表來查看哪些新數據在等待,很明顯是從工作線程完成的。

據我瞭解,當過客戶端發送數據到服務器,若服務器不與任何 數據進行響應,客戶端應用程序不會讓我發送更多的數據,服務器根本不會接收他們。

這是比套接字工作方式更多的廢話編程。在同一時間發送和接收方向上,套接字完全可以與流式傳輸協議完全兼容。

我怎樣才能讓服務器發送命令在單獨的線程客戶端的「DoChat」 功能

WEL之外,我diong你的工作需要花錢。

但是:這個例子被推遲了。作爲完全反模式。每個客戶端一個線程?一旦有1000多個客戶端連接,您將遇到memroy問題和perforamnce問題。你會得到大量的上下文切換。

其次,客戶端不是異步的,因爲它不是這樣寫的。 Mayy我向文檔建議giong,閱讀sockts並試圖自己創建它?那麼回來的問題不僅僅是「我只是試圖複製粘貼」。

通過適當的編程,這是完全正常的。我在開發中有一個類似的應用程序,將數據發送到客戶端並從客戶端獲取命令以修改數據流。作品具有魅力。

如果我以數據以太方式發送數據,是否需要爲tcpclient「確認」數據?

是和否。不,不適用於TCP - TCP是否會在引擎蓋下握手。是的,如果你的協議決定必須這樣做,這是程序員級別的設計決定。根據數據的內容,它可能也可能不是必需的。有時候,確認提供了更多的信息(時間戳服務器端,跟蹤數字),並不純粹是因爲「我明白了」。

相關問題