Jak rozplanować client-server

0

Witam,

Napisalem sobie hobbistycznie gre czolgi i chce do niej dorobic multiplayera (client server).
Problem jest taki, ze nie bardzo wiem jak to wszystko rozplanowac.

Pierwszy pomysl jest taki:
Jeden z graczy jest serverem, ma wlasna kopie planszy, a drugi jest clientem i tez ma swoja kopie planszy (w tym wypadku array[][]) w momencie gdy client powiedzmy rozwali jakas sciane wysyla o tym informacje do servera i na odwrot. Z tym ze to chyba bardziej P2P.

Drugi pomysl:
Jeden z graczy jest serverem, na ktorym jest plansza, a kazdy klient wysyla swoja pozycje i zachowania do serwera. Tylko nie bardzo rozumiem co dostaje w zamian, czy calego arraya ze stanem tablicy?

Jak powinno byc to rozwiazane od strony teoretycznej?
Dzieki z gory

0

Propozycja znacznie prostsza. Serwer jest niezależny, a do graczy wysyłane są migawki stanu gry. Oba klienty łączą się z serwerem przy pomocy adresu IP. Teraz to od graczy zależy, u którego z nich zostanie uruchomiona usługa serwera jako dodatkowa obok klienta. Mogą też zdecydować się na uruchomienie trzeciego komputera z serwerem.

0

Co w tym kontekscie znaczy 'migawki'?
Rozumiem ze kazdy z klientow bedzie wysyłał swoje położenie do serwera + akcje jakie wykonuje( a moze tylko informacje jaki klawisz został wcisniety, a przetworzeniem tego zajmie sie serwer?).
A serwer wysyła wszystkim graczom aktualny stan mapy ( czyli przesyła w tym wypadku calego arraya)

0

@nowy1234, Serwer zbiera informacje od graczy na dany "tik" zegara. Następnie rozsyła aktualny stan gry. Czyli innymi słowy A i B wysyłają do serwera stan mapy co pewien czas, serwer sumuje ten stan i rozstrzyga konflikty (jednostki trafione, zderzenia) i odsyła graczom nowy stan. Serwer nie wykonuje żadnych obliczeń związanych z grafiką itp. To liczą klienty na podstawie tablicy stanu.

0

Czyli na tym konkretnym przykładzie,
gracze wysyłaja do serwera dwuwymiarowa tablice(ktora zawiera informacje o tym czy np sciana stoi czy jest zburzona) do serwera, serwer sumuje takie tablice od obu graczy i odsyła im zsumowana.

dobrze rozumuje ?

0

Dokładnie, przy czym o tym czy ściana jest zburzona powinien raczej decydować serwer na podstawie obliczanego stanu gry.

0

Napisałem sobie juz prosty klient-serwer, ale niestety działa on tylko z jednym klientem.
Kod watku odpowiedzialnego za obslugiwanie poszczegolnego polaczenia wyglada tak:

				    out.writeObject(wall);
				    
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
				wall=(int[][])in.readObject();

przy czym kod klienta ma konstrukcje odwrotna, czyli najpierw wczytuje te sciany, a pozniej wysyła swoje (ten sleep 2000 jest taki przykladowy dla mnie zeby troche spowolnic prace tej czesci programu).
Serwer pracuje na jedej kopii tego arraya wall i prawdopodobnie to stwarza problem, ktorego nie ma w przypadku pracy z jednym klientem.
Najczesciej wyrzuca exception
Exception in thread "Thread-2" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to [[I

Na co powinienem zwrocic uwage? Czego tu brakuje?

hmm?

0

Wiesz co... padł mi komp... i nie za bardzo mogę pomóc od ręki. Generalnie http://4programmers.net/Java/Kody_%C5%BAr%C3%B3d%C5%82owe/Klientserver_multithreaded.zip przykładowy kod z naszego serwisu z wielowątkowym serwerem.

0

nie ma tej paczki juz chyba na stronie.
Anyway, wygooglowalem to i tam jest bardziej jednokierunkowa komunikacja, w sensie klient -> server.
Server nie wysyła zadych wiadomosci do klienta i nie korzystaja ze wspolnych wartosci, tak jak ma to miejsce u mnie

0

Ale masz chorobliwe problemy logiczne :P

Też kiedyś miałem bzika na czołgi multiplayer, ale mimo że było to wprawdzie moje pierwsze "prawdziwe coś", to nie miałem praktycznie problemów z obmyśleniem jak to ma być...
Może powinieneś się przyjrzeć najpierw kilku podobnym grom open source'owym?

Twoja mapa to tablica wartości.. no, cóż.. jakbym nie potrafił inaczej to robiłbym i tak.. ale dlaczego akurat intów? przecież każdy int to 4 bajty, a ile różnych wartości ty tam trzymasz? pewnie nie przekraczasz nawet 10, bo ileż stanów może mieć mapka. wysyłasz 4 razy więcej bajtów niż potrzebujesz.

poza tym według mnie serializacja to zły pomysł dla gry real-time multiplayer, powinieneś raczej słać czyste wartości w pakietach (czy nie wiem jak to nazwać).. przed każdym takim pakietem wysłać w 2 lub 3 bajtach długość pakietu. kolejny bajt lub dwa to typ pakietu... reszta to tablica bajtów. kolejność i typy danych powinien znać tak client jak serwer - informacje o tym jaki to typ pakietu (id) dostaje przecież przy jego odbieraniu. wiemy zatem, że np pakiet o id 1 ma taką składnię int,int,bajt. pakiet o id 2 int,string itd. wiemy też co np. client chciał osiągnąć, wysyłając ten pakiet... powiedzmy, że pakiet o id 2 to wiadomość prywatna, wiemy co z tym zrobić: pierwszy int to identyfikator innego gracza, string to wiadomość dla niego.

to tyle jeśli chodzi ogółem o komunikację client<->serwer. nie wiem, może są lepsze sposoby na to - ja robiłem to tak :)

dalej... stan całej mapy powinien być wysyłany tylko raz - kiedy client się połączy. wszelkie zmiany stanów mapy powinny być wysyłane w pojedynczych pakietach. o np takiej składni: bajt,bajt,bajt - gdzie pierwsze dwa to x,y mapy, trzeci to nowy stan dla tego pola mapki.
i to serwer ma decydować o zmianach stanów tych pól, nie client. client co najwyżej może powiedzieć, że chce strzelić, a serwer może mu na to pozwolić bądź nie (bo np. nie ma amunicji albo przeładowuje). serwer, jesli client moze strzelac, powinien wtedy wyslac wszystkim pakiet o tym, ze dany client strzelił, z danymi takimi jak id clienta, który strzelił; stronę, w którą strzelił (może być kąt nachylenia, a jak nie umiesz, moze byc tez NSWE)

więcej na razie lepiej nie napiszę, bo się okaże jeszcze, ze bzdury plotę.. a im więcej tych bzdur napiszę, tym dłużej będę się potem ciął w kącie płacząc nad swoją bezsensownością :P

0
Keraj napisał(a)

więcej na razie lepiej nie napiszę, bo się okaże jeszcze, ze bzdury plotę.. a im więcej tych bzdur napiszę, tym dłużej będę się potem ciął w kącie płacząc nad swoją bezsensownością :P

Dla mnie juz wszystko jasne :)
Rzeczywiscie przesyłanie całych tablic (w dodatku intow) jest za wolne, bo mi sie program wywalal w bardzo krotkim czasie.

Dziekuje wszystkim za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1