C# - 似乎一次接收两个TCP数据包?
问题描述:
我正在做一个聊天室应用程序,并发送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()完全正常工作。
在此先感谢!
答
Tcp是一个流协议而不是数据包协议。
你可以像你在做的那样获得多个数据包或单个数据包的字节。
你需要做的就是把那个siginifies一个数据包的结束字节(如空字节)
Psudeo代码:
- 有你添加收到每一个字节的缓冲区。
- 如果它们是缓冲区中的空字节,则将缓冲区分割为空字节
- 将左侧处理为完整的数据包。将右侧保留在缓冲区中,直到获得新的空字节。
高级TCP:
- 您可能需要添加自己的错误在你的“包”检查
所以添加空字节到每个数据包的结束将导致客户端分别阅读每一个? – Sulphate
不,您仍然需要编写服务器代码以将其拆分为数据包。 – Catprog
我该怎么做?我对此很新。 – Sulphate