2016-11-14 80 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