0

TCP 経由で次のメッセージを受信して​​います。

{"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\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>\x00\x00\x00{"メッセージ": "開始","クライアント": "134.106.74.21", "タイプ": 1009}', '', '')\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>\x00\x00\x00{"メッセージ": "開始", "クライアント": "134.106.74.21", "タイプ": 1009}', '', '')\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>\x00\x00\x00{"メッセージ": "開始", "クライアント": "134.106.74.21", "タイプ": 1009}', '', '')\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>\x00\x00\x00{"メッセージ": "開始"、"クライアント": "134.106.74.21"、"タイプ": 1009 }'、''、'')\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>\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
4

1 に答える 1

1

そうすればprint msg.encode("hex")、これが文字列に含まれているものとまったく同じであることがわかるでしょう。

いずれにせよ、結果の4バイトごとが期待した文字の1つであることに気付いたかもしれません。これは、適切に処理していないUCS4Unicode文字列があることを示しています。

UCS4でエンコードされたバイトを受け取りましたか?もしそうなら、あなたはそれらをユニコード文字列u ""。append(stuff)に詰め込むべきです。ただし、UCS4でエンコードされたバイトを受信して​​いて、送信者に影響を与える場合は、UTF-8でエンコードされた文字列を送受信するように変更する必要があります。これは、ネットワーク接続では通常のことです。

5リテラルバイト<EOM>が、実際にパーティショニングに使用する必要のある区切り文字であることを確認してください。それとも、EOMという名前のシングルバイトASCIIコードであると想定されていますか?それともUCS4でエンコードされていu"<EOM>"ますか?

于 2011-08-04T08:50:21.307 に答える