2011-05-30 68 views
1

我正在C#中製作一個簡單的客戶端應用程序,並且遇到了問題。從TCPClient讀取問題

服務器應用程序發送一個格式爲"<number> <param> <param>"等的字符串。換句話說,第一個符號是一個整數,其餘的是任何東西,每個都由一個空格分隔。

在閱讀這個字符串時,我得到的問題是,我的程序首先用這個讀取一個字符串,然後下一次我讀取我得到的剩餘消息。 例如,如果我是做什麼我收到的WriteLine,它應該是這樣的: (如果他將「1 0 0 0」)

1 
0 0 0 

(編輯:格式化似乎並不以允許這一點,1是在自己的一排,其餘的應該是在下面的一排,包括第一個0之前的空間)

我已經用盡了想法如何解決這個問題。這裏的方法(我評論了一些東西,我試過): http://pastebin.com/0bXC9J2f

EDIT(再次):我忘了,好像當我在調試和剛剛經歷的一切按部就班工作得很好,所以我這種方式找不到任何問題的根源。

+0

你應該真的* *使用更高級別的API。具體來說,那些'ReadLine'。 :) – bzlm 2011-05-30 17:14:09

+0

我不知道有什麼在C#中。自從我來自Java之後,我一直在對這整個byte []事情發誓,我可以從頭開始將它作爲一個字符串讀取。 – Thomas 2011-05-30 17:19:23

+0

在溪流周圍擺放着一些簡單的「StreamWriter」。也別忘了用換行符實際終止你的消息。 – bzlm 2011-05-31 09:43:24

回答

8

TCP是基於流而不是基於消息的。一個Read可以包含任何下面的替代方案:

  • 消息
  • 半消息的蠅頭纖細部分
  • Excactly一個消息
  • 一個半消息
  • 兩個消息

因此,您需要使用某種方法來查看是否有完整的消息到達。最常見的方法是:

  • 添加頁腳(例如一個空行),其指示消息
  • 的末尾添加包含消息
1

的長度如果您的協議的固定長度首部是直接的TCP,那麼你不能發送消息,字符串或除八位字節(字節)流之外的其他任何東西。你的'字符串'最後是否爲空?如果是這樣,你需要附加收到的數據,直到空到達,那麼你有你的消息。

如果這是你的問題,那麼你應該編寫你的協議,以便它工作,無論在套接字上做多少次讀取調用,例如。如果服務器發送以[99數據字節+#0]爲空的字符串,那麼協議應該能夠組裝正確的字符串,如果在一次調用中返回100字節,在100次調用中接收1字節,或者之間。

RGDS, 馬丁