2011-08-04 9 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¥x00s¥x00¥x00¥x00a¥x00 ¥x00¥x00g¥ x00 \ x00 \ x00e \ x00 \ x00 \ x00 "\ x00 \ x00 \ x00:\ x00 \ x00 \ x00 \ x00 \ x00 \ x00" \ x00 \ x00 \ x00# \ X00 \ X00 \ x00B \ X00 \ X00 \ x00E \ X00 \ X00 \ x00G \ X00 \ X00 \ x00I \ X00 \ X00 \ x00N \ X00 \ X00 \ X00; \ X00 \ X00 \ x00A \ X00 \ X00 \ x00l \ X00 \ X00 \ x00l \ X00 \ X00 \ X00; \ X00 \ X00 \ X000 \ X00 \ X00 \ X00; \ X00 \ X00 \ X001 \ X00 \ X00 \ X00; \ X00 \ X00 \ X000 \ X00 \ X00の\ X00;。\ X00 \ X00 \ X001 \ X00 \ X00 \ X003 \ X00 \ X00 \ X004 \ X00 \ X00 \ X00 \ X00 \ X00 \ X001 \ X00 \ X00 \ X000 \ X00 \ X00 \ X006 \ X00 \ X00用の\ X00 \ X00 \ X00 \ x007 \ X00 \ X00 \ X004 \ X00 \ X00 \ X00 \ X00 \ X00 \ X001 \ X00 \ X00 \ X002 \ X00 \ X00 \ X005 \ X00 \ X00 \ X00。。: \ X00 \ X00 \ X003 \ X00 \ X00 \ X000 \ X00 \ X00 \ X000 \ X00 \ X00 \ X000 \ X00 \ X00 \ X000 \ X00 \ X00 \ X00; \ X00 \ X00 \ x00から#\ X00 \ X00 \ x00E \ X00 \ X00 \ x00N \ X00 \ X00 \ x00D \ X00 \ X00 \ X00 "\ X00 \ X00 \ X00、\ X00 \ X00 \ X00 \ X00 \ X00 \ X00" \ X00 \ X00 \ x00c \ X00 \ X00 \ x00l \ X00 \ X00 \ x00i \ X00 \ X00 \ x00e \ X00 \ X00 \ x00n \ X00 \ X00 \ x00t \ X00 \ X00 \ X00" \ X00 \ X00 \ X00:\ X00 \ X00 \ X00 \ X00 \ x00 \ x00 "\ x00 \ X00 \ X001 \ X00 \ X00 \ X003 \ X00 \ X00 \ X004 \ X00 \ X00 \ X00 \ X00 \ X00 \ X001 \ X00 \ X00 \ X000 \ X00 \ X00 \ X006 \ X00 \ X00 \ X00。 \ X00 \ X00 \ x007 \ X00 \ X00 \ X004 \ X00 \ X00 \ X00 \ X00 \ X00 \ X001 \ X00 \ X00 \ X002 \ X00 \ X00 \ X005 \ X00 \ X00 \ X00" \ X00 \ X00 \ X00、\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 "\ X00 \ X00 \ x00t \ X00 \ X00 \ x00y \ X00 \ X00 \ x00p \ X00 \ X00 \ x00e \ X00 \ X00 \ X00" \ X00 \ X00の\ X00:\ X00 \ X00 \ X00 \ X00 \ X00 \ X002 \ X00 \ X00 \ X000 \ X00 \ X00 \ X000 \ X00 \ X00 \ X005 \ X00 \ X00 \ X00} \ X00 \ X00 \ X00 < \ x00 \ x00 \ x00E \ x00 \ x00 \ x00O \ x00 \ x00 \ x00M \ x00 \ x00 \ x00 \ "\" \ "メッセージ": "開始"、 "クライアント": "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; 

私は2つの文字列を追加しようとしているときに問題が発生しました。

recv + ans 
+0

partionメソッドとは何ですか?おそらくコードの一部(ライブラリではない)だと思います。 –

+0

これは組み込み関数http://docs.python.org/library/stdtypes.html#strです。パーティション –

答えて

1

あなたがprint msg.encode("hex")の場合、これはまさに文字列内のものである可能性があります。いずれの場合においても

、あなたは結果のすべての4バイト目は、あなたが期待される文字の一つであることに気づいたかもしれません。これは、適切に処理していないUCS4 Unicode文字列があることを示しています。

UCS4でエンコードされたバイトを受信しましたか?もしそうなら、あなたはユニコード文字列にそれらを詰め込むべきでしょう ""。append(stuff)。しかし、あなたがUCS4でエンコードされたバイトを受け取っていて、あなたが送信者に影響を与えているならば、UTF-8でエンコードされた文字列を送受信するように変更する必要があります。

は5リテラルバイト< E O M>は確かにあなたがパーティショニングのために使用する必要が区切り文字であることをあなたはよろしいです。それとも、EOMという1バイトのASCIIコードであると思われますか?それとも、UCS4で符号化された u"<EOM>"ですか?

+0

最後に私は問題に近づき、コードを更新しました! –