# Alle Rechner im Netzwerk ermitteln



## c_sidi90 (10. Mai 2011)

Ich habe ein Chatprogramm entwickelt, welches gleichzeitig Server und Client ist. Dieses Programm soll Gruppen erstellen können, wenn man z.B. als Empfänger "ALLE" eintippt, soll die Nachricht an alle User im Netzwerk geschickt werden. 

Meine Frage: Wie kann ich diese ermitteln? Via MulticastSocket ?
Das Programm arbeitet mit einem Datagram Socket.

Mfg


----------



## Andi_CH (10. Mai 2011)

Da hatten wir schon mal was ähnliches. Vielleicht hilft dir das da weiter.


----------



## SlaterB (10. Mai 2011)

mit 149 Postings sollte man wissen dass das kein Thema für Java-Basics ist, sondern z.B. für Netzwerkprogrammierung (!)
verschoben


----------



## c_sidi90 (10. Mai 2011)

Danke, da ging es aber darum, wie ich Server und Client in einer Anwendung implementiere. Und @ Slater hoffe du kannst das am frühen Morgen verkraften das ich in die falsche Rubrik gepostet habe


----------



## Andi_CH (10. Mai 2011)

Funktioniert der chat denn ansonsten peer to peer?

Ich geh mal davon aus, dass es nicht so ist - es wird also einen Server geben und der weiss wer alles im Netz ist - die Clients haben sich ja bei ihm angemeldet.

Also schick die Meldung an den Server mit der "Adresse" "alle" und der verteilt sie dann an alle.

Allerdings ist meine Glaskugel gerade in Reparatur und man sollte vielleicht etwas mehr über die aktuelle Implementation wissen um das elegant beantworten zu können.


----------



## c_sidi90 (10. Mai 2011)

Der >Chat funktioniert einwandfrei unter allen Netzteilnehmern, allerdings peer to peer sprich Nachrichten werden nur zwischen 2 Personen verschickt. Wer die Nachricht erhält wird durch den Netzwerknamen des Rechners ermittelt. Aber ich möchte halt eine Nachricht an alle im Netzwerk schicken und muss dafür diese erst ermitteln können. 

EDIT: Als Server fungiert der Client, welcher sich als erstes startet.

mfg


----------



## Andi_CH (10. Mai 2011)

Wozu braucht es dann einen Server?
Was macht der?
Wie kommt der Client zur Verbindung zum anderen Client?

Ich bin immer noch der Meinung, dass nur der Server weiss wer alles im Netz ist - die haben sich ja gemeldet, also schick die Meldung dem Server und der soll sie verteilen.


----------



## c_sidi90 (10. Mai 2011)

Also das Programm Prüft zu beginn ob es einen Socket auf einem festgelegten Port gibt, wenn nicht startet das Programm einen Thread welcher einen Server erstellt und laufen lässt. Jedes Programm prüft zum Start ob auf dem Port ein Server horcht. Wenn nicht wird der Thread nicht gestartet und es wird nur eine Funktion zum Senden einer Nachricht an diesen Port benutzt.


----------



## Andi_CH (10. Mai 2011)

Das wissen wir schon und es hilft nicht wirklich weiter - WAS macht der Server was hat der überhaupt für Aufgaben?

Wenn der Client merkt, dass da schon ein Server läuft muss er dem Server doch sagen dass er da ist und der muss sich das irgendwie merken.

Wenn einer Client einem anderen eine Meldung schicken will geht die ja wohl kaum peer to peer direkt zum Client, sondern läuft über den Server - oder nicht? Wenn doch wie kommt er zur IP Adresse des anderen Clients?

--

Oder mal frech gefragt, weisst du überhaupt was deine Software macht ;-)


----------



## c_sidi90 (10. Mai 2011)

Der Client schickt Datagrampackete an den Server diese Beinhalten die IPAdresse des Empfängers. Der Server leitet dieses Packet dann an den Client weiter. 

Ich weiss was ich programmiert habe


----------



## Andi_CH (10. Mai 2011)

Boah also ist es doch kein peer to peer system - also weiss der schon welcher Client welche IP hat

1. Vermutlich unnötig, da vermutlich schon vorhanden: Software so umbauen, dass der Server eine Liste führt wer sich alles anmeldet

