# Server - Client Probleme



## Drao (15. Jun 2011)

Guden, 
bin neu hier, also erst mal Hallo an alle. 
Ich komme ja eher aus der C/C++ richtung, und konnte davon bis jetzt auch viel
in Java benutzen, und komme auch mit der Java Programmierung im eigentlichen sinne klar. 
Nur wenns nun um Client und Server zeugs gehts, da komme ich noch nicht so zurecht.

Nun zum Programm: 
[JAVA=42]

import javax.swing.JOptionPane;
public class SSPvsPlayer {

		public static void main(String[] args)
		{
			int player_one;
			int player_two;
			int gewinner;
			String eingabe;
	//		String x = null;	// Umwandlung der Auswahl von Spieler (1)
	//		String y = null;	// Umwandlung des Auswahl von Spieler (2)

			// Display
			eingabe=JOptionPane.showInputDialog(null, "Stein, Schere, Papier! \n\nSpieler (1)\n\n Chose " +
			"(0) for Quit. \n Chose (1) " + "for 'Stein',\n Chose (2) for 'Schere',\n Chose (3) for 'Papier'.\n\n");
			player_one = Integer.parseInt(eingabe);

			while(player_one != 0)
			{ 
				// Spieler (2)
				eingabe=JOptionPane.showInputDialog(null, "Stein, Schere, Papier! \n\n Spieler (2)\n\n Chose " +
				"(0) for Quit. \n Chose (1) " + "for 'Stein',\n Chose (2) for 'Schere',\n Chose (3) for 'Papier'.\n\n");
				player_two = Integer.parseInt(eingabe);


				 // Gewinner Reset!
	            gewinner = 0; 

	            // Spiel
				if(player_one == 1 && player_two == 2) {gewinner = 1;} 	// Stein vs. Schere 	= Spieler 	Gewinnt
				if(player_one == 1 && player_two == 3) {gewinner = 2;} 	// Stein vs. Papier 	= Computer 	Gewinnt
				if(player_one == 2 && player_two == 3) {gewinner = 1;}	// Schere vs. Papier 	= Spieler 	Gewinnt
				if(player_one == 2 && player_two == 1) {gewinner = 2;}	// Schere vs. Stein 	= Computer 	Gewinnt
				if(player_one == 3 && player_two == 1) {gewinner = 1;}	// Papier vs. Stein 	= Spieler 	Gewinnt
				if(player_one == 3 && player_two == 2) {gewinner = 2;}	// Papier vs. Schere 	= Computer 	Gewinnt

		///////////////////////////////////////////////////////////////////////////////////////

				String x = null;					// Umwandlung der Auswahl von Spieler (1)
				String y = null;					// Umwandlung des Auswahl von Spieler (2)

				// Spieler (1)
				if (player_one == 1)	{x = "  'Stein'";}
				if (player_one == 2)	{x = "  'Schere'";}
				if (player_one == 3)	{x = "  'Papier'";}
				if (player_one > 3)		{x = "  Falsche Eingabe!";}

				// Spieler (2)
				if (player_two == 1)	{y = "  'Stein'";}
				if (player_two == 2)	{y = "  'Schere'";}
				if (player_two == 3)	{y = "  'Papier'";}
				if (player_two > 3)		{y = "  Falsche Eingabe!";}


		///////////////////////////////////////////////////////////////////////////////////////

				if (player_one > 3) 				// Falsche Eingabe, Eingabe > 3
				{
					JOptionPane.showMessageDialog(null, "Sie haben eine Falsche Zahl eingegeben!\n"
					+ "\nSpieler (1) : " + player_one + x + "\nSpieler (2) : " + player_two + y,
					"Fehlermeldung!", JOptionPane.ERROR_MESSAGE); 
				}
	            if (gewinner == 0) 					// Draw!
	            {
	            	if (player_one == player_two)	// Damit 'Draw!' nur kommt wenn WIRKLICH 'Draw!' ist!
	            	{
	            		JOptionPane.showMessageDialog(null,"DRAW!\n"
	            		+ "\nSpieler (1) : " + player_one + x + "\nSpieler (2) : " + player_two + y,
	            		"Ausgabe", JOptionPane.INFORMATION_MESSAGE);
	            	}
	            }
	            else 
	            { 	if (gewinner == 1)				// Spieler (1) Gewinnt
	                {
		    		    JOptionPane.showMessageDialog(null,"SPIELER (1) hat gewonnen! \n"
				        + "\nSpieler (1) : " + player_one + x + "\nSpieler (2) : " + player_two + y,
				    	"Ausgabe", JOptionPane.INFORMATION_MESSAGE);
		    		}
	            	else							// Spieler (2) Gewinnt
	            	{
	            		JOptionPane.showMessageDialog(null,"SPIELER (2) hat gewonnen! \n"
	            		+ "\nSpieler (1) : " + player_one + x + "\nSpieler (2) : " + player_two + y,
	            		"Ausgabe", JOptionPane.INFORMATION_MESSAGE);
	            	}
	            }

	            // Display - Eingabe bis Auswahl (0) für Quit!
	            eingabe = JOptionPane.showInputDialog(null, "Stein, Schere, Papier! \n\nSpieler (1)\n\n Chose " +
	            "(0) for Quit. \n Chose (1) " + "for 'Stein',\n Chose (2) for 'Schere',\n Chose (3) for 'Papier'.\n\n");
	            player_one = Integer.parseInt(eingabe);

			}

		System.exit(0); // Quit!
		}
	}
