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);
}
但是,当客户端读取到这个时,响应是:
- [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 是流协议而不是数据包协议。
您可以像现在这样获取多个数据包或单个数据包中的字节。
你需要做的是放入一个表示数据包结束的字节(例如空字节)
伪代码:
- 有一个缓冲区,您可以将接收到的每个字节添加到其中。
- 如果它们是缓冲区中的空字节,则在空字节处拆分缓冲区
- 将左侧作为一个完整的数据包处理。将右侧保留在缓冲区中,直到获得新的空字节。
高级 TCP:
- 您可能想在 "packet"
中添加自己的错误检查
我正在制作一个聊天室应用程序,我发送 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 是流协议而不是数据包协议。
您可以像现在这样获取多个数据包或单个数据包中的字节。
你需要做的是放入一个表示数据包结束的字节(例如空字节)
伪代码:
- 有一个缓冲区,您可以将接收到的每个字节添加到其中。
- 如果它们是缓冲区中的空字节,则在空字节处拆分缓冲区
- 将左侧作为一个完整的数据包处理。将右侧保留在缓冲区中,直到获得新的空字节。
高级 TCP:
- 您可能想在 "packet" 中添加自己的错误检查