2012-12-20 4 views
7

Überarbeitete Frage:Kann jemand Dekoder/Encoder besser erklären?

Ok, also versuche ich dies in mein eigenes maßgeschneidertes Spiel zu integrieren. Ich verstehe den Prozess der Verbindung von Netty Servern und Clients. Ich verstehe auch, wie die Decoder und Encoder in der Theorie arbeiten. Aber das möchte ich noch verstehen.

Mein Server-Prozess:

Server boots up -> Client starts 
Client requests connection -> Server accepts 
Server instructs client connection is good -> Client continues to the login screen 
(Ignoring any type of security protocol) 
Client sends username and password over Channel 
Server gets username and password checks it in the database or file 
Server pushes -> yes or no 
if yes Server sends player stats 
if no Server creates new player 

Nach diesem Prozess, den ich weiß, ich brauche einen Welt-Handler haben, so dass jeder Updates nahezu in Echtzeit zu sehen. Jetzt weiß ich nicht, wie man Decoder für dieses Zeug einsetzt.

Ich möchte wirklich einige Beispiele mit einigen Erklärungen sehen, wie sie implementiert werden. mit vorzugsweise einige Anweisungen .... Hinweis: Ich sage nicht, lösen Sie dieses Problem für mich, aber zeigen Sie mir, wie Sie mit den verschiedenen Informationen umgehen. Best Practices und Standards bitte ....

+0

Ich möchte hinzufügen, dass ich auf die netty API referenziere und wie es Decoder und Encoder wirklich verwendet ... Ich fühle mich, als ob der Führer nicht wirklich ins Detail geht über die Implementierung Ihrer eigenen Decoder und wie .. Ich möchte auch wiederholen, wie ich es das letzte Mal gesagt habe. Ich habe meinen Kopf eine Weile auf diesen Kopf geschlagen, und ich kann es einfach nicht begreifen ... – Maxs728

Antwort

7

Ich reiche this tutorial für Ihre Überlegung.

Nicht versuchen, Sie verpfänden, aber ich habe versucht, diese genauen Geheimnisse darin zu erklären.

Es ist die zweite in einer Reihe, möchten Sie vielleicht auch read the first one.

+0

Ich lese immer noch deinen Inhalt und werde später mit einer Entscheidung zurückkommen ... – Maxs728

+0

Ich lese alles darin und though Ja, es ist sehr nützliche Informationen, es war auch sehr theoretisch und nicht sehr hands on Code-Beispiele und solche Sachen ... Gibt ein großes Verständnis, wie es funktioniert. Vielen Dank! Aber mir bleibt noch eine große Frage ... Wie implementierst du deine Decoder/Encoder? – Maxs728

3

Die Leute schreiben ihre eigenen Encoder/Decoder (Codecs), weil Netty kein Anwendungsprotokoll vorschreibt oder definiert, so dass es Ihnen freisteht, Ihr eigenes Protokoll zu schreiben. Der Satz von Codecs, den Sie definieren, ist ein Protokoll, das alles zwischen String-basierten und einigen binären Formaten wie Protobuf sein kann. Netty stellt Codecs für Ihre Bequemlichkeit zur Verfügung (die, die Sie verwendeten, sind Beispiele).

Ich würde davon ausgehen, das aus dem Strom zu halten, ist eine frühzeitige Abschaltung zu sein?

Normalerweise, wenn Sie Senden/Empfangen von Streams, müssen Sie das auf einem festen Länge Chunks (Frames genannt) zersetzen. Ein beliebter Ansatz, der seit dem Beginn des Internets verwendet wird, besteht darin, die Länge des Chunks (normalerweise ein 4-Byte-Int) als das erste aus dem Stream gelesene Feld zu verwenden. Wenn also der Wert des ersten int 20 ist, wissen Sie, dass die folgenden 20 Bytes die Nutzdaten (die Daten) und das 21. Byte das erste Byte einer anderen Länge sind. Der Vorteil dieses Ansatzes besteht darin, dass er Stücke variabler Länge zulässt. Aber Sie sind nicht darauf beschränkt. Wenn Sie beispielsweise planen, ein Protokoll zu schreiben, das Strings mit vordefinierter Länge (mit Auffüllung) verwendet, schreiben Sie oder verwenden Sie besser noch netty die aktuellen Codecs.

Einmal implementiert I ein Protokoll mit drei Decodern, die in dieser Reihenfolge durchführen würden:

  1. einen Strom empfangen und zersetzen es in der Länge als Präfix Rahmen;
  2. wandeln Sie jeden Rahmen in eine Zeichenfolge um;
  3. Verwenden Sie Jackson Libray, um eine Zeichenfolge in ein vordefiniertes Java-Objekt zu konvertieren.

Die Encoder würden nur die gleichen Operationen ausführen, aber rückwärts. Leider habe ich den ursprünglichen Code verloren, aber ich werde ihn bald umschreiben.

Aber woher weiß der Strom, dass der Strom ein String oder eine Reihe von int ist oder eine Reihe von Doppel ist? Wie sagst du es, ist der Unterschied die Frage?

Kurze Antwort: es nicht weiß. Sie müssen diese Informationen in den Codecs verschlüsseln. Beispielsweise können Sie einen Opcode als erstes Feld in der Payload verwenden, das besagt, dass Payload Strings, Double, Ints oder eine Kombination aus beidem ist.

Grundsätzlich bietet Netty einen Stream und Sie können frei dekodieren, wie Sie möchten. Wenn Sie beispielsweise eine Reihe von Longs (8 Bytes) lesen, schreiben Sie einen Codec, der 64 Bytes gleichzeitig aus dem Stream liest, weil jeder einzelne einen Long repräsentiert. Netty bietet Codecs out-of-box, so dass Sie das Rad nicht jedes Mal neu erfinden müssen.

+0

danke, das macht Sinn und klärt es ein wenig ... Zumindest lässt mich irgendwie wissen, dass ich den richtigen Eindruck hatte, wie es funktioniert ... – Maxs728