Jestem już w domu więc się rozpiszę :)
Twoja aplikacja składa się w sumie z dwóch programów.
Pierwszy to serwer do którego zadań należą:
- Zapewnienie komunikacji pomiędzy aplikacjami klienckimi
- Dostarczenie części konfiguracji do aplikacji klienckich.
Drugim programem jest klient. Jego zadaniem jest:
- Dostarczenie interfejsu użytkownika
- Obsługa logiki "biznesowej" aplikacji, czyli gry w szachy
- Obsługa komunikacji z serwerem.
Jeżeli chcesz, aby wszystko działało dobrze to zacznij od przygotowania protokołu komunikacyjnego najwyższej warstwy. Będzie on zapewniał wspólny język na poziomie "biznesowym" aplikacji. Mówiąc prościej opracuj to w jakim formacie będziesz przesyłał dane o np. ruchu. Moja propozycja:
import java.io.Serializable;
public class Komunikat implements Serializable{
private static final long serialVersionUID = -3979320124811867075L;
public final String[] RUCH;
public final long id;
public Komunikat(String[] ruch, long id) throws Exception{
if (ruch.length != 2)
throw new Exception("Zły argument!!!");
this.RUCH = ruch;
this.id = id;
}
}
Jak widać klasa Komunikat zawiera jedno pole RUCH, które definiuje początkową i końcową pozycję oraz identyfikator klienta. Posłuży nam do przekazywania najprostszych informacji. To będzie jedyna rzecz którą robi. Reszta to ozdobniki pozwalające na identyfikację.
Teraz popatrzmy jak to ma działać:
Wysyłanie komunikatu:
Użytkownik wykonuje ruch -> aplet sprawdza jego poprawność ->
jeżeli ruch jest nieprawidłowy to pokazuje się odpowiedni komunikat -> koniec;
jeżeli ruch jest prawidłowy -> stworzony zostanie obiekt Komunikat w którym zapisane są informacje o tym ruchu -> Obiekt zostaje przekazany do modułu wysyłającego go na serwer -> Komunikat zostaje wysłany -> czekamy na komunikat zwrotny ->
jeżeli doszedł zmieniamy flagę canMove na false, gracz czeka na ruch przeciwnika -> koniec;
jeżeli flaga zwrotna nie doszła -> komunikat o błędzie -> koniec;
Otrzymywanie komunikatu:
Osobny wątek nasłuchuje na określonym porcie -> pojawia sie komunikat -> zostaje wykonany ruch -> zmieniamy flagę canMove na true -> wysyłamy komunikat zwrotny -> czekamy na wykonanie ruchu przez użytkownika.
Po co serwer?
Serwer dogaduje dwa programy klienckie. Jak działa:
Serwer oczekuje i nasłuchuje na ogólnym porcie -> pojawia się nowy klient -> zostaje mu nadany identyfikator -> zostaje utworzony wątek o nazwie takiej jak identyfikator klienta, od tego momentu klient jest traktowany indywidualnie -> dopisujemy go, wątek, do kolejki wolnych graczy
Pojawia się drugi klient -> sprawdzamy czy są wolni gracze ->
jeżeli nie ma to postępujemy jak wyżej;
jeżeli są -> wybieramy gracza z kolejki wolnych graczy jeden z wątków -> rejestrujemy w nim drugiego gracza -> wysyłamy powiadomienia do obu o rozpoczęciu gry;
Gra na serwerze:
Serwer odbiera komunikat -> sprawdza id -> odsyła do konkretnego wątku -> wątek przesyła komunikat dalej za pomocą odpowiednich obiektów.
Proste :) dzięki identyfikacji użytkowników wszytko może działać na jednym porcie na serwerze i jednym, porcie na kliencie :)