TCP 服务器:如何避免消息重叠
我打算写一个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连接,这样你提到的问题就不会发生。
如果不同的命令是从一个客户端发出的,那么你应该让你的客户端代码在发出下一个命令之前,先等着上一个命令的回复。