# probleme mit dem chat programm



## villiboy (24. Apr 2006)

hi leute,

hier mal den code meines chat programms, leider geht das nicht so wie ich mir das vorstelle.
woran liegt das? wenn ich zwei chats erzeuge also z.b. multi1 und multi2 geht es nicht, ich kann zwar in die konsole was eingeben aber er sendet und empängt nichts! für euere hilfe wäre ich sehr dankbar.

merci

```
package mvi;

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

/**
 * 
 * @author Martin
 * Klasse zum verschicken einer serialisierten Nachricht an die Multicasr Adresse.
 * 
 */

public class MultiCast {
	
	public static int port;
	MulticastSocket msocket;
	DatagramPacket multiPacketSend;
	ChatListenThreadMulti lt;
	
	
	public MultiCast(PropertyParser pp, Buddy bu) throws IOException {
		try {
			port = PropertyParser.port;
			msocket = new MulticastSocket(port); 
			msocket.joinGroup(pp.multiAddress);
			//System.out.println(pp.multiAddress);
		}
		catch (IOException e) {
			System.out.println("Kann kein MulticastSocket erzeugen!!!!");
		}
		
			//Buffer für die zu versendenden Daten
			byte[] multiSend = new byte[256];
		
			//Erzeugen eines DatagramPacket zum Daten versenden
			multiPacketSend = new DatagramPacket(multiSend, multiSend.length, pp.multiAddress, PropertyParser.port);
		
			//Thread zum hören ......
			//lt = new ChatListenThreadMulti(port);
			//lt.start();
			
			msocket.receive(multiPacketSend);
			String message = new String(multiPacketSend.getData(),0,multiPacketSend.getLength());
			System.out.println(message);
			
			//Nachricht eingeben und versenden
			BufferedReader ki = new BufferedReader(new InputStreamReader(System.in));
			String tmp;
			//String EXIT = "exit";
		
			while (true) {
				System.out.print(pp.nickname +": ");
				tmp = ki.readLine();
				
				/*if(tmp.equals(EXIT)) {
					System.out.println("Chat beendet ....");
					//Abmeldenachricht generieren und senden
					multiSend = tmp.getBytes("Abbruch durch Benutzer!!!");
					multiPacketSend.setData(multiSend);
					msocket.send(multiPacketSend);
					msocket.close();*/
				
					if ((tmp != null) && (tmp.length() > 0)) {
						multiSend = tmp.getBytes();
						multiPacketSend.setData(multiSend);
						msocket.send(multiPacketSend);
						System.out.println("Sending on Port: " + port);
						System.out.println("Sending: " + tmp);
					//}
				}
			
		}
	}
}
```

hier der thread der ständig abfragen soll


```
package mvi;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ChatListenThreadMulti extends Thread {
	private MulticastSocket socket = null;
	private boolean exit = false;
	
	//Konstruktor erstellt einen DatagramSocket zum hören auf dem verwendeten Port
	public ChatListenThreadMulti (int port) {
		
		//Namen des Thread
		//super("MyChatThread");
		
		//Socket auf Port erstellen
		try {
			socket = new MulticastSocket(port);
			System.out.println("Listening on Port: " + socket.getLocalPort());
		}
		catch(IOException e){
			System.out.println("Kann keinen DatagramSocket erzeugen auf dem Port " + port);
		}
	}
	
	//Überlagerung der Methode run der Klasse Thread
	public void run() {
		//wenn kein DatagramSocket erzeugt werden kann, wird der Thread abgebrochen.
		if (socket == null)
			return;
		
		//Höre solange auf dem Port, bis es abgebrochen wird
		while(!exit) {
			try {
				//Hier kommen die Eingegangenen Nachrichten rein
				byte[] buf = new byte[256];
				DatagramPacket packet;
				
				//Passendes DatagramPacket anlegen
				packet = new DatagramPacket(buf, buf.length);
				
				//Daten empfangen auf socket
				socket.receive(packet);
				
				//Adresse der Adressdatei ermitteln und ausgeben
				InetAddress address = packet.getAddress();
				
				//Daten auslesen
				String received = new String(packet.getData(), 0, packet.getLength());
				
				//Daten ausgeben
				System.out.println("Nachricht empfangen von: " + address.getHostAddress() + ": " + received);
			}
			catch(IOException e) {
				System.err.println("Kann keinen DatagramSocket erzeugen");
				exit = true;
			}
		}
		//Socket wieder schliessen
		socket.close();
	}
	public DatagramSocket getListenSocket(){
		return socket;
	}
}
```

für euere hilfe wäre ich sehr dankbar, bin noch anfänger!!

danke


----------



## dieta (24. Apr 2006)

Kann es vielleicht sein, dass du WinXP mit ServicePack 2 verwendest? Das blockt auf jeden Fall alles was von DatagramSocket versucht wird zu senden.


----------



## villiboy (25. Apr 2006)

ja ich verwende winXp servicepack2 aber das problem habe ich jetzt gelöst. aber jetzt habe ich ein anderes ...

trotzdem danke


----------



## villiboy (25. Apr 2006)

hier mal der neue code ....

also ich möchte gerne ein buddy-object zu beginn des chats starten. diese daten hole ich mir aus einer property-datei. das buddy-object serialisiere ich mit den property-daten. dann möchte ich den chat starten und danach auswählen können wie ich die nachrichten versenden möchte bzw. an wen.

