# 2 Player Spiel



## Josh0815 (15. Jan 2007)

Hi! Ich kenne mich in Netzwerkprogrammierung noch nicht sehr gut aus. Ich möchte das Spiel TicTacToe netzwerkfähig machen, welches ich selbst geschrieben habe. Mein Problem ist wahrscheinlich sehr trivial, aber dennoch komme ich alleine nicht auf die Lösung. Meine Lösung wäre diese: Es gibt einen Startbildschirm bei Server und Client in dem man Name und Spielerzeichen (X,O) auswählen kann. Welches Zeichen jeder benutzt ist für das Spiel ja egal, denn es muss ja nur gespeichert werden das der jeweilige andere Spieler eben ein anderes Zeichen hat. Nun soll man den Server starten können und auf eine Anfrage eines Clients warten. Der Client soll zudem die Möglichkeit besitzen eine IP Adresse des Servers und dessen Port anzugeben. Nun sollen erst die jeweiligen Namen ausgetauscht werden und der erste Spieler ausgewählt werden. Dabei nutze ich immer eine sende(String str) und empfange() Methode. Jedoch wenn ich dies so realisiere, ist der Server immer der Spieler, der am Zug ist, was meiner Meinung nach nicht ganz in das Konzept Server/Client passt. Wie kann ich es realisieren das der Server empfangen und senden kann, und der Client auch, ohne jedesmal die Servereigenschaft dem anderen Spieler zu geben?

Es soll gesendet werden können per String:

1. 1 mal Name des anderen Spielers.
2. mehrmals die jeweilige Koordinate des Feldes.
3. Ein Spielabbruch von einem der Spieler.
4. Ein Neustart von einem der Spieler.

Ansatz der sende/empfangs Methoden: (PS: Ich weis das es sich hierbei erstmal um eine Socketverbindung handelt in der noch keine IP Adressen wichtig sind)




```
public String empfangen() throws IOException{
		ServerSocket server = new ServerSocket(3140);
      	
      	while (empf.equals("")) {
      		System.out.println("empfange");
         	Socket client = server.accept();
         	
         	//InpuStream
         	InputStream in = client.getInputStream();
         	BufferedReader rdr = new BufferedReader(new InputStreamReader(in));

			synchronized(server){
         		try{
	            	server.wait(800);
    	    	}
    	    	catch(InterruptedException ex){
	        	    System.err.println(ex);
         		}
			}
			
			empf = rdr.readLine();			         
         	client.close();
      	}
      	
      	return empf;
	}
	
	public void senden(String str) throws IOException{
		Socket server = new Socket("localhost", 3141);
      	
      	//InputStream
      	InputStream in = server.getInputStream();
      	BufferedReader rdr = new BufferedReader(new InputStreamReader(in));
		      
      	//OutputStream
      	OutputStream out = server.getOutputStream();
      	BufferedWriter wrt = new BufferedWriter(new OutputStreamWriter(out));
		      
      	wrt.write(str);
      	wrt.write( "\r\n");
      	wrt.flush(); 
		      
      	server.close();
	}
```


----------



## Campino (15. Jan 2007)

ähm..der Server leitet quasi nur durch. Er "merkt" sich die beiden Spieler jeweils als Sockets und gibt die Daten des Anderen dann weiter. Falls du sorgen hast, dass da jemand über Manipulationen an seinem Client mögeln könnte, kannst du auch die Logik au den Server auslagern. 

Der Server bekommt also jeweils von dem Spieler der daran ist dessen Zug, macht ihn und teilt dem anderen Clienten mit, wie dieser seine Darstellung ändern muss. Dann prüft er ob jemand gewonnen oder verloren hat, bzw. das Spiel zuende ist, sendet diese Information und sendet ein "du bist dran" an einen Client, auf dessen Antwort er dann wartet -> es geht von vorne los. 

Wenn Server und Client auf einem Rechner laufen, ändert sich an der Vorgehensweise nix.


----------



## Josh0815 (15. Jan 2007)

Jupp. Genauso hab ich mir das vorgestellt. Also Server komplett aus dem Spiel herausnehmen oder eben als Thread seperat lauffen lassen zum Client eben (natürlich nur auf einem Rechner). Dann versuch ich´s mal ob ich´s hinbekomme.

Danke schonmal


----------

