# Schiffe versenken



## curse_62 (20. Apr 2011)

Hallo Leute, bin hier neu im Forum und habe wie es sich für gehört Fragen :lol:

Ich programmiere zurzeit ein kleines Spielchen Schiffe versenken. Habe die Gui und alles andere programmiert. Nur möchte ich das Programm so Erweitern das es über zwei Rechner läuft. 

Ich hab mich in Java Sockets ein wenig eingelesen und nach Anleitung einen Java Chat programmiert. Nur habe ich jetzt das Problem das ich ja keine zwei Rechner rumstehen hab und wollte mal fragen wie ich es hinkriege das Ding irgendwie auf dem Rechner zu simulieren. Gibt es Programme hierfür ? 

Das hier wäre mein kleiner chat : 


```
/* Generated by Together */
import java.io.*;
import java.net.*;
import java.io.*;

 public class DataTimerServer
 {
   public static void main(String args[])
   {
     int cnt = 0;
     try {
       System.out.println("Warte auf Verbindungen auf Port 1050...");
       ServerSocket echod = new ServerSocket(1050);
       while (true) {
         Socket socket = echod.accept();
         (new EchoClientThread(++cnt, socket)).start();
       }
     } catch (IOException e) {
       System.err.println(e.toString());
       System.exit(1);
     }
   }
 }
```


```
/* Generated by Together */
import java.io.*;
import java.net.*;
import java.io.*;
public class EchoClientThread extends Thread
{
   private int    name;
   private Socket socket;

   public EchoClientThread(int name, Socket socket)
   {
     this.name   = name;
     this.socket = socket;
   }

   public void run()
   {
     String msg = "EchoServer: Verbindung " + name;
     System.out.println(msg + " hergestellt");
     try {
       InputStream in = socket.getInputStream();
       OutputStream out = socket.getOutputStream();
       out.write((msg + "\r\n").getBytes());
       int c;
       while ((c = in.read()) != -1) {
         out.write((char)c);
		out.write((char)c);
         System.out.print((char)c);
       }
       System.out.println("Verbindung " + name + " wird beendet");
       socket.close();
     } catch (IOException e) {
       System.err.println(e.toString());
     }
   }
 }
```

Ich danke euch jetzt schon mal herzlich :toll:


----------



## Andi_CH (20. Apr 2011)

Äh - kopfkratz - was willst du jetzt? Chatten oder Schiffe versenken?


----------



## Michael... (20. Apr 2011)

curse_62 hat gesagt.:


> Ich hab mich in Java Sockets ein wenig eingelesen und nach Anleitung einen Java Chat programmiert. Nur habe ich jetzt das Problem das ich ja keine zwei Rechner rumstehen hab und wollte mal fragen wie ich es hinkriege das Ding irgendwie auf dem Rechner zu simulieren. Gibt es Programme hierfür ?


Man kann auch Programme mehrfach auf einem Rechner ausführen ;-)
Wenn Du Dich mit Sockets näher beschäftigst wirst Du feststellen, dass das einzig entscheidende IP Adresse und Port sowie die Erreichbarkeit der Teilnehmer untereinander sind. Ob die Programme dann auf dem selben Rechner oder auf irgendwelchen Rechner im weltweiten Netz laufen ist (fast) egal.
Zusätzlich Programme benötigt man dafür nicht. Laufen die Programme auf dem selben Rechner verwendet man als IP localhost


----------



## curse_62 (20. Apr 2011)

Einfache Server Client Verbindungen funktionieren jetzt, aber sobald ich mit ServerThread arbeiten will, kriege ich immer diesen Fehler: 
java.net.BindException: Address already in use: JVM_Bind  ... wie muss ich das hier machen mit dem localhost ? 


Mein Programm sieht so aus, stamm hier ausm Forum : 


```
import java.net.*;
import java.io.*;
 
 
public class Server {
    
    
    Server() throws IOException{
    	// Server aufbauen
	ServerSocket server = new ServerSocket(1666);
	Socket s;
	while(true) {
		// Auf verbindung warten
		s = server.accept();
		// kommunikation an einen nebenläufigen Thread abgeben
		ServerThread t = new ServerThread(s);
		t.start();
		// und wieder auf neue Verbindungen warten
    }}
    
    public static void main(String[] args) {
    	try{
    	Server server= new Server();
    	}catch(IOException e){
    		System.out.println(e);
    	}

    }
}
```


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

