# Fehler java.net.bindException



## Tomstar (14. Mrz 2011)

Hallo Zusammen, 

beim Programmieren einer BeatBox, trat folgende Fehler auf:

Was hab ich falsch gemacht?

Dankeschön für euere Antworten

*1. Fehler beim Server Programm:*


```
java.net.BindException: Address already in use: JVM_Bind
	at java.net.PlainSocketImpl.socketBind(Native Method)
	at java.net.PlainSocketImpl.bind(Unknown Source)
	at java.net.ServerSocket.bind(Unknown Source)
	at java.net.ServerSocket.<init>(Unknown Source)
	at java.net.ServerSocket.<init>(Unknown Source)
	at MusikServer.los(MusikServer.java:52)
	at MusikServer.main(MusikServer.java:11)
```

*Code des Servers*


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

public class MusikServer {
	
	ArrayList<ObjectOutputStream> clientOutputStreams;
	
	public static void main(String[] args) {
		
		new MusikServer().los();
	}
	
	public class ClientHandler implements Runnable {
		
		ObjectInputStream in;
		Socket clientSocket;
		
		public ClientHandler(Socket socket) {
			
			try {
				
			
			clientSocket = socket;
			in = new ObjectInputStream(clientSocket.getInputStream());
			}catch(Exception ex) {ex.printStackTrace();}
		}
	
	public void run() {
		
		Object o2 = null;
		Object o1 = null;
		
		try {
			while (( o1 = in.readObject()) != null) {
				 o2 = in.readObject();
				 
				 System.out.println("zwei Objekte gelesen");
				 esAllenMitteilen(o1, o2);
			}
			
	}catch(Exception ex){ex.printStackTrace();}
	
}
	}

public void los() {
	
	clientOutputStreams = new ArrayList<ObjectOutputStream>();
	
	try {
		ServerSocket serverSock = new ServerSocket(6000);
		
		while(true) {
			
			Socket clientSocket = serverSock.accept();
			ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
			clientOutputStreams.add(out);
			
			Thread t = new Thread(new ClientHandler(clientSocket));
			t.start();
			
			System.out.println("Verbindung hergestellt");
		}
	}catch(Exception ex) {ex.printStackTrace();}
}

public void esAllenMitteilen(Object eins, Object zwei) {
	
	Iterator it = clientOutputStreams.iterator();
	while(it.hasNext()) {
		
		try {
			
			ObjectOutputStream out = (ObjectOutputStream) it.next();
			out.writeObject(eins);
			out.writeObject(zwei);
		}catch(Exception ex) {ex.printStackTrace();}
	}
}

}
```

*2. Fehler bei der BeatBox*


```
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
	at BeatBoxEndfassung.main(BeatBoxEndfassung.java:38)
```

Hier der Code der *BeatBox*:



```
import java.awt.*;
import javax.swing.*;
import javax.sound.midi.*;
import java.util.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.event.*;



public class BeatBoxEndfassung {
	
	JList eingangsListe;
	JTextField benutzerNachricht;
	JPanel hauptPanel;
	ArrayList<JCheckBox>checkboxListe;
	int nummerierung;
	Vector<String>listenVector = new Vector<String>();
	String benutzerName;
	ObjectOutputStream out;
	ObjectInputStream in;
	HashMap<String, boolean[]>andereSeqsMap = new HashMap<String, boolean[]>();
	Sequencer sequencer;
	Sequence sequence;
	Sequence meineSequence = null;
	Track track;
	JFrame derFrame;
	
	String [] instrumentNamen = {"Bassdrum", "Hit-Hat, geschlossen", "Hi-Hat, offen",
								"Snaredrum", "Crashbecken", "Händeklatschen", "Hohes Tom-Tom", 
								"Hohes Bongo", "Maracas", "Trillerpfeife", "Tiefe Conga", "Kuhglocke", 
								"Vibraslap", "Tieferes Tom-Tom", "Hohes Agogo", "Hohe Conga, offen"};
	int [] instrumente = {35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67, 63};
	
