# Andere Rechner im Netz finden



## taouri (30. Jun 2008)

Hallo zusammen,

ich möchte ein kleines Chatprogramm bauen, um mich mal wieder ein wenig mit der Java-Netzwerkprogrammierung zu beschäftigen. Dazu wollte ich alle Rechner im lokalen Netzwerk einbeziehen. Mein Problem ist jetzt, dass ich keine Ahnung habe, wie das mit Java gehen soll, da man auf den mir bekannten Wegen lediglich bis zum Router oder vielleicht auch einem über ad-hoc verbunden PC kommt aber nicht an die Rechner, die sich sonst noch hinter dem Router verbergen (sprich Rechner in einem MS-Heimnetz via Router).
Gibt es in Java überhaupt eine Möglichkeit die restlichen Rechner im Netz zu identifizieren? Oder muss man da externe Programme bemühen?
Ich habs schon mit nem Programm aus der Java-Insel probiert aber das bringt mich wie gesagt nur bis zu meinem Router. Auch das entsprechende Tutorial von Sun war nicht besonders aufschlussreich. Daher wende ich mich an euch, vielleicht hatte ja jemand schonmal das Problem.

Vielen Dank schonmal

taouri


----------



## tuxedo (30. Jun 2008)

Such mal nach dem Stichwort: Multicast

Geht aber nur in lokalen Netzen und nicht übers Internet (da kommst du ohne Index-Server nicht weiter).

- Alex


----------



## taouri (30. Jun 2008)

Vielen Dank erst mal für die schnelle Antwort.

Wenn ich den Weg richtig verstanden habe, dann versucht man also über ein MulticastSocket eine Nachricht an alle anderen im Netz zu schicken und wartet dann auf Antwort. Ist das soweit richtig? Mein Problem wäre dann: Was mache ich mit Rechnern auf denen das Partnerprogramm gerade nicht läuft? Gibt es auch eine Möglichkeit die anderen Rechner einfach aufzulisten, ohne sie kontaktieren zu müssen?

Vielen Dank

taouri


----------



## tuxedo (30. Jun 2008)

Jupp, hast du soweit richtig verstanden. 

Wer allerdings nicht auf Nachrichten der Multicastgruppe hört, kann nicht antworten.

Dann gibts nur noch den Broadcast. Aber wie und ob das mit Java möglich ist: Keine Ahnung. Hab ich nie probiert. Aber was willst du mit Rechnern auf denen die Anwendung nicht läuft? Was haben die von deinem Chat?

- Alex


----------



## taouri (1. Jul 2008)

Ich glaube dazu sollte ich erst einmal erklären, wie das ganze überhaupt funktionieren soll:

Ich wollte das Ganze ein wenig wie ICQ aufbauen, das heißt wir haben ein Center, in dem Alle Teilnehmer (in diesem Fall alle im Netzwerk) aufgelistet werden. Ist der entsprechende Teilnehmer da, wird er online angezeigt, ansonsten offline (daher auch ohne laufendes Programm).
Aber vermutlich wäre es in diesem Fall einfacher, sich die offline-user zu sparen und wirklich nur die aufzunehmen, die gerade on sind oder on gehen.

Auf jeden Fall vielen Dank

taouri


----------



## Gelöschtes Mitglied 5909 (1. Jul 2008)

alle chat clients müssen sich regelmäßig melden.
Tut einer dies nicht -> offline

und wenn du noch ne übersicht haben willst wer offline ist,
muss sich jeder client vorher einmal "registrieren" (sei es "hallo, es gibt mich" oder "hallo, ich bin hugo")


----------



## tuxedo (2. Jul 2008)

Wenn du eh einen "Centerä" hast, wozu dann der quatsch mit dem "andere Rechner im Netz finden"? Da eh jeder den Center kennt, kann der doch die Aufgabe, wie raiL ja schon beschrieben hat, übernehmen. 

Machst du die Chat-Kommunikation direkt zwischen den Clients aus, oder geht alles über den Server? Oder hast du gleich eine Fallback-Strategie wenn P2P zwischen den Clients nicht geht, dass das ganze dann über den Server geht?