public class ServerThread extends Thread {
	private Socket s;
	public ServerThread(Socket s) throws IOException{
		this.s = s;
		// lesen
		BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
		String text = in.readLine();
		// schreiben
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		out.write(text.toUpperCase());
		out.newLine();
		out.flush();
		// aufräumen
		out.close();
		in.close();
	}
 

}
```

Ich dank schonmal im vorraus :toll:


----------



## Michael... (20. Apr 2011)

curse_62 hat gesagt.:


> Einfache Server Client Verbindungen funktionieren jetzt, aber sobald ich mit ServerThread arbeiten will, kriege ich immer diesen Fehler:
> java.net.BindException: Address already in use: JVM_Bind  ... wie muss ich das hier machen mit dem localhost ?


Das bedeutet, dass der Port bereits belegt ist. Von einem anderen Programm oder von einer Instanz Deines Programms, die noch nicht beendet wurde.
Verwende am besten einen fünfstelligen Port, da im Bereich darunter schon einige belegt sein können. Siehe:
Port (Protokoll) ? Wikipedia
Liste der standardisierten Ports ? Wikipedia


----------



## curse_62 (4. Mai 2011)

Ich habs mal versucht zusammen zu programmieren also das komplette Schiffe versenken, aber irgendwie funkt es nicht ganz. Der Fehler ist für nicht ersichtlich. Es wäre wenn mir jemand weiterhelfen könnte.  Danke euch schon mal im vorraus  


```
import java.net.*;
 import java.io.*;
public class Start {
    
    public static void main(String[] args) throws Exception {
    	
    
    	System.out.println("Hello World!");
    	Steuerung steu=new Steuerung();
    	steu.guiErzeugen();
    }
}
```


```
/**
 * @(#)Steuerung.java
 *
 *
 * @author 
 * @version 1.00 2011/3/6
 */

import java.io.*;
public class Steuerung {
    
    private Gui dieGui;
    private Daten dieDaten;
    private boolean setze; // solange true bis alle schiffe gesetzt wurden 
    private int anz;
    private boolean turn; // wer ist am ZUG ? 
    
    public Steuerung() {
    	setze=true;
    	anz=10; 
    	turn=true;
    }

    
    public void guiErzeugen(){
    	dieGui = new Gui(this);
    	dieGui.oberFlaeche();
    	this.daTenerzeugen();

    }
    public void daTenerzeugen(){
    	dieDaten=new Daten();
    }
    public void setzeSchiff(int x,int y,int typ, boolean v ){  //  nichts mehr hier ändern 
    	int merk= 0; 
    	if(v==true){   //senkrecht
    	
    		for(int i=0;i<typ;i++){ 
    			if(((x-1)>=0)&&((x+1)<=11)&&((y-1)>=0)&&((y+1)<=13)){ // liegt kein schiff am rand und springt auch nicht ausm feld 
    				if((dieDaten.getFeld1(x,y)==false)&&(dieDaten.getFeld1(x+1,y)==false)&&(dieDaten.getFeld1(x-1,y)==false)&&(dieDaten.getFeld1(x,y+1)==false)&&(dieDaten.getFeld1(x,y-1)==false)
    				    &&(dieDaten.getFeld1(x+1,y+1)==false)&&(dieDaten.getFeld1(x-1,y-1)==false)&&(dieDaten.getFeld1(x+1,y-1)==false)&&(dieDaten.getFeld1(x-1,y+1)==false)){ // Bedingung das kein schiff neben an liegt 
    					merk=merk+1;
    					y=y+1;	// senkrecht schauen
    				}
    				else{
    					dieGui.ausgebenStatus("nicht möglich");
    				}
    			}
    			else{
    				dieGui.ausgebenStatus("nicht möglich");
    			}
    		}
    		
    		if(merk==typ){       // nachdem geschaut wurde obs klappt wird gesetzt 
    				y=y-typ;
    				for(int i=0;i<typ;i++){
    					dieDaten.setFeld1(x,y+i);
    					dieGui.setFeld1(x,y+i,"O");
    					
    				}
    				this.anz=anz-1; // ein schiff wurde gesetzt 
    				dieGui.ausgebenStatus("done senkrecht");	
    		}
    	}
    	else{// das selbe bloß waagrecht 
    		    	
    		for(int i=0;i<typ;i++){
    			if(((x-1)>=0)&&((x+1)<=11)&&((y-1)>=0)&&((y+1)<=13)){
    				if((dieDaten.getFeld1(x,y)==false)&&(dieDaten.getFeld1(x+1,y)==false)&&(dieDaten.getFeld1(x-1,y)==false)&&(dieDaten.getFeld1(x,y+1)==false)&&(dieDaten.getFeld1(x,y-1)==false)
    					&&(dieDaten.getFeld1(x+1,y+1)==false)&&(dieDaten.getFeld1(x-1,y-1)==false)&&(dieDaten.getFeld1(x+1,y-1)==false)&&(dieDaten.getFeld1(x-1,y+1)==false)){
    					merk=merk+1;
    					x=x+1;	
    				}
    				else{
    					dieGui.ausgebenStatus("nicht möglich");
    				}
    			}
    			else{
    				dieGui.ausgebenStatus("nicht möglich");
    			}
    		}
    		
    		if(merk==typ){      
    				x=x-typ;
    				for(int i=0;i<typ;i++){
    				
    					dieDaten.setFeld1(x+i,y);
    					dieGui.setFeld1(x+i,y,"O");
    					
    				}
    				this.anz=anz-1;	
    				dieGui.ausgebenStatus("done waagrecht");
    		}
    	}
    	System.out.println("Hier in schiffesetzen ist x= "+x+"und y= "+y+"und anz = "+this.anz  );//  später wegmachen 
    	dieDaten.ausGeben();// test später wegmachen 
    	}
    
