2016-11-14 66 views
0

我正在做一個聊天室應用程序,併發送TCP數據包在服務器和客戶端之間進行通信。C# - 似乎一次接收兩個TCP數據包?

我有以下代碼:

string returnMessage = "[EVT]USERSUCCESS"; 
       bytes = Encoding.ASCII.GetBytes(returnMessage); 
       info.WriteToStream(bytes); 

       foreach (ConnectionInfo con in connections) 
       { 
        info.WriteToStream(bytes); 
        bytes = Encoding.ASCII.GetBytes("[EVT]USERJOIN;" + username); 
        con.WriteToStream(bytes); 
       } 

然而,當客戶端讀取此,響應是:

  • [EVT] USERSUCCESS [EVT] USERJOIN;名稱

看起來好像它一次接收兩個數據包..?

這是我對接收的代碼:這是運行作爲一個獨立的線程

static void ServerListener() 
    { 
     while (true) 
     { 
      byte[] bytes = new byte[1024]; 
      int numBytes = stream.Read(bytes, 0, bytes.Length); 
      string message = Encoding.ASCII.GetString(bytes, 0, numBytes); 

      if (HandleResponse(message) && !WindowHasFocus()) 
      { 
       player.Play(); 
      }  
     } 
    } 

。 HandleResponse()完全正常工作。

在此先感謝!

回答

3

Tcp是一個流協議而不是數據包協議。

你可以像你在做的那樣獲得多個數據包或單個數據包的字節。

你需要做的就是把那個siginifies一個數據包的結束字節(如空字節)

Psudeo代碼:

  1. 有你添加收到每一個字節的緩衝區。
  2. 如果它們是緩衝區中的空字節,則將緩衝區分割爲空字節
  3. 將左側處理爲完整的數據包。將右側保留在緩衝區中,直到獲得新的空字節。

高級TCP:

  1. 您可能需要添加自己的錯誤在你的「包」檢查
+0

所以添加空字節到每個數據包的結束將導致客戶端分別閱讀每一個? – Sulphate

+0

不,您仍然需要編寫服務器代碼以將其拆分爲數據包。 – Catprog

+0

我該怎麼做?我對此很新。 – Sulphate

相關問題