[/code]

Das Läuft bereits, ist auch nicht wirklich Schwer gewesen, wenn man mal drauf gekommen ist, 
wie man es am besten umsetzt, aber das ist auch nicht mein Problem. 

Ich möchte die fenster für die benutzereingabe in den client und die Spielelogik in den server einbauen. Der client nimmt ja die Eingaben vom Benutzer entgegen und gibt Sie an den server weiter. Der Server wartet bis beide clients die Eingaben an ihn übermittelt haben und wertet dann aus, wer gewonnen hat. 
und das ergebnis wird dann vom server an die clients zurückgesendet.  zu guter letzt soll der client die Ergebnisse entgegen nehmen und dann halt ausgeben, so wie oben im programm,
wobei mir die graphische darstellung erst mal egal ist, geht erst mal ums prinzip, verständniss.

Das ist mein Multiserver bis jetzt.

[JAVA=42]
import java.net.*;
import java.util.Observable;
import java.util.Observer;
import java.io.*;
public class MultiServerThread extends Thread implements Observer{
	private Socket socket = null;
	PrintWriter out;
	ThreadCom threadCommunication;

	public MultiServerThread(Socket socket,ThreadCom threadCommunication) {
		//super("MultiServerThread");		
		this.socket = socket;
		this.threadCommunication= threadCommunication;
		threadCommunication.addObserver(this);
	}

	public void run() {
		try {


			out = new PrintWriter(
			socket.getOutputStream(), true);
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String inputLine;

			boolean quit=false;
			while(!quit){
				inputLine = in.readLine();

				if (inputLine.equalsIgnoreCase("quit")){
					quit = true;
					System.out.println(this.getName()+" id "+this.getId() + " Server-Thread wird beendet!");
					out.println("Serververbindung wird beendet!");
				}else{
					System.out.println("MultiServer: "+this.getName()+": "+inputLine);
					threadCommunication.sendChatString(this.getName()+": "+inputLine);
				}
			}
			threadCommunication.deleteObserver(this);
			out.close();
			in.close();
			socket.close();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}

//	@Override
	public void update(Observable arg0, Object chatString) {
		out.println(chatString);
	}
}
[/code]

Und das mein Client: 
[JAVA=42]
import java.io.*;
import java.net.*;
public class EchoClientErzeuger extends Thread{

	BufferedReader in;

	EchoClientErzeuger(BufferedReader in){
		this.in=in;
	}

	public static void main(String[] args) throws IOException {
		Socket echoSocket = null;
		PrintWriter out = null;
		BufferedReader in = null;
		try {
			echoSocket = new Socket("127.0.0.1", 5444);
			out = new PrintWriter(echoSocket.getOutputStream(), true);
			in = new BufferedReader(
			        new InputStreamReader(echoSocket.getInputStream()));
		}catch (UnknownHostException e) {
			System.err.println("Don't know host: localhost");
			System.exit(1);
		}catch (IOException e) {
			System.err.println("Couldn't get I/O for connection to: 			localhost");
			System.exit(1);
		}
		new EchoClientErzeuger(in).start();
		BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
		String userInput;
		while ((userInput = stdIn.readLine()) != null) {
			out.println(userInput);
		}
		out.close();
		in.close();
		stdIn.close();
		echoSocket.close();
	}

