Heim  >  Artikel  >  Backend-Entwicklung  >  Problem mit Python beim Parsen abnormaler Bytes des Socket-Datenstroms (Details)

Problem mit Python beim Parsen abnormaler Bytes des Socket-Datenstroms (Details)

不言
不言nach vorne
2019-03-13 13:26:562580Durchsuche

Der Inhalt dieses Artikels befasst sich mit dem Problem, dass Python abnormale Bytes des Socket-Datenflusses analysiert. Ich hoffe, dass er für Sie hilfreich ist.

Wenn Python Daten über den Socket sendet, werden englische Zeichen maskiert und in ihre Originalzeichen umgewandelt, die ein Byte belegen (zum Beispiel: s wird in s übertragen), während chinesische Zeichen nach dem Escape-Abschnitt zwei Zeichen benötigen Identifizieren Sie ein chinesisches Zeichen (zum Beispiel: bell ist x92x9f nach Escape). Auf der sendenden Seite liegt kein Problem vor, das Problem tritt jedoch hauptsächlich auf dem Socket-Client auf. Denn wenn der Client den Datenstrom akzeptiert, gibt es für jede Annahme ein Byte-Limit, und ein chinesisches Zeichen wird zweimal akzeptiert, was dazu führt, dass jedes Mal, wenn der akzeptierte Strom in ein Zeichen maskiert wird, ein UnicodeDecodeError gemeldet wird.

Derzeit gibt es einen Datenfluss:

bmsg = b'\xe5\x88\x86\n\xe9\x92\x9f' # 分\n钟

Normalerweise akzeptiert und maskiert als:

smsg = str(bmsg, 'utf-8')   #方式一 或 
smsg = bmsg.decode()  # 方式二 第一参数默认utf8,第二参数默认strict,还有 ignore (忽略)、 replace (替代=?)

Wenn der jetzt empfangene Datenstrom

bmsg = b'\xe5\x88\x86\n\xe9\x92'    # \x9f 作为下次接受
ist

Um das abnormale Beenden des Programms zu vermeiden, gibt es zwei Möglichkeiten Behandeln Sie es:
1) Datenverlustverarbeitung
Wenn Sie zu diesem Zeitpunkt die normale Akzeptanzmethode verwenden, um den Byte-Stream zu maskieren, tritt eine UnicodeDecodeError-Ausnahme auf. Um die Ausnahme nicht zu melden, verwenden wir Methode 2 Geben Sie beim Escape den zweiten Parameter an:

smsg = bmsg.decode('utf-8', 'ignore') # 输出: 分\n  ,如果为 replace 则 \n 后为 ?

2) Teilen Sie den Datenstrom auf und verarbeiten Sie ihn dann
Im Allgemeinen, wenn Der Socket-Server sendet Daten, jeder Datenstrom ist vollständig und wird zusammen mit dem Ende eines bestimmten Zeichens (z. B. n) gesendet. Basierend auf dieser aktuellen Situation teilen wir jedes Mal, wenn wir Daten erhalten, diese nach diesem bestimmten Zeichen in eine Liste auf, die einen einzelnen Datenstrom speichert. Der erste Stream in der Liste ist möglicherweise unvollständig. Führen Sie ihn daher mit dem letzten akzeptierten Stream zu einem vollständigen Datenstrom zusammen und maskieren Sie ihn. Der mittlere Stream ist ein Datenstrom, der normal maskiert werden kann. Der letzte Stream ist ebenfalls unvollständig. Speichern Sie ihn . Wird verwendet, um den akzeptierten Stream beim nächsten Mal zu verbinden und den obigen Vorgang zu wiederholen. Dadurch wird sichergestellt, dass das Programm nicht abnormal beendet wird und die Integrität der Daten gewährleistet ist. Der ungefähre Code lautet wie folgt:
Datenakzeptanz:

Beim ersten Mal wird msg1 = b'xe5x88x86nxe9' akzeptiert. # Die Uhr wird in xe9 und x92x9f aufgeteilt.
Beim zweiten Mal wird msg2 = akzeptiert b'x92x9f_stonen'

init_msg = b'' # 初始化流
  while True:
    msg = soc.recv(128) # 接受数据
    init_msg += msg
    msg_arr = init_msg.split(b'\n') # 注意此处的 b'\n' ,因为被拆分的为bytes串,所以也要用bytes串来拆分
    init_msg += msg_arr[-1]
    msg_arr.remove(msg_arr[-1])
    for i in range(len(msg_arr)):
      string = msg_arr[i].decode('utf-8')
      print(string

Das obige ist der detaillierte Inhalt vonProblem mit Python beim Parsen abnormaler Bytes des Socket-Datenstroms (Details). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen