Gra warcaby a sposoby komunikacji client serwer ?

0

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) [???]

0

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ść
0

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.

0

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().

0

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);
}
}

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