2011-09-28 11 views
7

W przypadku szkolnego projektu mamy stworzyć grę wieloosobową w Javie (powinien to być klient/serwer), który można odtwarzać przez Internet (programujemy to w szkole, więc to nie jest praca domowa). Ta gra jest turowa, ale powinien odbyć się czat, który oczywiście odbywa się w czasie rzeczywistym. Jednak nikt z nas nie ma doświadczenia z programowaniem sieciowym i im więcej o tym czytam, tym więcej pytań mam.Java dla wielu graczy - koncepcje sieciowe

Moja pierwsza myśl polegała na wykorzystaniu interfejsu API gniazda do implementacji części dla wielu graczy. Serwer czeka na nowe dane od klientów. Jednak istnieje wiele rodzajów danych do odebrania, takich jak wiadomości na czacie, ruch itp. Ponadto, po nawiązaniu połączenia z serwerem, należy wysłać pewne dane początkowe (takie jak nazwa gracza). Serwer powinien być w stanie zobaczyć, jaki rodzaj wiadomości otrzymał, ale w jaki sposób? Myślałem o stworzeniu klasy Message z polem ciągu type. Ale w moim kodu serwera, dostanę kod tak:

Gdy istnieje wiele różnych rodzajów danych do wysłania (i nie będzie), to nie wygląda jak najbardziej efektywny sposób. Ponadto oznaczałoby to, że zarówno serwer, jak i klient powinni mieć tę klasę/interfejs wiadomości (duplikat kodu).

Co z innymi grami? Na przykład gracz 1 przesuwa swoją postać na pozycję, która pokonuje inną postać. Klient gracza 1 oblicza to pokonanie i stosuje odpowiednie akcje. Ale co należy wysłać na serwer? Tylko pozycja nowego gracza, czy też porażka? W przypadku pierwszej opcji oznacza to, że wszyscy inni klienci powinni wykonywać obliczenia. Czy nie mogło to sprawić kłopotu? Ponieważ nie mam doświadczenia w programowaniu sieciowym, jestem nieco zdezorientowany, jak to zrobić.

Czytałem również w innym wątku tutaj na Stackoverflow, że RMI może być lepszym rozwiązaniem. Po przeczytaniu niektórych informacji na ten temat, rozumiem, czym jest RMI, ale nadal nie jestem w stanie sprawdzić, czy jest to dobra opcja dla tego projektu, czy nie. Wszelkie wskazówki na ten temat?

Jak widzisz, jestem nieco zdezorientowany, jak zacząć od części sieciowej tego projektu. Szukałem książek o programowaniu gier (w języku Java), ale żadna z nich nie dotyczy wyłącznie sieci. Szukałem także książek sieciowych w Javie, ale wydaje się, że koncentrują się one na technologii, a nie na dobrych praktykach kodu.

Jeśli ktoś zna dobrą książkę lub ma jakąś radę w prawidłowej diecie, byłoby to bardzo cenne.

Dzięki

+7

„... programowanie to w szkole, więc nie jest to praca domowa” . Klasyczny. – CPerkins

+0

Przynajmniej nie chce kodu. –

+0

@CPerkins: Powinniśmy pracować nad tym projektem w szkole, tak. Nie proszę nikogo o wykonanie mojej pracy, tylko o poradę, jak to wdrożyć. – Bv202

Odpowiedz

7

Jesteś na dobrej drodze, ale istnieje kilka rzeczy wyjaśnić.

Jeśli korzystasz z gniazd, zorientujesz się, że musisz zdefiniować protokół - wspólny język komunikacji ruchów i stan gry. Gniazda umożliwiają wysyłanie dowolnych danych w praktycznie dowolnym formacie. Wygląda na to, że myślisz o serializowaniu wiadomości klasy, aby wysłać ten typ, to jest jedna z robienia rzeczy. Jeśli używasz RMI (który ma własny protokół), będziesz działał tak, jakbyś wywoływał metody Java, ale w istocie robisz coś podobnego, szeregując dane i przekazując je przez gniazdo.

Nie ma nic niejawnie nie w porządku w dzieleniu kodu między klientem a serwerem - w rzeczywistości większość usług robi to w jakiejś formie. Twój klient i serwer mogą używać wspólnej biblioteki do definiowania przekazywanych klas wiadomości. RMI wykorzystuje kody pośredniczące do określenia interfejsu. Usługi internetowe wszelkiego rodzaju definiują sposób wywoływania metod. Ogólną ideą jest ujawnienie interfejsu, a nie jego implementacja.

chodzi o kod, to może być czystsze mieć inną podklasę wiadomość dla każdego typu wiadomości i można umieścić dodatkowe parametry dla każdej wiadomości. Można wtedy mieć klasę MessageProcessor odczuwalna:

class MessageProcessor{ 
    void process(Move1Message m) {...} 
    void process(Move2Message m) {...} 
    .... 

} 

dotyczące tego, co wysłać - ogólna zasada powinna być to, że klient jest odpowiedzialny za wysyłanie ich ruch do serwera, cokolwiek robi to bonus, ponieważ serwer musi zweryfikować legalność przeniesienia. Serwer powinien być zawsze wyznacznikiem stanu gry, aby uniknąć oszustwa i błędne klient realizacje

Jeśli nie jesteś zainteresowany dowiedzieć się, jak zaimplementować swój własny protokół lub użyć Java gniazd biblioteki, to będzie łatwiej korzystać z RMI. Możesz również użyć SOAP, REST lub dowolnego innego protokołu, ale nie zastanawiałbym się zbytnio nad tym, którego użyć w danej chwili. Nie mam żadnych sugestii poza the RMI documentation, choć myślę, że this book miał wiele przykładów kodu do sieci.

0

idąc z gniazdami każdy klient będzie miał swoje własne połączenie, na którym serwer będzie czekać gwint (nie zapomnij opróżnić strumienia po stronie klienta lub będziesz czekać wiecznie)

każda linia będzie oddzielny komunikat i różnicowania typów wiadomości można użyć „nagłówek” na początku każdej wiadomości (specyficzna sekwencja 3-znakowy na początku) powiedzieć msg, mov, lgn i używać trie -jak wybór za pomocą przełączników szybko zdecydować który masz


wh pl przy użyciu RMI można mieć serwer zachować obiekt Manager (eksportowane i zarejestrowana w rejestrze), na której klient może zażądać „Połączenia” -przedmiot która będzie taka sama, jak w realizacji połączenia gniazda, ale będziesz mógł mieć metodę dla każdego coś chcesz zrobić chociaż callbacks będą musiały być wykonane w inny sposób (z gniazdami masz połączenie gotowe do niego)

Powiązane problemy