TCP-Socket: Python3-Client und Java-Server

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Hallo zusammen,

um aufwendig und liebevoll in Java programmierte Grafiken nutzen zu können, habe ich ein Java-Swing-Programm um eine Socket-Server-Option erweitert und möchte es nun von meinem neuen Python-Programm ansteuern, was auch jetzt endlich klappt.

Das funktioniert aber erst, seit dem ich die Strings, die ich an den Java-Server schicke und von dort empfange encodiere bzw. wieder decodiere. Anfangs hatte ich mehrere Eigangspuffer im Java-Server ausprobiert, weil dieser nach beim Empfang der Python-Strings grundsatzlich abgestürzt ist.

Es lag aber am Python-Client und daran, dass ich bei meinen Versuchen die Anleitungen von Python2 (benutze aber Python 3.4) befolgt hatte, ohne zu berücksichtigen, dass sich die Strings von Python 2 und 3 gravierend von einander unterscheiden.

Was ich allerdings nicht verstehe ist, warum man die Strings, die man über einem Python3-Socket-Client austauschen will, erst encodieren bzw. decodieren muss, wohingegen man es in Java (und in anderen Sprachen ?) nicht tun muss. Wieso erledigt das nicht schon das Socket-Package ? Nimmt Python3, was die binäre Stringdarstellung angeht, eine Sonderstellung ein ?

Grüße
m-o
BlackJack

@mephisto-online: Wie sollte Python das denn automatisch machen? Über Sockets werden Bytes verschickt. Und wenn man Unicodezeichenketten als Bytes verschicken will, muss man sie kodieren. Da es nicht *die* Kodierung gibt, muss man das explizit machen, und die Kodierung angeben.

Auch in Java liefert ein Sockets erst einmal nur Bytes. Irgendwo wirst Du die wohl in Zeichenketten umwandeln und da solltest Du auch bei Java explizit eine Kodierung angeben, denn sonst hängt das vom System ab welche Kodierung Java dafür verwendet.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@mephisto-online: ich weiß nicht welches Protokoll Du für Deine Kommunikation einsetzt. Fakt ist, dass über jede Verbindung nur Bytes geschickt werden können. Das ist in Python2, Python3 und Java das selbe. Wenn Dir Java da Arbeit abnimmt, liegt das nur daran, dass Du in Java auf einer höheren Ebene arbeitest, als in Python.
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Über Sockets werden ausschliesslich Bytes verschickt, logo !

Mit 2.7 kann man Strings aber im Gegensatz zu 3.4 ohne explizite Codierung über einen Socket mit Java austauschen (... gerade ausprobiert) !?

Python 2: Zeichen eines Strings = Byte ?
Python 3: Zeichen eines Strings != Byte ? (weil UTF-8)

Oder immer noch vollkommen falsch ?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Strings sind unter Python 2 nichts anderes als Bytes, daher kannst du die Daten einfach so verschicken. Dabei ist aber noch nichts über die Kodierung des Strings gesagt. Dass auf beiden Seiten lesbare Strings rauskommen ist reine Glückssache. Unter Umständen stimmt zufällig die Kodierung auf Python- und Java-Seite überein, das muss aber nicht der Fall sein.

In Python 3 sind Strings Unicode-Objekte (kein UTF-8) und nicht einfach Bytes. Die Bytes erhältst du erst über die Kodierung, also eine konkrete binäre Darstellung. Das Python-3-Äquivalent zu "str" in Python 2 ist "byte".
Das Leben ist wie ein Tennisball.
BlackJack

@mephisto-online: In Python 2.x versendest und empfängst Du anscheinend `str`-Objekte, also Bytestrings. In Python 3.x ist `str` das was in Python 2.x `unicode` war, also ”echte” Zeichenketten die Zeichen statt Bytes enthalten. Wie die im Speicher aussehen ist ein Implementierungsdetail. Bei CPython ist das aber zumindest kein UTF-8.

Bei Java wirst Du wahrscheinlich vom Socket einen Stream bekommen und den in einen Reader oder Writer verpacken. Letztere dekodieren und kodieren zwischen Zeichenketten und Bytes. Bei Java muss man an der Stelle keine Kodierung angeben, sollte man aber, denn sonst hängt es von Einstellungen im Betriebssystem ab welche tatsächlich verwendet wird, und der Code ist dann nicht portabel.
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Ok: die Codierung auf beiden Seiten nicht den jeweiligen Implementierungsdetails überlassen, sondern direkt annageln. Dann kann es auch keine Kommunikationsprobleme geben.

Dieses Kapitel kann ich jetzt also auch als verstanden abhaken.

Ich danke Euch ! :wink:

Grüße
m-o
Antworten