2. Auch das ist vermutlich schon so: Client so umbauen, dass der nicht nur prüft ob ein Server läuft sondern sich bei dem auch anmeldet

3. Server umbauen, dass er den Benutzer "Alle" kennt und die Meldung dann an alle angemeldeten Clients schickt.

Falls immer noch unklar: Kompilierbare Software posten ;-)


----------



## c_sidi90 (10. Mai 2011)

Ich meinte auch das der Chat MOMENTAN peer to peer funktioniert   Der Server führt keine Liste darüber, er leitet nur die Datagrampackete weiter. Die IP der Empfänger hat ermittelt der Client aus dem Computernamen im Netzwerk.


----------



## c_sidi90 (10. Mai 2011)

Hier mal die Serverklasse


```
class ThreadServer extends Thread {
	
	private UDPProjektNeu udp;
    public boolean running;
    
    public ThreadServer(UDPProjektNeu udp){
        this.udp = udp;
    }
    
    public void shutDown(){
    	running = false;
    }

	public void run(){
		
		running = true;
		DatagramSocket socket = null;
		
		try {
			socket = new DatagramSocket(5001);
		}
		catch (SocketException e) {
			
			try {
				socket = new DatagramSocket();
			}
			catch (SocketException e1) {
			
			}
		}
		
		 while(running==true){
			 
			byte[] inData = new byte[1024];
			String message;
			DatagramPacket in = new DatagramPacket(inData, inData.length);
				
			try {
				
				socket.receive(in);
				
			} catch (IOException e) {
				running = false;
				socket.close();
				udp.chatArea.append("Packet konnte nicht empfangen werden");
			}
				
			String senderName = in.getAddress().getHostName();
			message = new String(in.getData(),0,in.getLength());
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
			String uhrzeit = sdf.format(new Date());
			udp.chatArea.append(uhrzeit +" "+ senderName+":"+"\r\n" +message+"\r\n");
		}
		 
		 socket.close();
	}
```


----------



## Spacerat (10. Mai 2011)

Also iwie muss sich der Server (bei wem er auch immer gestartet wird, die verbundenen Clienten merken, z.B. in einer Liste, bzw. an einer "Map of Lists", sprich "Map<Channel, List<Client>>". Kann doch nicht so schwer sein, die Pakete an die gewünschten Gruppen weiterzuleiten. Das würde dann so gehen, indem man durch die Liste der jeweiligen Gruppe iteriert oder viel besser, über eine Multicast-IP der Gruppe.
@Edit: Schon wieder zu langsam... man wird alt


----------



## c_sidi90 (10. Mai 2011)

also praktisch im laufenden thread die senderIp in eine Liste speichern und bei jedem Packet prüfen ob diese schon in der Liste ist, wenn nicht diese hinzufügen?


----------



## Spacerat (10. Mai 2011)

Sorry? Bei der Anmeldung in die Liste eintragen, nicht erst, wenn Messages empfangen bzw. gesendet werden  Das erspart dauernde Überprüfungen.


----------



## c_sidi90 (10. Mai 2011)

Okay ich grübel nach der Mittagspause mal wie ich das am besten realisieren kann. Danke für den Tipp


----------



## Andi_CH (11. Mai 2011)

c_sidi90 hat gesagt.:


> Ich meinte auch das der Chat MOMENTAN peer to peer funktioniert   Der Server führt keine Liste darüber, er leitet nur die Datagrampackete weiter. Die IP der Empfänger hat ermittelt der Client aus dem Computernamen im Netzwerk.



Peer to peer heisst dass der Client die Datenpaket direkt an den anderen Client schickt - da die Datenpakete aber über den Server laufen ist es KEIN peer to peer system!
Ist das so schwierig zu verstehen?
Und ich hab ja getippt, dass der Server, falls er es noch nicht tut, eine Liste führen muss.

Spannend finde ich, dass du jetzt auch von anderer Seite so in etwa denselben Vorschlag wie von mir zu lesen bekommen hast und ihn offensichtlich immer noch nicht verstehst. 
Falls ich wieder einmal auf ein Testresultat warten muss und du bis dann deine komplette kompilierbare und lauffähige Software gepostet hast, löse ich das Problemchen schnell.


----------

