2012-09-14 61 views
0

C#中對TCP套接字通信的新用法,有一個問題,我通過網絡流從客戶端應用程序發送一些數據,然後從我的服務器應用程序讀取它。數據第一次通過,但下一次我嘗試發送數據時,舊數據仍然在網絡流中,只是被覆蓋到新數據的長度。這在嘗試解析流中的數據時會導致問題。我試着添加一個空終止,但它似乎沒有任何影響。C#網絡流在讀取之後仍然包含舊數據

如何在發送更多數據之前清空網絡流?

我們發送一個字符串像這樣:

1|0|bob|cornell|9/14/2012 12:49:34 AM 

然後另外一個是這樣的:

1|0|jim|horne|9/14/2012 12:49:34 AM 

但第二串經過爲:

1|0|jim|horne|9/14/2012 12:49:34 AMAM 

...其次是一堆\0

最後一個塊是DateTime,由於額外的AM,它無法將字符串轉換爲DateTime。即使在將\ 0附加到我們通過流發送的字符串末尾時,它也不起作用。例如:

1|0|jim|horne|9/14/2012 12:49:34 AM\0M 

它似乎把空終止只是另一個角色,而不是一個信號,停止閱讀的字符串。

似乎「Flush」在NetworkStream類型上不做任何事情。這裏必須是一個愚蠢的問題,但任何幫助表示讚賞。

客戶做到這一點:

private static void writeToServer(MessagePacket message, NetworkStream clientStream) 
    { 
     clientStream.Write(message.ToBytes(), 0, message.ToBytes().Length); 
    } 

服務器執行此操作:

byte[] rawMessage = new byte[4096]; 

     while (true) 
     { 

      try 
      { 
       clientStream.Read(rawMessage, 0, 4096); 
       clientStream.Flush(); 
      } 

      catch 
      { 
       break; 
      } 


      newPacket = new MessagePacket(rawMessage); 
     } 
+2

我認爲你正在尋找一些刷新方法...你可以顯示相關的代碼? – DarkSquirrel42

+0

更新了一些額外的信息描述。 – ThingWings

回答

1

Stream.Read()返回接收到的字節數,之後的字節數未定義。

0

前綴的消息字節/字符閱讀的數量...

,如:<整數> < delimeter char> <正常消息>

在接收端,嘗試找到第一個匹配的分隔符char ...解析在該分隔符之前的部分中的int ...嘗試讀取分隔符後的字節數/字符數