C# - 似乎一次接收两个TCP数据包?

时间:2016-11-14 00:15:41

标签: c# tcp console packets netstream

我正在制作一个聊天室应用程序,我发送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()完全正常工作。

提前致谢!

1 个答案:

答案 0 :(得分:3)

Tcp是流协议而不是数据包协议。

你可以获得多个数据包中的字节或像你一样的单个数据包。

你需要做的是放一个字符串来表示数据包的结尾(例如空字节)

Psudeo代码:

  1. 有一个缓冲区,您可以将收到的每个字节添加到。
  2. 如果它们是缓冲区中的空字节,则将缓冲区拆分为空字节
  3. 将左侧作为完整包处理。将右侧保留在缓冲区中,直到获得新的空字节。
  4. 高级TCP:

    1. 您可能希望在“数据包”
    2. 中添加自己的错误检查