2011-10-26 156 views
0

你好,我已經寫了一些客戶端服務器代碼和寫,現在我發現我在我如何處理接收命令的錯誤發送命令到服務器的Python

這是我的命令

#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 

第一條命令似乎可行,但如果我打電話給其他任何人,似乎都會循環它們。它真的離奇

如果需要,我可以發佈更多的代碼。

但在如何處理這些命令的任何想法發送到我的服務器將是巨大的

*歡呼

回答

1

假設你正在使用流(TCP)套接字,流套接字的第一條規則是你將不會接收它發送的相同組中的數據。如果您發送三條每條10個字節的消息,則可能會在另一端接收一個30字節的數據塊,每個數據塊有30個數據塊,或者其中任何一個字節。

您必須構建您的協議,以便接收者知道流內每個消息的長度(通過添加長度字段或具有固定長度的消息格式),並且必須保存任何recv的未使用部分( )跨越消息邊界以用於下一消息。

流/ TCP套接字的替代方法是數據報/ UDP套接字。這些保留了消息邊界,但不保證消息的傳遞或排序。根據你在做什麼,這可能是可以接受的,但可能不會。