	public static void main(String[] args) {
		
		new BeatBoxEndfassung().inBetriebNehmen(args[0]); // args[0] ist der Benutzername
	}
	
	
	public void inBetriebNehmen(String name) {
		
		benutzerName = name;
		//Verbindung zum Server herstellen
		
		try{
			
			Socket sock = new Socket("127.0.0.1", 4242);
			out = new ObjectOutputStream(sock.getOutputStream());
			in = new ObjectInputStream(sock.getInputStream());
			Thread remote = new Thread(new RemoteReader());
			remote.start();
			
		}catch(Exception ex){
			System.out.println("Keine Verbindung möglich - sie müssen allein spielen.");
		}
		
		midiEinrichten();
		guiErstellen();
	}
	
	
	public void guiErstellen() {
		
		derFrame = new JFrame("Cyber-BeatBox");
		derFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		BorderLayout layout = new BorderLayout();
		JPanel hintergrund = new JPanel(layout);
		hintergrund.setBorder(BorderFactory.createEmptyBorder(10, 10, 10 ,10));
		
		checkboxListe = new ArrayList<JCheckBox>();
		Box buttonBox = new Box(BoxLayout.Y_AXIS);
		
		JButton start = new JButton("Starten");
		start.addActionListener(new MeinStartListener());
		buttonBox.add(start);
		
		JButton stopp = new JButton("Stoppen");
		stopp.addActionListener(new MeinStoppListener());
		buttonBox.add(stopp);
		
		JButton schneller = new JButton("Schneller");
		schneller.addActionListener(new MeinSchnellerListener());
		buttonBox.add(schneller);
		
		JButton langsamer = new JButton("Langsamer");
		langsamer.addActionListener(new MeinLangsamerListener());
		buttonBox.add(langsamer);
		
		JButton senden = new JButton("Senden");
		senden.addActionListener(new MeinSendenListener());
		buttonBox.add(senden);
		
		benutzerNachricht = new JTextField();
		buttonBox.add(benutzerNachricht);
		eingangsListe = new JList();
		eingangsListe.addListSelectionListener(new MeinListSelectionListener());
		eingangsListe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		JScrollPane dieListe = new JScrollPane(eingangsListe);
		buttonBox.add(dieListe);
		eingangsListe.setListData(listenVector);
		
		Box namensBox = new Box(BoxLayout.Y_AXIS);
		for(int i = 0; i < 16; i++) {
			
			namensBox.add(new Label(instrumentNamen[i]));
		}
		
		hintergrund.add(BorderLayout.EAST, buttonBox);
		hintergrund.add(BorderLayout.WEST, namensBox);
		derFrame.getContentPane().add(hintergrund);
		
		GridLayout raster = new GridLayout(16, 16);
		raster.setVgap(1);
		raster.setHgap(2);
		
		hauptPanel = new JPanel(raster);
		hintergrund.add(BorderLayout.CENTER, hauptPanel);
		
		for (int i = 0; i < 256; i++) {
			JCheckBox c = new JCheckBox();
			c.setSelected(false);
			checkboxListe.add(c);
			hauptPanel.add(c);
			
		}
		
	
		
		derFrame.setBounds(50,50,300,300);
		derFrame.pack();
		derFrame.setVisible(true);
		
	}//gui-Ende
	
	public void midiEinrichten() {
		
		try{
			sequencer = MidiSystem.getSequencer();
			sequencer.open();
			sequence =  new Sequence(Sequence.PPQ, 4);
			track = sequence.createTrack();
			sequencer.setTempoInBPM(120);
			
		}catch(Exception e) {e.printStackTrace();}
		
	} // Ende midiEinrichten
	
