Ошибка раздела сообщения Python - PullRequest
0 голосов
/ 04 августа 2011

Я получаю следующее сообщение через 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 \ x00 \ 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\Икс00 \ 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 {"message": "Start", "client": "134.106.74.21", "type": 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

1 Ответ

1 голос
/ 04 августа 2011

Если вы print msg.encode("hex"), то вы, скорее всего, увидите, что это именно то, что находится в строке.

В любом случае вы могли заметить, что каждый 4-й байт результата является одним из символов, которыеты ожидалЭто говорит о том, что у вас есть строка Unicode UCS4, с которой вы не обрабатываете должным образом.

Получили ли вы UCS4-закодированные байты?Если это так, то вы должны вставить их в строку в юникоде u "". Append (stuff).Но если вы получаете байты в кодировке UCS4 и имеете какое-либо влияние на отправителя, вам действительно нужно изменить настройки для передачи и получения строк в кодировке UTF-8, поскольку это более нормально для сетевых подключений.

Выубедитесь, что 5 литеральных байтов действительно являются разделителем, который вам нужно использовать для разделения.Или это должен быть однобайтовый код ASCII с именем EOM?Или это кодированный UCS4 u"<EOM>"?

...