	public void run() {
		String incoming;
		try{			
			while(true){
				incoming = in.readLine();
				if(incoming==null){
					break;
				}
				System.out.println(incoming);
			}
			System.out.println("Chat wird beendet");
			in.close();
		}catch(SocketException se){
			System.out.println("Verbindung zum Server unterbrochen");
		} catch (IOException e) {
			System.out.println("Verbindung zum Server unterbrochen");
		}
		System.exit(0);
	}

}
[/code]

Das die können schon miteinandern Kommunizieren, aber ich weiss einfach nicht wie ich
das umsetzen soll, ihr soll es mir nicht lösen, davon hab ich nichts, ich brauch einfach 
mal jemand der mit ein wenig hilft, oder tipps gibt, denn für irgendwas ist so ein forum ja schließlich da.

Werde in der Zeit mal weitermachen und dann entsprechende Updates Posen.
Vielen Dank schon mal allein fürs ansehen


----------



## SlaterB (15. Jun 2011)

meine Hilfe an dich wäre deine Gedanken zu ordnen und konkrete Abläufe einzubauen und zu konkreten Fragen zu kommen,

die Clients sollen irgendwas senden, ob aus einer GUI heraus oder testweise per Zufallswert? ja dann mache das doch,
bisher ist wenig zu sehen

der Server empfängt diese Daten je Client, muss sie irgendwie von anderen unterschieden (du erkennst ja schon quit/ nicht quit)
und deiner Beschreibung nach müssen alle Nachrichten in einer Klasse zusammengeführt werden,
an Code ist davon nichts zu sehen bisher, wenn du nicht anfängst dann wirds auch nix, das ist keine Standardlösung die nachzulesen ist,
da musst du vom kleinen if bis zur großen Verarbeitungsklasse alles Schritt für Schritt einbauen

evtl. kannst du noch vorher versuchen, den Standardcode in Basisklassen/ Methoden auszulagern,
sonst sieht man deine wichtigen Befehle zwischen all den langweilien try/catches und BufferedReader-Definitionen gar nicht mehr


----------



## Drao (18. Jun 2011)

Update: 

EchoClient

```
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class EchoClient {
	public static void main(String[] args) throws IOException {
		Socket echoSocket = null;
		PrintWriter out = null;
		BufferedReader in = null;
		try {
			echoSocket = new Socket("127.0.0.1", 5444);
			out = new PrintWriter(echoSocket.getOutputStream(), true);
			in = new BufferedReader(
			        new InputStreamReader(echoSocket.getInputStream()));
		}catch (UnknownHostException e) {
			System.err.println("Don't know host: localhost");
			System.exit(1);
		}catch (IOException e) {
			System.err.println("Couldn't get I/O for connection to: 			localhost");
			System.exit(1);
		}
		BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
		String userInput;
		while (true) {
			out.println(auswahl());
			try{
				String egb=in.readLine();
				System.out.println("echo: " + egb);
			}catch(SocketException se){
				System.out.println("Verbindung zum Server unterbrochen");
			}
		}
//		out.close();
//		in.close();
//		stdIn.close();
//		echoSocket.close();
	}
	public static int auswahl()
	{
		System.out.print("Mache eine Auswahl:\n\n1. Spieler vs Computer\n2. Spieler vs Spieler\n0. Beenden\nAuswahl eingeben:");
		Scanner scanner = new Scanner(System.in);
	    int r = scanner.nextInt();
	    return r;
		/*String eingabe = JOptionPane.showInputDialog(null, "Wählen Sie den gewünschten Spielmodus aus \n\n Auswahl (0) zum Beenden \n Auswahl (1) für 'Spieler gegen Spieler'\n Auswahl (2) für 'Spieler gegen Computer'\n"  );
		return Integer.parseInt(eingabe);*/
	   	}
	

}
```



EchoClientErzeuger

```
import java.io.*;
import java.net.*;
public class EchoClientErzeuger extends Thread{
	
	BufferedReader in;
	
	EchoClientErzeuger(BufferedReader in){
		this.in=in;
	}
	
	public static void main(String[] args) throws IOException {
		Socket echoSocket = null;
		PrintWriter out = null;
		BufferedReader in = null;
		try {
			echoSocket = new Socket("127.0.0.1", 5444);
			out = new PrintWriter(echoSocket.getOutputStream(), true);
			in = new BufferedReader(
			        new InputStreamReader(echoSocket.getInputStream()));
		}catch (UnknownHostException e) {
			System.err.println("Don't know host: localhost");
			System.exit(1);
		}catch (IOException e) {
			System.err.println("Couldn't get I/O for connection to: 			localhost");
			System.exit(1);
		}
		new EchoClientErzeuger(in).start();
		BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
		String userInput;
		while ((userInput = stdIn.readLine()) != null) {
			out.println(userInput);
		}
		out.close();
		in.close();
		stdIn.close();
		echoSocket.close();
	}
	
	public void run() {
		String incoming;
		try{			
			while(true){
				incoming = in.readLine();
				if(incoming==null){
					break;
				}
				System.out.println(incoming);
			}
			System.out.println("Chat wird beendet");
			in.close();
		}catch(SocketException se){
			System.out.println("Verbindung zum Server unterbrochen");
		} catch (IOException e) {
			System.out.println("Verbindung zum Server unterbrochen");
		}
		System.exit(0);
	}

}
```


Multiserver

```
import java.io.IOException;
import java.net.ServerSocket;

public class MultiServer {
	public static void main(String[] args) throws IOException{
		ServerSocket serverS = null;
		boolean listening = true;
		try {
			serverS = new ServerSocket(5444); // irgendeine Port-Nummer
		}catch (IOException e) {
			System.err.println("Could not listen on port: 5444.");
			System.exit(-1);
		}
		ThreadCom threadCommunication= new ThreadCom();

		while (listening){
			new MultiServerThread(serverS.accept(),threadCommunication).start();		
		}
	}
}
```


MultiserverThread

```
import java.net.*;
import java.util.Observable;
import java.util.Observer;
import java.io.*;
public class MultiServerThread extends Thread implements Observer{
	private Socket socket = null;
	PrintWriter out;
	ThreadCom threadCommunication;
	
	public MultiServerThread(Socket socket,ThreadCom threadCommunication) {
		//super("MultiServerThread");		
		this.socket = socket;
		this.threadCommunication= threadCommunication;
		threadCommunication.addObserver(this);
	}
	
	public void run() {
		try {

			
			out = new PrintWriter(socket.getOutputStream(), true);
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String inputLine;
			
			boolean quit=false;
			while(!quit){
				inputLine = in.readLine();
				
				if (inputLine.equalsIgnoreCase("quit")){
					quit = true;
					System.out.println(this.getName()+" id "+this.getId() + " Server-Thread wird beendet!");
					out.println("Serververbindung wird beendet!");
				}else{
					System.out.println("MultiServer: "+this.getName()+": "+inputLine);
					threadCommunication.sendChatString(this.getName()+": "+inputLine);
				}
			}
			threadCommunication.deleteObserver(this);
			out.close();
			in.close();
			socket.close();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}

//	@Override
	public void update(Observable arg0, Object chatString) {
		out.println(chatString);
	}
}
```

ThreadCom

```
import java.util.Observable;

public class ThreadCom extends Observable{
	public void sendChatString(String chatString){
	    setChanged(); 
	    notifyObservers( chatString ); 
	}	
}
```

joar aber irgendwie läufts immernoch nicht so ganz, weiss aber nicht genau warum. 
wäre nice wenn jemand mal drüber schauen könnte.


----------



## SlaterB (19. Jun 2011)

ich kann es mir bald genauer anschauen, bisher nur nach Code sieht doch alles schick aus,
hast du denn ein konkretes Problem welches du als Information dazugeben kannst, kommt irgendeine Nachricht nicht an?


----------



## Drao (19. Jun 2011)

Geschafft, die über mittlung geht! 

So die übermittlung geht, nur wie kann man es nun am Besten darstellen ?

Client:

```
import java.net.*;
import java.util.Scanner;
import java.io.*;


public class Client {

	Client() throws IOException {
		// Herstellen der Verbindung zum Server
		Socket server = new Socket ( "localhost", 8888 );
		InputStream input = server.getInputStream();
		OutputStream output = server.getOutputStream();
		
		int spieler1 = 0;
		System.out.print("Waehle eine Zahl zwischen 1 und 3:\n1 = Stein\n2 = Schere\n3 = Papier\nAuswahl eingeben:");
		Scanner scanner = new Scanner(System.in);
		spieler1 = scanner.nextInt();
		// Übermittlung der Auswahl
		output.write( spieler1 );

		// Ausgabebuffer wird geleert
		output.flush();
		
		// Das ergebnis wird von der Eingabe gelesen und auf die Konsole geschrieben
		int erg = -1;
		erg = input.read();
		//System.out.println(erg);
		
		if(erg == 0){
			System.out.println("Leider Unentschieden!\n");
		}
		else
		if(erg == 1){
			System.out.println("Stein vs. Schere = Spieler Gewinnt!\n");
		}
		else
		if(erg == 2){
			System.out.println("Schere vs. Papier = Spieler Gewinnt!\n");
		}
		else
		if(erg == 3){
			System.out.println("Papier vs. Stein = Spieler Gewinnt!\n");
		}
		else
		if(erg == 4){
			System.out.println("Schere vs. Stein = Computer Gewinnt!\n");
		}else
		if(erg == 5){
			System.out.println("Papier vs. Schere = Computer Gewinnt!\n");
		}
		else
		if(erg == 6){
			System.out.println("Stein vs. Papier = Computer Gewinnt!\n");
		}
	

	
		// Verbindung zum Server wird beendet
		server.close();
		
		// Eingabe und Ausgabestrom schließen
		input.close();
		output.close();
	}
	
public static void main(String[] args) {
	try { Client client = new Client(); } 
	catch (IOException e){ System.out.print(e); }
	}

}
```

Server:

```
import java.net.*;
import java.io.*;

public class Server {

    ServerSocket server = new ServerSocket(8888);
   
    Server() throws IOException {
        while ( true ){
            Socket client = server.accept();
            InputStream input = client.getInputStream();
            OutputStream output = client.getOutputStream();
            int spieler1 = input.read();
           
            // Randomwert vom Computer
            int computer = 0;
            computer = (int)((Math.random()) * 2 + 1);
           
            if (spieler1 == computer){
                output.write(0);
            }
           
            // Stein vs. Schere     = Spieler     Gewinnt
            if (spieler1 == 1 && computer == 2){
                output.write(1);
            }
       
            // Schere vs. Papier     = Spieler     Gewinnt
            if(spieler1 == 2 && computer == 3){
                output.write(2);
            }
           
            // Papier vs. Stein     = Spieler     Gewinnt
            if(spieler1 == 3 && computer == 1){
                output.write(3);
            }
           
            // Schere vs. Stein     = Computer     Gewinnt
            if(spieler1 == 2 && computer == 1){
                output.write(4);
            }
           
            // Papier vs. Schere     = Computer     Gewinnt
            if(spieler1 == 3 && computer == 2){
                output.write(5);
            }
           
            // Stein vs. Papier     = Computer     Gewinnt
            if(spieler1 == 1 && computer == 3){
                output.write(6);
            }
       
            // Rückgabe der Werte zum Client
            //output.write(spieler1);
            //output.write(computer);
           
            output.flush();
            input.close();
            output.close();
        }
    }
   
    public static void main(String[] args) {
        try { Server server = new Server(); }
        catch (IOException e){ System.out.print(e); }
        }

    }
```

So wie schreibe ich nun im Client noch ne While Schleife rein, damit 
ich so lange spielen kann, bis ich diese verlasse ?


----------



## SlaterB (19. Jun 2011)

du hast doch Code zu 'Stein vs Schwere = Spieler gewinnt!'-Ausgabe usw?
allerdings sollten die vielen ifs nicht alle input.read() aufrufen denn den Wert kann man nur einmal lesen,
speichere ihn in eine Variable, dann gehts weiter

ansonsten eine Frage?


----------



## Drao (19. Jun 2011)

SlaterB hat gesagt.:


> du hast doch Code zu 'Stein vs Schwere = Spieler gewinnt!'-Ausgabe usw?
> allerdings sollten die vielen ifs nicht alle input.read() aufrufen denn den Wert kann man nur einmal lesen,
> speichere ihn in eine Variable, dann gehts weiter
> 
> ansonsten eine Frage?



jap, das hab ich auch eben rausgefunden und schon bereits abgeändert. 
ja hab ich, wie mach ich da am besten noch so ne while schleife rein, 
bei der ich immer wieder ne neue auswahl machen kann und bei bedarf auch alles beenden?


----------



## SlaterB (19. Jun 2011)

while(true) hast du doch beim Server schon, also beim Client auch, 
bestimmte Eingabe als Quit erkennen dürfte doch auch bekannt sein, das steht im ersten Posting bereits


----------



## Drao (19. Jun 2011)

SlaterB hat gesagt.:


> while(true) hast du doch beim Server schon, also beim Client auch,
> bestimmte Eingabe als Quit erkennen dürfte doch auch bekannt sein, das steht im ersten Posting bereits



Ach ich hab keine ahnung wie du das meinst, das erste posing hat bis auf die idee nichts mehr mit den jetztigen programm zu tun, mir ist schon klar while (true ), switch, break und wie man die schreibt, ich weiss nur nicht wie ich die einbauen soll damit sie auch funktioniert.


----------



## SlaterB (19. Jun 2011)

auf korrekte Weise einbauen,
bei while-true z.B. direkt nach dem Einlesen einer Eingabe mit if prüfen, falls Ende dann break; oder return;
mehr kann ich dazu nun nicht sagen


----------

