您好我已经写了一些客户端服务器代码并且现在写了我注意到我在处理接收命令时遇到了一个错误
这些是我的命令
#Server Commands
CMD_MSG, CMD_MULTI, CMD_IP, CMD_AUDIO, CMD_AUDIO_MULTI, CMD_FILE = range(6)
我发送这样的命令
self.client(chr(CMD_AUDIO), data)
并像这样收到
msg = conn.recv(2024)
if msg:
cmd, msg = ord(msg[0]),msg[1:]
if cmd == CMD_MSG:
#do something
第一个命令似乎有效,但是如果我打电话给任何其他命令,它似乎都会循环遍历它们。它非常奇怪
如果需要,我可以发布更多代码。
但是关于如何处理发送到我的服务器的命令的任何想法都会很棒
*欢呼声
答案 0 :(得分:1)
假设您正在使用流(TCP)套接字,流套接字的第一个规则是不会接收与其发送的组相同的数据。如果您发送三个每个10字节的消息,您可能会在另一端收到一个30字节的块,每个30字节的一个字节或其间的任何内容。
您必须构建协议,以便接收方知道流中的每条消息的长度(通过添加长度字段或具有固定长度的消息格式),并且您必须保存任何recv()的未使用部分穿过消息边界以在下一条消息中使用。
流/ TCP套接字的替代方案是数据报/ UDP套接字。这些保留了消息边界,但不保证消息的传递或排序。根据你正在做的事情,这可能是可以接受的,但可能不是。