C# - 似乎同时接收两个 TCP 数据包?

C# - Seems to be receiving two TCP packets at once?

我正在制作一个聊天室应用程序,我发送 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);
                }

但是,当客户端读取到这个时,响应是:

这似乎是同时接收两个数据包..?

这是我用来接收的代码:

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() 完全正常工作。

提前致谢!

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

您可以像现在这样获取多个数据包或单个数据包中的字节。

你需要做的是放入一个表示数据包结束的字节(例如空字节)

伪代码:

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

高级 TCP:

  1. 您可能想在 "packet"
  2. 中添加自己的错误检查