hier mal der code:


```
package mvi;

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

public class Chat {

	/**
	 * @author Martin
	 * @param args
	 * @throws Exception 
	 * 
	 */
	
	public static void main(String[] args)throws Exception {
		// TODO Auto-generated method stub
		
		BufferedReader men = new BufferedReader(new InputStreamReader(System.in));
		String tmp;
		
		PropertyParser mp = new PropertyParser("IMCL_properties.htm");//später über args[0] einlesen
		Buddy bo = new Buddy(PropertyParser.nickname, mp.multiAddress, PropertyParser.mport);
		
		//Testlauf zum verschicken von Buddys
		DatagramSocket testsocket = new DatagramSocket(PropertyParser.mport);
		
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		ObjectOutputStream ous = new ObjectOutputStream(bout);
		ous.writeObject(bo);
		ous.close();
		byte []data = bout.toByteArray();
		System.out.println("MARKE1");
		BuddyList bl = new BuddyList();
		System.out.println("MARKE2");
		bl.buddySend(data, testsocket, mp);
		System.out.println("MARKE3");
		bl.buddyReceive(testsocket);
		System.out.println("MARKE4");
		bl.add(bo);
		System.out.println("Buddy-Object gesendet!");
		testsocket.close();
		
		
		
		System.out.println("**************************************************");
		System.out.println("****** Herzlich Willkommen im MVI-Chat SS06 ******");
		System.out.println("**************************************************");
		
		System.out.println("MENUE:");
		System.out.println("1. sendToChannel");
		System.out.println("2. sendToUser");
		System.out.println("3. exit");
		
		System.out.print("Bitte Option auswählen 1,2 oder 3: ");
		
		try {
			while(true) {
				tmp = men.readLine();
				int readOption = Integer.parseInt(tmp);
		
					switch(readOption) {	
						case 1: {
							//TODO Hier wird die Klasse MultiCast.java aufgerufen
							MultiCast mc = new MultiCast(mp,bo);
							System.out.println("Option 1 gewählt!");
							break;
						}
						case 2: {
							//TODO Hier wird die Klasse Unicast.java aufgerufen
							UniCast uc = new UniCast(mp,bo);
							System.out.println("Option 2 gewählt!");
							break;
						}
						case 3: {
							//Hier wird der Chat beendet
							System.out.println("Chat beendet");
							break;
						}
						default: {
							System.out.println("Nicht erlaubte eingabe !!!");
							break;
						}
					}
			}
		}
		catch(IOException e) {
			System.out.println("ERROR");
		}
	}
}
```

hier die klasse buddyList, wo ich alle teilnehmenden buddy-obj. speichern möchte bzw. funktionen zum versenden und zum empfangen.


```
package mvi;

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

public class BuddyList {
	
	Vector buList = new Vector(10);
	byte[] buffer = new byte[256];
	
	
	//Buddy-Object dem Vector buList hinzufügen
	void add(Buddy bu) {
		if(buList.add(bu)) {
			System.out.println("Buddy: " + bu.getNick() + " in BuddyList eingetragen!");
		}
		else {
			System.out.println("Buddy konnte nicht in die Liste eingefügt werden!");
		}			
	}
	
	//Buddy-Object versenden
	void buddySend(byte[] buObject, DatagramSocket dsocket, PropertyParser pp){
		try {
			DatagramPacket dpacket = new DatagramPacket(buObject, buObject.length, pp.broadAddress, PropertyParser.mport);
			dsocket.send(dpacket);
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	//Buddy-Object empfangen
	void buddyReceive(DatagramSocket dsocket) {
		try {
			DatagramPacket dpacket = new DatagramPacket(buffer, buffer.length);
			dsocket.receive(dpacket);
			byte[]data = dpacket.getData();
			
			ByteArrayInputStream bais = new ByteArrayInputStream(data);
			ObjectInputStream ois = new ObjectInputStream(bais);
			Buddy bu = (Buddy) ois.readObject();
			System.out.println(bu.getNick());
			ois.close();
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	//Buddy-Object ausgeben
	void printList() {
		for(int i=0; i < buList.size(); i++) {
			System.out.println(buList.get(i));
		}
	}
}
```

problem ist, wenn ich den chat und eine copy des chats mit anderen property-werten starte. 
bekomme ich folgende fehlermeldung:

Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
	at java.net.PlainDatagramSocketImpl.bind0(Native Method)
	at java.net.PlainDatagramSocketImpl.bind(Unknown Source)
	at java.net.DatagramSocket.bind(Unknown Source)
	at java.net.DatagramSocket.<init>(Unknown Source)
	at java.net.DatagramSocket.<init>(Unknown Source)
	at java.net.DatagramSocket.<init>(Unknown Source)
	at mvi.Chat.main(Chat.java:25)

irgendwie finde ich meinen fehler nicht.

wäre nett, wenn mir da jemand weiter helfen könnte!!!

danke


----------



## dieta (1. Mai 2006)

Der Fehler kommt daher, dass du auf einem Computer einen Port nur einmal öffnen kannst (so ist es jedenfalls bei mir). Wenn du dein Programm aber zwei mal auf dem selben Computer startest, versucht er den Port zwei mal zu öffnen.


----------