    public void werte(int zahl){ // x und y wert heruasfinden :) 
    	int y = (int)(zahl/12);
    	int x = zahl%12;
    	System.out.println(x+"-x-y-"+y); 
    	if(setze=true){
    		// setze schiff 
    		switch(anz){
    			case 10 : setzeSchiff( x, y, 5, dieGui.gibsenk() );break;
    			
    			case 9 : setzeSchiff( x, y, 4, dieGui.gibsenk() );break;
    			case 8 : setzeSchiff( x, y, 4, dieGui.gibsenk() );break;
    			case 7 : setzeSchiff( x, y, 4, dieGui.gibsenk() );break;
    			
    			case 6 : setzeSchiff( x, y, 3, dieGui.gibsenk() );break;
    			case 5 : setzeSchiff( x, y, 3, dieGui.gibsenk() );break;
    			case 4 : setzeSchiff( x, y, 3, dieGui.gibsenk() );break;
    			
    			case 3 : setzeSchiff( x, y, 2, dieGui.gibsenk() );break;
    			case 2 : setzeSchiff( x, y, 2, dieGui.gibsenk() );break;
    			case 1 : setzeSchiff( x, y, 2, dieGui.gibsenk() );break;
    			
    			case 0 : this.setze = false;break;
    		}	
	
    	}
    	else{
    		if(dieDaten.getFeld2(x,y)==false){ // schau ob schon versucht wurde auf das Feld zu schießen 
    		
    	
    		if(turn==true){ // bin ich am ZUg ? 
    		     try{
     			Client client =new Client(zahl,""); // wenn ja dann weg mit der Botschaft
    			 } catch (IOException e){
     				System.out.println(e);
    			 }
    			 turn=false; // der Zug ändert sich 
    			 
    		     
    		} 
    			try{
    				Server server= new Server(this); // falls 
    			}catch(IOException e){
    				System.out.println(e);
    			}
    			
    	}	
    }}
    
    public void hitSchiff(int zahl){
    	int y = (int)(zahl/12);
    	int x = zahl%12;
    	dieDaten.setFeld2(x,y);
    	if(dieDaten.getFeld1(x,y)==true){
    		dieDaten.hit();
    		dieGui.setFeld2(x,y,"!");
    		gewonnen();
    	}
    	else{
    		dieGui.setFeld2(x,y,"~");
    	}
    	this.turn=true;		
    	}
    public void gewonnen(){
    	if(dieDaten.gethit()==0){
    		dieGui.ausgebenStatus("GEWONNEN! ");
    		while(true) {}
    	}
    }
    public void chatAus(String text){
    	dieGui.ausgebenChat(text);
    }
    public void ausgebenChat(String aus){
    	try{
     		Client client =new Client(999,aus);
    	} catch (IOException e){
     		System.out.println(e);
    	}
    }
    public void reset(){
    	if(anz!=10){
    	dieGui.reset();
    	dieDaten.reset();
    	this.anz=10;
    	try{
     		Client client =new Client(9999,"");
    	} catch (IOException e){
     		System.out.println(e);
    	}
    		
    	}
    }
    }
