Witam pisze gre warcaby w javie sama consola zadnej grafiki i mam pytanie bo powiedziano mi ze serwer zajmuje się tylko przekazywaniem informacji. Jedyne co powinien zawierać to informację identyfikujące użytkowników. A klient musi zawierać plansze i stan gry na obecny czas. I moje pytanie brzmi jak zrobic taka komunikacje czy na watkach kazdy watek dla innego klienta jesli tak to jak przekazac dane z jednego klienta do drugiego skoro dla kazdego sa oddzielne watki (ten sam tylko ze dla kazdego wywoloany z osobna) [???]
Propozycja prostego rozwiązania:
- serwer czeka na 1 klienta
- serwer czeka na 2 klienta
- utworzenie 2 wątków komunikacyjnych
- przekazanie wątków watek1.setWatekKlienta(watek2), watek2.setWatekKlienta(watek1)
Rozwiązanie modelowe:
- serwer czeka na klienta
- tworzy wątek komunikacyjny
- zapamiętuje wątek w statycznej HashMapie (identyfikator to np nazwa użytkownika, a zawartość to sam wątek)
- komunikacja pomiędzy 2 klientami polega na wyciągnięciu odpowiedniego wątku z HashMapy i wykonanie metody wysyłającej wiadomość
Nie wiem czy to prawda ale ponoc ktos zrobil tak ze do jednego serwera laczy sie dwoch klientow na tym samym porcie [???] Tylko jakos trzeba to zsynchronizowac.
W wielowątkowych serwerach TCP zawsze robisz tak:
while (true) {
Socket gniazdoKlienta = gniazdoSerwera.accept();
//tworzysz wątek
//dodajesz go do wspólnej HashMapy
}
To wystrarczy na wykonanie synchronizacji. Nowy klient nie zostanie podłączony dopóki program nie wróci do metody accept().
Zrobilem cos takiego serwerek wielowatkowy w nim dwu elementowa tablica strumieni i "q" ktory wskazuje ktory to juz watek zostal wywolany.
import java.io.*;
import java.net.*;
class mojwatek extends Thread
{
Socket socket;
String przyszlo = null;
static BufferedReader in[] = new BufferedReader [2] ;
static PrintWriter out[] = new PrintWriter [2] ;
int q;
public mojwatek(Socket socket, int q) throws IOException
{
in[q]= new BufferedReader(new InputStreamReader(socket.getInputStream()));
out[q]= new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
this.socket = socket;
this.q = q;
}
public void run()
{
while (true)
{
try{
przyszlo = in[q].readLine();
System.out.println(przyszlo+" z watku "+q);
// q=0 pierwszy klient i watek
// q=1 drugi klient i watek
if (q==1){
System.out.println("cos");
out[0].println("poszlo z drugiego watku do pierwszego");
}else{
out[q].println("Podlaczyl sie watek "+q);
}
}catch (IOException e){}
try
{
socket.close();
}
catch (IOException e){
}
}
}
}
public class serwer_warcab
{
public static void main(String args[]) throws IOException{
ServerSocket socket = null;
Socket client = null;
try
{
socket = new ServerSocket(4444);
System.out.println(" *********************************************");
System.out.println(" * Serwer warcab gotowy do pracy *");
System.out.println(" *********************************************");
}
catch(IOException e)
{
System.err.println("Blad :/");
System.exit(1);
}
int q=0;
while(true)
{
try
{
client = socket.accept();
mojwatek w = new mojwatek(client,q);
w.start();
System.out.println(" -----> Polaczono z uzytkownikiem "+q);
q++;
}
catch(IOException e)
{
System.out.print("Blad");
System.exit(1);
}
}
}
}
W serwerze chce zrobic cos takiego aby kiedy podlaczy sie drugi klient czyli q=1 ktory wysyla jakis string do serwera to serwer wysle jakas tam wiadomosc do strumienia pierwszego watku ktory przekaze to do pierwszego klienta.Nie wiem czy sie jasno wyrazilem ;-) Chodzi mi o przekazanie jakiejs informacji od jednego klienta poprzez serwer wielowatkowy do drugiego klienta.
I gdy wywoluje out[0].println("poszlo z drugiego watku do pierwszego"); to nie wysyla do pierwszego tamten ma komunikat NULL a gdy out[1] to drugi klient wysle wiadomosc sam do siebie wiec w jego przpyadku dziala dlaczego nie dziala dla out[0] czyli pierwszego klienta i watku [???]
Jeszcze dorzuca kod klienta sluzy do testowania czy faktycznie cos przesyla.
import java.io.*;
import java.net.*;
public class Warcaby{
public static void main (String[]args) throws IOException {
Socket GniazdoClienta = null;
try { GniazdoClienta = new Socket("localhost",4444);}
catch (UnknownHostException e) {
System.err.println("Blad");
System.exit(1);
} catch (IOException e) {
System.err.println("Blad");
System.exit(1);
}
PrintWriter Wyjscie = new PrintWriter(GniazdoClienta.getOutputStream(), true);
BufferedReader Wejscie = new BufferedReader(new InputStreamReader(GniazdoClienta.getInputStream()));
BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
Wyjscie.println("jakis tekst");
String wer = Wejscie.readLine();
System.out.println(wer);
}
}