Seite 2 von 4

Re: Schei� encoding

Verfasst: Dienstag 10. April 2012, 19:22
von BlackJack
@Py-Prog: Würde ich auch so sehen.

Re: Schei� encoding

Verfasst: Dienstag 10. April 2012, 20:22
von Py-Prog
@Hyperion geht Bitstring auch?

Re: Schei� encoding

Verfasst: Mittwoch 11. April 2012, 04:40
von Hyperion
@Py-Prog: Ich kenne das nicht; aber probiere es doch ruhig mal aus. Auf den ersten Blick sah die Doku ganz brauchbar aus.

Re: Schei� encoding

Verfasst: Samstag 21. April 2012, 20:12
von Py-Prog
Nächstes Problem:
Ich hab's mit BitString zum laufen gebracht, aber jetzt hab ich das gleiche Problem wie vorher, wenn der Server oder der Client zwei Pakete so kurz hintereinander schickt, das ich beide mit read(10000) auslese, dann funktioniert es nicht mehr, ich müsste also für jedes Paket ein elif einbauen, was aber aus Geschwindigkeits-gründen auf gar keinen Fall infrage kommt, nur wenn es keine andere Lösung gibt. Gibt es einen Möglichkeit die geschickten Pakete einzeln hintereinander auszulesen?

Re: Schei� encoding

Verfasst: Samstag 21. April 2012, 20:18
von Hyperion
Py-Prog hat geschrieben:... wenn der Server oder der Client zwei Pakete so kurz hintereinander schickt, das ich beide mit read(10000) auslese, dann funktioniert es nicht mehr, ...
Code? Fehlermeldung? Wir haben doch keinen Plan, was Du da genau machst...

Re: Schei� encoding

Verfasst: Samstag 21. April 2012, 20:52
von BlackJack
@Py-Prog: Aus dem Inhalt der einzelnen Pakete wird doch klar wie lang sie jeweils sind. Da das Protokoll kein allgemeines Längenfeld besitzt, muss der Code leider *alle* Pakete verstehen können, damit man nicht aus dem Tritt kommt.

Es wird TCP verwendet, also musst Du nicht nur damit rechnen mehr als ein Paket mit einem `read()`-Aufruf zu bekommen, sondern auch damit, dass Du *unvollständige* Pakete bekommen kannst, wo Du erst mit dem einem, oder womöglich sogar mehreren `read()`-Aufrufen den Rest der Daten bekommst. Damit muss Dein Code klar kommen können.

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 03:48
von Leonidas
BlackJack hat geschrieben:Es wird TCP verwendet, also musst Du nicht nur damit rechnen mehr als ein Paket mit einem `read()`-Aufruf zu bekommen, sondern auch damit, dass Du *unvollständige* Pakete bekommen kannst, wo Du erst mit dem einem, oder womöglich sogar mehreren `read()`-Aufrufen den Rest der Daten bekommst. Damit muss Dein Code klar kommen können.
Daher ist ja ØMQ so interessant: Low-level aber mit Komfortfunktionen und manchmal schneller als TCP allein.

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 09:44
von Dav1d
Bau dir einen Buffer mit dem io-Modul, in welchen du deinen ankommenden Daten schreibst, anschließend parst du die Packete aus dem Buffer.

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 11:30
von BlackJack
@Dav1d: Welchen Vorteil bringt das? Den Puffer kann man sich doch auch ganz einfach aus Zeichenketten selbst bauen.

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 11:37
von Dav1d
Um das Minecraft-Protokoll richtig parsen zu können brauchst du immer eine bestimmte Anzahl an Bytes, da ist ein einfaches buffer.read(bytes) einfacher und mMn auch schöner als buffer_str[:bytes], buffer_str = buffer_str[bytes:].

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 11:44
von BlackJack
@Dav1d: Ach so, dann willst Du keine Pakete lesen, sondern die Einzelteile von den Paketen. Das geht natürlich auch.

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 13:53
von Py-Prog
Dann hoffe ich dass das mit den vielen elif abfragen immer noch schnell genug ist ...

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 13:58
von deets
Ohne Code ist dazu natuerlich nicht viel zu sagen - aber ich behaupte mal, die vielen elifs sind mindestens mal schlecht programmiert. Denn wenn man Netzwerkprogrammierung betreibt, muss man halt das Protokoll implementieren. Was du nicht zu tun scheinst.

Und das profiling mit Python geht sollte dir eigentlich bekannt sein, oder?

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 14:34
von Dav1d
BlackJack hat geschrieben:@Dav1d: Ach so, dann willst Du keine Pakete lesen, sondern die Einzelteile von den Paketen. Das geht natürlich auch.
Das musst du sogar, weil es im Minecraft-Protokoll keinen Paket-Delimiter gibt, liest du einmal falsch, musst du neu connecten. Die einzige Möglichkeit die Pakete zu erzeugen ist es byte für byte zu lesen.

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 14:36
von Dav1d
Ach, ich habe nochmal meine IRC-Logs durchgeschaut ... es gibt schon einen funktionierenden Minecraftprotokoll-Parser in Python https://github.com/barneygale/barneymc (Es gibt mindestens noch einen weiteren, allerdings habe ich den Link auf die schnelle nicht gefunden)

Re: Schei� encoding

Verfasst: Sonntag 22. April 2012, 16:19
von BlackJack
@Dav1d: Ich weiss wie die Pakete aussehen, ich hätte trotzdem nicht für jedes Stück einen eigenen `read()`-Aufruf gemacht. Weil ich ja `io` nicht benutzt hätte.

Re: Schei� encoding

Verfasst: Montag 23. April 2012, 07:55
von Dav1d
@BlackJack, wie hättest du das gemacht? Mit Strings als Buffer?

Re: Schei� encoding

Verfasst: Montag 23. April 2012, 10:41
von BlackJack
@Dav1d: Ja, ich hätte die Funktionen zum Parsen der einzelnen Pakete so geschrieben, dass sie eine Ausnahme werfen wenn es nicht vollständig war und ansonsten zurück geben wie lang das Paket war. Wenn Pakete nicht vollständig sind, nicht besonders effizient, aber ich vermute so oft kommt das nicht vor.

Das ganze in einen entsprechenden Reader zu verpacken und dann eine `read()`-Methode zu haben, die auch (fast) garantiert die angeforderte Anzahl von Bytes liefert, ist natürlich schöner.

Re: Schei� encoding

Verfasst: Montag 23. April 2012, 17:34
von Py-Prog
Vielleicht solle ich mal sagen das die Pakete (in diesen Fall) eigentlich immer Komplett sind, das Problem tritt nur bei einem Freund von mir auf und der hat ein ziemlich lames Internet und dann kleben die Pakete nur hintereinander, aber komplett.

Re: Schei� encoding

Verfasst: Montag 23. April 2012, 18:10
von BlackJack
@Py-Prog: Das ist vollkommen egal was bei Dir oder Deinem Freund passiert, wichtig ist was grundsätzlich passieren kann. Wenn der Code nicht mit unvollständigen Paketen bei einem `read()` von einem `socket`-Objekt klar kommt, ist er schlicht kaputt und keine korrekte, brauchbare Implementierung des Protokolls. Denn so etwas kann, darf, und wird im realen Einsatz einfach irgend wann einmal bei irgend wem passieren.