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