```


```
////// versuchs yourLabel.setFont(new Font("Dialog", 0, 50));
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Gui{
   
   private Steuerung steu;
    private JFrame frame;		// Fenster 
    private JPanel links;		//linkes Spielfeld		
    private JPanel rechts;		//rechtes Spielfeld
    private JPanel unten;		//Untere Angaben 	
    private JPanel zentrum;		//Untere Angaben 	
    private JPanel eing;		// Label für Eingabe
    private JButton feld1[][];		// Button Feld1 
    private JButton feld2[][];		//´Button Feld2
    private JButton neu;		//Neues Spiel Button 
    private JTextArea chat;		// Text Feld für Chat 
    private JTextField eingabe;	// Eingabe Feld 
    private JButton eingabego;	//Chat go 
    private JTextArea status;		// Spiel Feld Ausgabe 
    private Checkbox senkrecht;	// Checkbox senkrecht 
    private Checkbox waagrecht;	// Checkbox waagrecht 
    private JTextArea info;		//info box 
    
    private int nix;
    

    public class clickListener implements ActionListener{ // neues Spiel und vorläufiger go befehl 
        public void actionPerformed(ActionEvent e){
        	if(e.getActionCommand().equals("go")){
        		
        		//steu.ausgebenChat(eingabe.getText());
        		if(nix ==0){
        		ausgebenChat("Chat geht nicht ");
        		nix=nix+1;	
        		}
        		else{
        			ausgebenChat("Der Chat geht immer noch nicht hör auf GO zu drücken ");
        		}	
        		

        		
        	}
            if(e.getActionCommand().equals("Neues Spiel")){
                steu.reset();               
            }
            else{
                steu.werte(Integer.parseInt(e.getActionCommand()));
            }
        }
    }

    
   

    Gui(Steuerung steu){
        this.nix =0;
        this.steu = steu;
        this.frame = new JFrame("Schiffe versenken"); 	// initalisierung der elemente 
        this.links = new JPanel();
        this.rechts = new JPanel();
        this.unten = new JPanel();
        this.zentrum = new JPanel();
        this.eing = new JPanel();
        this.feld1 = new JButton[14][12];
        this.feld2 = new JButton[14][12];
        this.neu = new JButton("Neues Spiel");
        this.status = new JTextArea(5,1);
        this.chat = new JTextArea(5,1);
        this.eingabe = new JTextField();
        this.info = new JTextArea();
        this.eingabego= new JButton("go");
        CheckboxGroup cbg1 = new CheckboxGroup();		// nur einer der checkboxen an 
        this.senkrecht= new Checkbox("senkrecht",cbg1,true);// senkrecht ist am anfang true  	
        this.waagrecht= new Checkbox("waagrecht",cbg1,false); 
   

        
       int nr =0;
       for(int j=0;j<=13;j++){
    		for(int i=0;i<=11;i++){			//beide Felder mit Buttons deklarieren 
    		
            this.feld1[j][i] = new JButton("");
	  this.feld1[j][i].setActionCommand(nr+"");
            this.feld1[j][i].addActionListener(new clickListener());
            
            this.links.add(this.feld1[j][i]);

			
            this.feld2[j][i] = new JButton("");  
            this.feld2[j][i].setActionCommand(nr+"");
            this.feld2[j][i].addActionListener(new clickListener());

            this.rechts.add(this.feld2[j][i]);
            nr=nr+1;

        }
    		}
    }

    public void oberFlaeche(){ // oberflaeche wird erzeugt 

        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.frame.setSize(1200,800);
        this.frame.setLayout(new BorderLayout()); 
        this.links.setLayout(new GridLayout(14,12));
        this.rechts.setLayout(new GridLayout(14,12));
        //this.links.setBorder(BorderFactory.createEmptyBorder(2,2,0,2));
        //this.rechts.setBorder(BorderFactory.createEmptyBorder(2,2,0,2));
        this.eing.setLayout(new GridLayout(1,2));
        this.unten.setLayout(new GridLayout(2,2));
        this.zentrum.setLayout(new GridLayout(3,1)); // bis hierher labels gesetzt 

      
        this.neu.addActionListener(new clickListener());
        this.eingabego.addActionListener(new clickListener());
        this.eingabego.addActionListener(new clickListener());
        
        this.info.setText("Gui 1.1");
        
        this.zentrum.add(this.info);		//labels werden zusammengebaut 
        this.zentrum.add(this.senkrecht);
        this.zentrum.add(this.waagrecht);
        this.eing.add(this.eingabe);
        this.eing.add(this.eingabego);
        this.unten.add(this.status);
        this.unten.add(this.chat);
        this.unten.add(this.neu);
        this.unten.add(this.eing);
       
        this.frame.add(links,BorderLayout.WEST);	//labels kommen aufs frame 
        this.frame.add(rechts,BorderLayout.EAST);
        this.frame.add(unten,BorderLayout.SOUTH);
        this.frame.add(zentrum,BorderLayout.CENTER);
        this.frame.setVisible(true);
        


        }
   
    public void ausgebenStatus(String a){ // status fenster ausgebem 
        this.status.setText(a);

    }
    public void ausgebenChat(String a){ // chat fenster ausgeben
        this.chat.setText(a);

    }

    
    public void reset(){		
        for(int j=0;j<=13;j++){
    		for(int i=0;i<=11;i++){
    			setFeld1(i,j,"");
    			setFeld2(i,j,"");
    		}	
        }
    }
    public boolean gibsenk(){
    	return senkrecht.getState();
    }
     public void setFeld1(int x,int y, String a){
    	this.feld1[y][x].setText(a);
    }
      public void setFeld2(int x,int y, String a){
    	this.feld2[y][x].setText(a);
    }
    }
