gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:57:49 24 4
gpt4 key购买 nike

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

提前致谢!

最佳答案

Tcp 是流协议(protocol)而不是数据包协议(protocol)。

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

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

伪代码:

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

高级 TCP:

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

关于C# - 似乎同时接收两个 TCP 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40580278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com