2011-08-04 5 views
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 \ x00a \ x00 \ x00 \ x00g \ x00 \ x00 \ x00e \ x00 \ x00 \ x00 "\ x00 \ x00 \ x00 : \ x00 \ x00 \ x00 \ x00 \ x00 \ x00"\ x00 \ x00 \ x00 #x00 \ x00 \ x00N \ x00 \ x00 \ x00; \ x00 \ x00 \ x00A \ 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 \ 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 \ x00 \ x00 \ x001 \ x00 \ x00 \ x002 \ x00 \ x00 \ x005 \ x00 \ x00 \ x00 : \ x00 \ x00. \ x00 \ x00 \ x00 \ x000 \ x00 \ x00 \ x000 \ x00 \ x00 \ x000 \ x00 \ x00 \ x00; \ x00 \ x00 \ x00 # \ x00 \ x00 \ x00 \ x003 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00c \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00 "\ x00 \ x00 \ x00 : \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 "\ x00x32 \ x00 \ x004 \ x00 \ x00 \ x004 x00 \ x00 \ x00 \ x00 \ x00 \ x000 \ x00 \ x00 \ x000 \ x00 \ x00 \ x006 \ x00 \ x00 \ x00. x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x002 \ x00 \ x00 \ x005 \ x00 \ x00 \ x00 "\ x00 \ x00 \ x007 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00y \ x00 \ x00 \ x00p \ x00 \ x00 \ x00e \ 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 \ 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; 

두 문자열을 추가하려고 할 때 문제가 발생했습니다.

recv + ans 
+0

파션 방식이란 무엇입니까? 나는 아마 당신의 코드 (라이브러리가 아님)의 일부라고 생각한다. –

+0

이것은 내장 함수입니다 (http : //docs.python.org/library/stdtypes.html#str).파티션 –

답변

1

print msg.encode("hex") 그러면 정확히 문자열에있는 것을 볼 수 있습니다.

어떤 경우 든 결과의 네 번째 바이트가 예상 한 문자 중 하나라는 것을 알았을 수 있습니다. 이는 제대로 처리하지 못하는 UCS4 유니 코드 문자열이 있음을 나타냅니다.

UCS4로 인코딩 된 바이트를 받았습니까? 그렇다면 유니 코드 문자열에 이들을 채워 넣어야합니다. ""append (stuff). 그러나 UCS4로 인코딩 된 바이트를 수신하고 보낸 사람에 영향을 미칠 경우 실제로 네트워크 연결을 통해 UTF-8 인코딩 된 문자열을 전송하고 수신하도록 변경해야합니다.

5 자 리터럴 바이트 < E O M>이 실제로 파티셔닝에 사용해야하는 구분 기호인지 확인하십시오. 아니면 EOM이라는 1 바이트 ASCII 코드로되어 있습니까? 또는 UCS4로 인코딩 된 u"<EOM>"입니까?

+0

마지막으로 문제에 더 가까워지고 코드를 업데이트했습니다! –