2012-12-20 20 views
7

Poprawione Pytanie:Czy ktoś może lepiej wyjaśnić Dekodery/Enkodery?

Ok, więc próbuję włączyć to do mojej własnej gry na zamówienie. Rozumiem proces łączenia się Netty Servers i Clients. Rozumiem również, że dekodery i kodery działają w teorii. Ale oto, co nadal chciałbym zrozumieć.

Mój proces serwera:

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 

Po tym procesie Wiem, że muszę mieć obsługi świat tak, że każdy widzi aktualizacje w czasie zbliżonym do rzeczywistego. Teraz nie wiem, jak zaimplementować dekodery do tych rzeczy.

Naprawdę chciałbym zobaczyć kilka przykładów z kilkoma wyjaśnieniami, w jaki sposób są one realizowane. z zalecanymi instrukcjami .... Uwaga: Nie mówię, żebym rozwiązał ten problem, ale pokaż mi, jak postępować z różnymi informacjami. Najlepsze praktyki i standardy ...

+0

Chciałbym dodać, że odwołuję się do Netty API i jak to naprawdę używa dekoderów i koderów ... Czuję, że przewodnik nie wdaje się w szczegóły dotyczące implementacji własnych dekoderów i jak ... Chcę również powtórzyć, jak to powiedziałem po raz ostatni. Wkurzyłem w to przez chwilę i po prostu nie mogę tego uchwycić ... – Maxs728

Odpowiedz

7

Przesyłam this tutorial do rozważenia.

Nie próbowałem cię zastawić, ale starałem się wytłumaczyć te dokładne tajemnice.

Jest to drugi z serii, możesz również chcieć read the first one.

+0

Wciąż czytam twoją treść i wrócę później decyzją ... – Maxs728

+0

Przeczytałem wszystko w tym i choć tak, jest to bardzo przydatna informacja, że ​​była również bardzo teoretyczna i niezbyt pochopnie na przykładach kodu i tym podobnych ... Daje świetne pojęcie o tym, jak to działa. Dzięki! Ale wciąż mam poważne pytanie ... W jaki sposób wdrażasz swoje dekodery/kodery? – Maxs728

3

Osoby piszą własne kodery/dekodery (kodeki), ponieważ Netty nie narzuca ani nie definiuje protokołu na poziomie aplikacji, więc możesz napisać własny protokół. Zbiór kodeków, które definiujesz, jest protokołem, który może być czymkolwiek pomiędzy String a jakimś binarnym formatem, na przykład Protobuf. Netty zapewnia kodeki dla twojej wygody (te, których używałeś, są przykładami).

Założę się, że to powstrzyma strumień przed odcięciem wcześniej?

Zazwyczaj podczas wysyłania/odbierania strumieni, trzeba rozkładać się, że na długości stałych fragmentów (zwanych ramkami). Popularnym podejściem, stosowanym od zarania Internetu, jest użycie długości fragmentu (zwykle 4 bajty int) jako pierwszego pola odczytanego ze strumienia. Jeśli więc wartość pierwszego int wynosi 20, to wiesz, że następujące 20 bajtów jest ładunkiem (dane), a 21 bajt to pierwszy bajt o innej długości. Zaletą tego podejścia jest to, że pozwala na porcje o zmiennej długości. Ale nie jesteś do tego ograniczony. Na przykład, jeśli planujesz napisać protokół, który używa łańcuchów o wstępnie zdefiniowanej długości (z dopełnieniem), to napiszemy, a nawet lepiej, użyjemy bieżących kodeków Netty odpowiednich do tego.

Raz, wdrożono protokół z trzech dekoderów, że występy w tej kolejności:

  1. odbierania strumienia i rozkłada go na długość prefiksem ramek;
  2. przekształcić każdą klatkę na ciąg;
  3. użyj Jackson libray, aby przekonwertować ciąg na predefiniowany obiekt Java.

Enkodery wykonałyby te same operacje, ale od tyłu. Niestety, zgubiłem oryginalny kod, ale wkrótce go poprawię.

Ale w jaki sposób strumień wiedzieć, że strumień jest String lub serii INT lub seria podwaja? Jak powiedzieć, że różnica polega na pytaniu?

Krótka odpowiedź: nie wiadomo. Musisz zakodować te informacje w kodekach. Na przykład można użyć kodu operacji jako pierwszego pola w polu danych, które mówi, że ładunek to ciągi znaków, podwójne, int lub dowolne ich kombinacje.

Zasadniczo Netty zapewnia strumień i możesz go dowolnie dekodować. Na przykład, jeśli czytasz serię longów (8 bajtów), wtedy napiszesz kodek, który czyta 64 bajty na raz ze strumienia, ponieważ każdy z nich reprezentuje pojedynczą długą. Netty zapewnia kodeki gotowe do użycia, dzięki czemu nie musisz wymyślać koła za każdym razem.

+0

dziękuję, że ma sens i czyści to trochę ... W leasingu daje mi znać, że miałem dobre wrażenie, jak to działa ... – Maxs728

Powiązane problemy