Hast du schon mal an RMI gedacht? Wenn das ganze noch übers Internet laufen können soll/muss, kannst du dir auch mal SIMON anschauen (siehe Signatur). 

Sowohl bei SIMON als auch bei RMI musst du dich nicht explizit immer wieder am Server melden damit der noch weiß dass du da bist. "Intern" läuft da eine Art Ping-Pong in regelmäßigen Abständen ab mit dem geprüft wird ob der Client/Server noch da ist. Bei beiden lässt sich der Intervall einstellen.

- Alex


----------



## taouri (2. Jul 2008)

Also Danke nochmal aber ich hab es jetzt so geregelt, dass sich jeder an und auch wieder abmelden muss. Das Ganze läuft direkt P2P ohne zentralen Server (mit Center meinte ich nämlich eigentlich ne GUI, in der die Nutzer aufgelistet sind ;-) ). RMI hatte ich mir auch schon überlegt aber damit habe ich streckenweise schlechte Erfahrungen gemacht, sobald Firewalls im Spiel sind.
Auf jeden Fall nochmal vielen Dank an alle

taouri


----------



## tuxedo (2. Jul 2008)

Deshalb hab ich ja SIMON erwähnt ;-) *NochmalMitDemZaunpfahlWink*

- Alex


----------



## taouri (2. Jul 2008)

Hallo nochmal,

Ok, anscheinend hab ich ein neues Problem: Ich hab jetzt zwar alles auf Multicast umgestellt aber leider bekomme ich die Multicast-Adresse nicht heraus (die IP meines Router ist angeblich keine Multicast-Adresse) und ehrlich gesagt habe ich keine Ahnung, wie ich diese Adresse herausbekommen soll.
Kann mir da jemand helfen?

Vielen Dank mal wieder ;-)

taouri


----------



## tuxedo (2. Jul 2008)

Multicast über Routergrenzen hinweg ist problematisch. Der Router muss das abkönnen. Und wenn der Router dich ins Internet verbindet hast du eh verloren: Kenne keinen "herkömmlichen" Provider der Multicst erlaubt ;-) 

Wie gesagt: Ohne zentralen Server hast du im Falle der Kommunikation über das Internet - zu deutsch gesagt - "verschissen".

- Alex


----------



## taouri (2. Jul 2008)

Nein, nein, das soll nicht das Problem sein. Das ganze spielt sich nur im lokalen Netz ab, mit dem Internet hab ich da noch gar nichts zu tun. Das würde ich auch nie über Sockets machen ;-). Es geht mir nur darum im lokalen Netz (allerdings auch durch Router verbunden) den Multicast zu fahren.

Gruß

taouri


----------



## tuxedo (3. Jul 2008)

taouri hat gesagt.:
			
		

> Nein, nein, das soll nicht das Problem sein. Das ganze spielt sich nur im lokalen Netz ab, mit dem Internet hab ich da noch gar nichts zu tun.



Na sag das doch gleich.



> Das würde ich auch nie über Sockets machen ;-).


Das ist jetzt nicht dein ernst!!?? Erklär mir doch bitte mal wie du sonst im Internet eine Verbindung aufbaust? Zumindest ist mir auch TCP/IP Ebene keine andere Möglichkeit bekannt. 



> Es geht mir nur darum im lokalen Netz (allerdings auch durch Router verbunden) den Multicast zu fahren.



Wie gesagt: Die Router müssen Multicast beherrschen (und das kann nicht jeder). Tun sie das nicht: Sehr schlecht. Kläre also erstmal ab ob die das können. Wenn nicht, solltest du mal nach Broadcast schauen. Das klappt vermutlich schon eher:

http://de.wikipedia.org/wiki/Broadcast

Siehe auch:

http://www.java-forum.org/de/viewtopic.php?t=58752&postdays=0&postorder=asc&start=0

Da wurde das Thema Broadcast denke ich ausreichend tief behandelt.

- Alex


----------



## taouri (3. Jul 2008)

Hi nochmal,

also mit Internet und Socket hast du natürlich recht, da hab ich Blödsinn geredet, war wohl nicht mehr ganz da.  :wink: 
Die Lösung mit dem Broadcast ist grundsätzlich natürlich eine schöne Idee, Problem ist nur, dass ich bei Verbindungsaufbau mit der Adresse 255.255.255.255 (so wie es in genanntem Link beschrieben wurde) eine ConnectException bekomme die mir da sagt: "Address is invalid on locale machine, or port is not valid on remote machine". Dass mein Router den Port ausgehend sperrt kann ich mir eigentlich nicht vorstellen, insbesondere da der Port 4711 von keinem anderen Dienst belegt sein dürfte. Daher hat wohl mein PC ein Problem mit der Adresse.
Über Lösungsansätze würde ich mich sehr freuen.

Gruß

taouri


----------



## Gelöschtes Mitglied 5909 (3. Jul 2008)

du darfst nicht 255.255.255.255 schicken,
sondern nur die hostadresse soll 255 sein (kommt auf deine LAN IP an - siehe wiki artikel)

desweiteren funkltioniert es wie gesagt nicht übers internet
und meines wissens auch nicht wenn ein weiterer router / switch dazwischen ist


----------



## Gast v2.0 (3. Jul 2008)

schau hier mal (is sogar mit code-beispielen):
www.roseindia.net/java/example/java/net/udp/multicast.shtml


----------



## tuxedo (4. Jul 2008)

Öhm, die Seite enthält soweit ich das sehen kann keinen Code-Schnipsel. Aber erklärt ist es trotzdem gut.

- Alex


----------



## Gelöschtes Mitglied 5909 (4. Jul 2008)

oben aufm pfeil rechts clicken dann sind da beispiele


----------



## tuxedo (4. Jul 2008)

Ah, jetzt. Nach Navigationspfeilen sieht das aber nicht aus, so klein wie die sind. Auf meinem 24" fallen die als solche gar nicht auf. Sieht mehr nach "Deko" aus.

- Alex


----------



## taouri (4. Jul 2008)

Leider funktioniert das nicht so ganz. Ich habe mich im übrigen auch über die 255.255.255.255 gewundert aber exakt so stand es nun einem in dem verlinkten Thread. Natürlich habe ich auch versucht die normale Broadcast-Adresse zu benutzen, sprich die: 192.168.1.255 - die führt aber zum selben Fehler wie die 255.255.255.255 . Und auf der verlinkten Website habe ich nur Codeschnipsel zum Thema Multicast, nicht aber Broadcast gesehen und Multicast funktionier bei mir nicht. 
Wie bereits gesagt hab ich mit dem Internet nichts am Hut, das spielt sich alles lokal ab. Allerdings läuft das Netwerk wie bereits gesagt über einen Router. Vielleicht erlaubt der keine Broadcasts, da hab ich keine Ahnung (war da nicht was wie: Router trennen Broadcast-Domänen?).
Auf jeden Fall gehen mir langsam echt die Ideen aus. Hat vielleicht noch jemand eine? Ansonsten lege ich das Projekt einfach ad acta  :roll: 
Danke nochmal

Gruß

taouri


----------



## Lulumann6 (4. Jul 2008)

broadcast senden:

```
socket = new DatagramSocket();
ia = InetAddress.getByName("255.255.255.255");
dgram = new DatagramPacket(data, data.length,ia, port);
socket.send(dgram);
```
broadcast empfangen:

```
socket = new DatagramSocket(port);
gram = new DatagramPacket(data, data.length);
socket.receive(dgram);
```

damit sollte es aufjedenfall klappen, tut bei mir auch


----------



## taouri (7. Jul 2008)

Vielen Dank Lulumann, auf jeden Fall bekomme ich keine Fehlermeldung mehr. Im Netwerl konnte ichs bisher noch nicht testen, ich melde mich dann noch mal.

Gruß

taouri


----------