	public void trackErstellenUndStarten(){
		ArrayList<Integer> trackListe = null;
		sequence.deleteTrack(track);
		track = sequence.createTrack();
		
		
		for(int i = 0; i < 16; i++) {
			trackListe = new ArrayList<Integer>();
		
			
			for(int j = 0; j< 16; j++) {
				
				JCheckBox jc = checkboxListe.get(j + (16*i));
				if(jc.isSelected()) {
					
					int taste = instrumente[i];
					trackListe.add(new Integer(taste));
					
				}else{
					trackListe.add(null);
				}
			}// Ende innere Schleife
			
			tracksErzeugen(trackListe);
			
		}
		
		track.add(eventErzeugen(192, 9, 1, 0, 16));
		try {
			
			sequencer.setSequence(sequence);
			sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
			sequencer.start();
			sequencer.setTempoInBPM(120);
		}catch(Exception e) {e.printStackTrace();}
		
	
		
	}//trackErstellenUndStarten  ENDE
	
	public class MeinStartListener implements ActionListener {
		
		public void actionPerformed(ActionEvent a) {
			
			trackErstellenUndStarten();
		}
	}
	
	
	
	public class MeinStoppListener implements ActionListener {
		
		public void actionPerformed(ActionEvent a) {
			
			sequencer.stop();
		}
	}
	
	
	
	public class MeinSchnellerListener implements ActionListener {
		
		public void actionPerformed(ActionEvent a) {
			
			float tempoFactor = sequencer.getTempoFactor();
			sequencer.setTempoFactor((float)(tempoFactor * 1.03));
		}
	}
	
	public class MeinLangsamerListener implements ActionListener {
		
		public void actionPerformed(ActionEvent a) {
			
			float tempoFactor = sequencer.getTempoFactor();
			sequencer.setTempoFactor((float)(tempoFactor * 97));
	
		}
	
	}
	
	public class MeinSendenListener implements ActionListener {
		
		public void actionPerformed(ActionEvent a) {
			
			boolean[]checkboxZustand = new boolean[256];
			for(int i = 0; i < 256; i++) {
				
				JCheckBox check = (JCheckBox) checkboxListe.get(i);
				if(check.isSelected()) {
					
					checkboxZustand[i] = true;
				}
			}
			
			try {
				out.writeObject(benutzerName + nummerierung++
						+ " : " + benutzerNachricht.getText());
				out.writeObject(checkboxZustand);
			}catch(Exception ex){
				
				System.out.println("Tut mir Leid, Senden an Server nicht möglich");
			}
			benutzerNachricht.setText("");
		}
	}
	

	
	
public class MeinListSelectionListener implements ListSelectionListener {
	
	public void valueChanged(ListSelectionEvent le) {
		
		if(!le.getValueIsAdjusting()) {
			
			String wahl = (String) eingangsListe.getSelectedValue();
			if(wahl != null) {
				
				boolean [] wahlZustand = (boolean[]) andereSeqsMap.get(wahl);
				sequenceWechseln(wahlZustand);
				sequencer.stop();
				trackErstellenUndStarten();
			}
		}
	}
}

public class RemoteReader implements Runnable {
	
	boolean[]checkboxZustand = null;
	String anzuzeigenderName = null;
	Object obj = null;
	
	public void run(){
		try{
			while((obj=in.readObject()) != null) {
				
				System.out.println("Object vom Server erhalten");
				System.out.println(obj.getClass());
				String anzuzeigenderName = (String) obj;
				checkboxZustand = (boolean[]) in.readObject();
				andereSeqsMap.put(anzuzeigenderName, checkboxZustand);
				listenVector.add(anzuzeigenderName);
				eingangsListe.setListData(listenVector);
			}
		}catch(Exception ex) {ex.printStackTrace();}
	}
}

public void sequenceWechseln(boolean[] checkboxZustand) {
	for(int i = 0; i< 256; i++) {
		
		JCheckBox check = (JCheckBox) checkboxListe.get(i);
		if (checkboxZustand[i]) {
			
			check.setSelected(true);
		}else {
			check.setSelected(false);
		}
	}
	
}
	

	
	public void tracksErzeugen(ArrayList  liste) {
		Iterator it = liste.iterator();
		
		for (int i = 0; i < 16; i++) {
			Integer num = (Integer)it.next();
			if(num != 0) {
				
				int numTaste = num.intValue();
				track.add(eventErzeugen(144,9, numTaste, 100, i));
				track.add(eventErzeugen(128,9, numTaste, 100, i+1));
			}
		}
	}
	