```


```
/**
 * @(#)Daten.java
 *
 *
 * @author 
 * @version 1.00 2011/3/6
 */


public class Daten {
   
    private boolean feld1[][];
    private boolean feld2[][];
    private int hit;

    public Daten() {
    	feld1 = new boolean[12][14];
    	feld2 = new boolean[12][14];
	reset();


    }
    
    public void setFeld1(int x,int y){
    	this.feld1[x][y]=true;
    }
    
    public boolean getFeld1(int x,int y){
    	return this.feld1[x][y];
    }
    public void setFeld2(int x,int y){
    	this.feld2[x][y]=true;
    }
    
    public boolean getFeld2(int x,int y){
    	return this.feld1[x][y];
    }
    public void hit(){
    	this.hit=hit-1;
    }
    public int gethit(){
    	return this.hit;
    }
    public void reset(){
	this.hit=32;
    	for(int j=0;j<=13;j++){
    		for(int i=0;i<=11;i++){
    			feld1[i][j]=false;	
    			feld2[i][j]=false;
    		}
    	}

    }
    //ausgeben Test 
    public void ausGeben(){
    	for(int j=0;j<=11;j++){
    		for(int i=0;i<=13;i++){
    		System.out.print(feld1[j][i]+" ");
    			
    		}
    		System.out.println("");
    	}
    }
    
}
```


```
import java.net.*;
import java.io.*;
import java.net.ServerSocket;
 
public class Server {
	
    private Steuerung steu; 
    Server(Steuerung steu) throws IOException{
    	// Server aufbauen
	ServerSocket server = new ServerSocket(55555);
	Socket s;
	this.steu=steu;
	while(true) {
		// Auf verbindung warten
		s = server.accept();
		// kommunikation an einen nebenläufigen Thread abgeben
		ServerThread t = new ServerThread(s,this);
		t.start();
		// und wieder auf neue Verbindungen warten
		// SeverSocket.setSoTimeout(1900); 
		//nach 1,9 sekunden shutdown 	
    }} 
    
    public void empfang(int zahl){
    	
    	steu.hitSchiff(zahl);
    }
    public void chat(String text){
    	steu.chatAus(text);
    }
    public void reset(){
    	steu.reset();
    }

    }
```


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

public class ServerThread extends Thread {
	private Socket s;
	private Server ser;
	public ServerThread(Socket s,Server ser) throws IOException{
		this.s = s;
		this.ser=ser;

	
	}
	public void tu()throws IOException{
		BufferedReader din = new BufferedReader ( 
    		new InputStreamReader(System.in));
	
		// lesen
		BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
		String text = in.readLine();
		int zahl = 0;
		int merk=999;
		try{		
			zahl = Integer.parseInt (text);
		
    		}catch(Exception e){
    			System.out.println(e);
    			ser.chat(text);
    			merk=0;
    		}
		// schreiben
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		out.write("done senden");
		out.newLine();
		out.flush();
		// aufräumen	
		if(merk==999){	
		this.ser.empfang(zahl);}
		if(zahl==9999){
		this.ser.reset();	
		}
		out.close();
		in.close();
	}
 

}
```


```
import java.net.*;
import java.io.*;
 
public class Client {
	
    Client( int zahl,String aus) throws IOException{
    	Socket server = new Socket ( "localhost",55555);
    	InputStream input = server.getInputStream();
    	OutputStream output= server.getOutputStream();
    	if(zahl !=999){
    	output.write (zahl);
    	}
    	else{
    	//output.write (aus); hier scheitert der ganze Chat eigentlich schade 	
    	}
    	output.flush();
    	System.out.println( input.read());
    	server.close();
    	output.close();
    }
    

}
```


----------

