TCP 服务器:如何避免消息重叠

0 投票
3 回答
957 浏览
提问于 2025-04-16 04:16

我打算写一个TCP服务器,客户端会给我发送XML消息。我在想下面这种情况会不会发生,以及怎么避免它:

1) 客户端发送 <cmd ...></cmd>

2) 服务器正在忙着做其他事情

3) 客户端又发送 <cmd ...></cmd>

4) 服务器执行recv(),把字符串放到缓冲区

这样的话,缓冲区里会不会变成 <cmd ...></cmd><cmd ...></cmd>,或者更糟糕的是 <cmd ...></cmd><cmd ...,如果我的缓冲区不够大呢?

我希望TCP协议能把消息分开,跟客户端发送时的样子一样。

这样做可行吗?

3 个回答

3

你需要一个更高级的协议来明确消息的边界,按照你的需求来划分。而且有很多可供选择的协议,甚至你可以自己发明一个。

4

在TCP层面上,这是无法保证的,因为它只知道数据流。

根据你使用的XML解析器,你应该可以把数据流传给它,然后它会告诉你什么时候有一个完整的对象。同时,它会把第二个<cmd...留在缓冲区,直到它被关闭。

0

你通常会用复数形式来描述客户端:是不是有多个客户端同时连接到你的服务器?如果是这样,每个客户端都应该使用自己的TCP连接,这样你提到的问题就不会发生。

如果不同的命令是从一个客户端发出的,那么你应该让你的客户端代码在发出下一个命令之前,先等着上一个命令的回复。

撰写回答