	public MidiEvent eventErzeugen(int comd, int chan, int one, int two, int tick) {
		
		MidiEvent event = null;
		
		try {
			ShortMessage a = new ShortMessage();
			a.setMessage(comd, chan, one, two);
			event = new MidiEvent(a, tick);
		}catch(Exception e) {e.printStackTrace();}
		
	return event;	
	}
	

	
	
	

} // Klassen-Ende
```


----------



## XHelp (14. Mrz 2011)

Zu dem 1. Fehler: vermutlich ist der Port 6000 bereits belegt. Versuch es durch einen anderen zu ersetzen
Zu dem 2. Fehler: sicher, dass du auch einen Parameter dem Programm richtig übergibst? Bzw: wie startest du es?


----------



## Tomstar (14. Mrz 2011)

Hallo, 

zu Fehler 1: Auch wenn ich einen anderen Port ändere, der Fehler bleibt bestehen!
zu Fehler 2: ich denke, dieser hängt damit zusammen, da mein server nicht startet bzw. mir ist aufgefallen, dass der Port bei dem Socket des Clients 
	
	
	
	





```
Socket sock = new Socket("127.0.0.1", 4242);
```
sich von dem meines Servers 
	
	
	
	





```
ServerSocket serverSock = new ServerSocket(6000);
```
 unterschieden hat, hatte ich wohl einen Tippfehler . Aber auch wenn ich diese beide gleichsetze, bleibt der Fehler bestehen! 


Was meinst du genau mit Parameter übergeben?


----------



## Michael... (14. Mrz 2011)

Wenn man Code aus einem Buch übernimmt, kann man (zumindest bei so renomierten Verlägen wie O'Reilly) davon ausgehen, dass dieser auch funktioniert und im Falle eines Fehler die Ursache vor dem Bildschirm sitzt ;-)



Tomstar hat gesagt.:


> ```
> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
> at BeatBoxEndfassung.main(BeatBoxEndfassung.java:38)
> ```


Zur Zeile 38 ist sogar eine Anmerkung im Buch:


> Geben Sie auf der Kommandozeile ein Argument für den Chatnamen an.


Wobei (in meiner Fassung) der Übersetzer anschließend etwas nachlässig war ;-) was den ein oder anderen Anfänger aus dem Konzept bringen könnte.


----------



## Tomstar (14. Mrz 2011)

Danke Michael . 
Da will ich es mal mit Eclipse ausprobieren, dann vergisst man das ganz, dass ma noch einen Parameter übergeben muss, wär mir in der Console nicht passiert .

Wie kann ich denn mit Eclipse dann einen übergeben?


----------



## Michael... (14. Mrz 2011)

Aus der Erinnerung heraus:
es müsste ein Run... Befehl im Kontextmenü der Klasse oder in der Werkzeugleiste geben, danach öffnet sich ein Dialog mit mehreren Reitern und einer müsste dann Arguments o.ä. heißen.

Alternativ könnte man direkt im Code statt dem arg[0] der Methode einfach einen String übergeben.

P.S: Die BindException bekommt man wenn IP und Port bereits von einem Prozess genutzt werden. Eventuell laufen da noch BeatBoxServer?


----------



## Tomstar (14. Mrz 2011)

Ich kann das Programm jetzt sowohl in der Console als auch in Eclipse starten. 
Nur wenn ich  jetzt eine Melodie spielen will und anschließend auf Starten geh, dann bringt er diese Fehlermeldung hier und leider spielt er nichts ab 

```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at BeatBoxEndfassung.tracksErzeugen(BeatBoxEndfassung.java:320)
	at BeatBoxEndfassung.trackErstellenUndStarten(BeatBoxEndfassung.java:173)
	at BeatBoxEndfassung$MeinStartListener.actionPerformed(BeatBoxEndfassung.java:194)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## xehpuk (14. Mrz 2011)

Ich nehme mal an, dass das bei dir in Zeile 322 passiert. Statt
[JAVA=320]if(num != 0) {[/code]
solltest du mal
[JAVA=320]if(num != null) {[/code]
probieren.


----------

