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

时间:2010-09-17 07:20:28

标签: python networking tcp

我打算写一个TCP服务器,客户端给我发送XML消息,我想知道是否会发生以下情况以及如何避免这种情况:

1)客户端发送<cmd ...></cmd> 2)服务器忙于做某事 3)客户发送<cmd ...></cmd> 4)服务器执行recv()并将字符串放入缓冲区

如果我的缓冲区不够大,缓冲区是否会填充<cmd ...></cmd><cmd ...></cmd>甚至更差<cmd ...></cmd><cmd ...

我想要的是TCP堆栈将消息分成与客户端发送消息相同的部分。

可行吗?

3 个答案:

答案 0 :(得分:4)

这在TCP级别是不可能保证的,因为它只知道流。

根据您正在使用的XML解析器,您应该能够将其提供给流并让它告诉您何时有完整的对象,将第二个<cmd...保留在其缓冲区中,直到它关闭为止

答案 1 :(得分:3)

您需要更高阶的协议来根据需要描绘消息边界。还有plenty to choose from,包括你自己发明的那个。

答案 2 :(得分:0)

您经常以复数形式编写客户端:是否有多个客户端连接到您的服务器?在这种情况下,每个客户端应该使用自己的TCP流,并且您所描述的问题永远不会发生。

如果从单个客户端发送各种命令,那么您应编写客户端代码,以便在发出下一个命令之前等待命令的答案。