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

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

不言
Freigeben: 2019-03-13 13:26:56
nach vorne
2614 Leute haben es durchsucht

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钟
Nach dem Login kopieren

Normalerweise akzeptiert und maskiert als:

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

Wenn der jetzt empfangene Datenstrom

bmsg = b'\xe5\x88\x86\n\xe9\x92'    # \x9f 作为下次接受
Nach dem Login kopieren
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 后为 ?
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage