2011-08-04 37 views
0

我收到以下消息槽TCP:Python的消息分區錯誤

{"message": "Start", "client": "134.106.74.21", "type": 1009}<EOM> 

但是當我試圖分區

msg.partition("<EOM>") 

我發現了以下的數組:

('{\ ​​x00 \ x00 \ x00「\ x00 \ x00 \ x00m \ x00 \ x00 \ x00e \ x00 \ x00 \ x00g \ x00s \ x00 \ x00 \ x00g \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00#x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00l x00 x00 x00l x00 x00 x00 x00 x00 x00; x00 x00 x001 x00 x00 x00; x00 x00 x000 x00 | x00 | x00 | x00 | x00 | x00 | x00 | x00 | x00 | x00 x00 x00 x00 x003 x00 x00 x004 x00 x00 x00。x00 x00 \ x001 \ x00 \ x00 \ x000 \ x00 \ x00 \ x006 \ x00 x00 x00 x00 x00 x004 x00 x00 x00。x00 x00 x100 x00 x00 x002 x00 x00 x005 x00 x00 x00: \ x00 \ x00 \ x00 \ x00 \ x00 \ x000 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00N \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00c \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00l \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00「\ x00x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00。 \ x00 \ x00 \ x004 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 x00 x00 x00 x00 x00 x00 x00 x000 x00 x00 x000 x00 x00 x005 x00 x00 x00} x00 x00 x00 < \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00E \ x00 \ x00 \ x00 \ x00O \ x00 \ x00 \ x00M \ x00 \ x00 \ x00> \ x00 \ x00 \ x00 {「message」:「Start」,「client」:「134.106.74.21」, 「類型」:1009}」, '', '')

更新

try:      
    #Check if there are messages, if don't than throwing an exception otherwise continue 
    ans = self.request.recv(20480)       
    if(ans):       
      recv = self.getMessage(recv + ans) 
    else: 
      #Master client disconnected 
      break 
except: 
... 

def getMessage(self, msg): 
     print("masg:" + msg); 
     aSplit = msg.partition("<EOM>")                 
     while(aSplit[ 1 ] == "<EOM>"): 
      self.recvMessageHandler(json.loads(aSplit[ 0 ]))    
      #Get the new message id any 
      msg = aSplit[ 3 ]  
      aSplit = msg.partition("<EOM>") 
     return msg; 

當我試圖添加兩個字符串時發生問題。

recv + ans 
+0

什麼是分區方法?我想可能是你的代碼的一部分(不是庫)。 –

+0

這是一個內置函數:http://docs.python.org/library/stdtypes.html#str。分區 –

回答

1

如果print msg.encode("hex")那麼你可能會看到,這正是什麼的字符串中。

無論如何,您可能已經注意到結果的每個第4個字節都是您所期望的字符之一。這表明你有一個UCS4 Unicode字符串,你沒有正確處理。

您是否收到UCS4編碼的字節?如果是這樣,那麼你應該把它們塞入一個unicode字符串中。「」。append(stuff)。但是,如果您接收到UCS4編碼的字節,並且您對發送方有任何影響力,那麼您應該將事情更改爲發送和接收UTF-8編碼的字符串,因爲這在網絡連接上更加正常。

您確定5個文字字節< E O M>確實是您需要用於分區的分隔符。還是應該是名爲EOM的單字節ASCII碼?或者它是UCS4編碼的u"<EOM>"

+0

最後我接近了這個問題,我已經更新了我的代碼! –