Seite 1 von 1
Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 14:43
von MrWagner
Hi,
ich hab mich Heute notgedrungen mal mit Python beschäftigt, da ich Java wegen zu hohem RAM-Verbrauch auf meinen Einplatinencomputer nocht nutzen möchte.
Prinzipiell möchte ich folgendes realisieren: Android Client > Python Server. Das funktioniert im Prinzip, nur habe ich momentan ein Problem mit den ankommenden Daten:
http://www.ld-host.de/uploads/images/64 ... d09ef5.jpg
Bestimte Zeichenketten werden halt falsch dargestellt. In diesen Fall ist es die Zeichenkette "25" die vom Java-Client auf dem Smartphone an den Server geschickt wurde. Ich hab schon diverse Vorschläge aus dem Netz probiert, aber so 100% weiß ich nicht wo genau der Fehler liegt. In Sachen Python bin ich noch nicht so fit, den "Server" hab ich schnell mal mit Beispielen aus dem Netz zusammengestellt. Im Grunde soll das Ding nur "lauern" und erstmal nur Strings empfangen.
mfg
Re: Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 15:07
von BlackJack
@MrWagner: Du kannst Dir mal die `repr()`-Form von dem anschauen was da ankommt, dann sieht man deutlicher was exakt an Bytes empfangen wurde.
Grundsätzlich sieht es aber so aus als wenn der Sender da *nicht* die beiden Bytes sendet, die die ASCII-Zeichenfolge '25' ergeben. Kann es sein dass da noch irgendwas davor gesendet wird?
Das Empfangen ist nicht robust, weil TCP ein Datenstrom ist und ein `recv()` einen beliebigen Teilausschnitt aus dem Anfang der Daten liefern kann. Ein fehlerfreier Server muss an dieser Stelle also damit klarkommen können das er mehr als einen `recv()`-Aufruf benötigen kann um die Daten zu lesen. Im schlimmsten Fall kann jeder Aufruf nur 1 Byte lesen.
Edit: Bezüglich Namensschreibweise und Einrücktiefe könntest Du mal einen Blick in den
Style Guide for Python Code werfen.
Und Zeichenketten und Werte werden in Python üblicherweise nicht durch ``+`` und `str()` zusammengesetzt, sondern mit der `format()`-Methode auf Zeichenketten. (Dachte sowas hätte sich bei Java mittlerweile auch durchgesetzt.)
Re: Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 15:56
von MrWagner
Jo, es wird noch was davon gesendet: repr(data) ergibt: '\x00\x0225' für "25" und für "Hallo" '\x00\x05Hallo'.
Ich hatte ganz am Anfang mal die Idee das einfach zu replacen, aber so ganz koscher war mir die Idee dann nicht. Da gibt es doch sicher einen eleganteren Weg?
Und danke für den Style-Guide und den Hinweis mit dem Datenstrom.
Re: Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 16:38
von BlackJack
@MrWagner: Na das sieht doch so aus als wenn die Daten mit einer 16-Bit-Zahl anfangen in der die Länge gespeichert ist. Ist der Code der das sendet nicht von Dir? Hast Du eine Protokollbeschreibung?
Re: Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 19:31
von Sirius3
@MrWagner: ohne die Länge der Nachricht zu wissen, kannst Du ja nicht wissen, wann sie zu Ende ist. Die zwei ersten Bytes einfach wegzuschmeißen, wäre also ziemlich blöd.
Re: Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 22:39
von MrWagner
Auf der Gegenseite hängt halt erstmal was total simples.
DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream());
dos.writeUTF("Hello");
Da muss ich an der Stelle noch mal schauen.
Re: Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 23:06
von BlackJack
@MrWagner: Ja, das ist da dokumentiert das erst 16-Bit gesendet werden, die die Länge in Bytes angeben. Und was da gesendet wird ist ”modifiziertes” UTF-8. Wenn Du das mit etwas anderem als Java verarbeiten möchtest, müsstest Du schauen was da genau anders gemacht wird.
Re: Socket- falsches Format bei ankommenden Strings
Verfasst: Mittwoch 14. Mai 2014, 23:35
von Sirius3
Das ist ja nett: Surrogate-Paare werden automatisch umgewandelt. Bliebe nur noch das 0-Byte:
Das Encodieren wird da schon schwieriger.