Grundlagen von Netzwerkanwendungen
Guten Tag!
Ich beschäftige mich seit kurzem mit Java und bin gerade dabei, mir ein neues Projekt zu überlegen.
Dabei dachte ich an ein Netzwerkfähiges Programm.
Ich habe schon versucht mich ein bisschen in das Thema einzulesen, stoße dabei aber auf das Problem, der fehlenden Grundlagenkenntnisse.
Ist es möglich ein Programm mit Java zu entwickeln, das direkt über Internet von Benutzer zu Benutzer arbeitet?
Wie ich es bisher verstanden habe, sind die meisten Anwendungen mit einem Server realisiert, der über eine feste IP, bzw URL angesprochen wird und die Daten dann, wenn gewünscht, an einen anderen Clienten weiterleitet.
Ist so etwas auch ohne Server möglich?
Wenn ja, wie kann man das Ziel der Daten ermitteln, wenn der Client eine dynamische IP hat?
Ich hoffe, ihr könnt mich da ein bisschen belehren, was den Datenverkehr über das Internet angeht. ;)
Mfg, Florian N.
Ich beschäftige mich seit kurzem mit Java und bin gerade dabei, mir ein neues Projekt zu überlegen.
Dabei dachte ich an ein Netzwerkfähiges Programm.
Ich habe schon versucht mich ein bisschen in das Thema einzulesen, stoße dabei aber auf das Problem, der fehlenden Grundlagenkenntnisse.
Ist es möglich ein Programm mit Java zu entwickeln, das direkt über Internet von Benutzer zu Benutzer arbeitet?
Wie ich es bisher verstanden habe, sind die meisten Anwendungen mit einem Server realisiert, der über eine feste IP, bzw URL angesprochen wird und die Daten dann, wenn gewünscht, an einen anderen Clienten weiterleitet.
Ist so etwas auch ohne Server möglich?
Wenn ja, wie kann man das Ziel der Daten ermitteln, wenn der Client eine dynamische IP hat?
Ich hoffe, ihr könnt mich da ein bisschen belehren, was den Datenverkehr über das Internet angeht. ;)
Mfg, Florian N.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 160142
Url: https://administrator.de/forum/grundlagen-von-netzwerkanwendungen-160142.html
Ausgedruckt am: 11.04.2025 um 07:04 Uhr
12 Kommentare
Neuester Kommentar
Moin,
klar ist das Möglich. Aber alles andere als trivial. Denn wenn du keinen Master-Server hast dann musst du ja irgendwie erkennen wo dein Programm läuft - dies ist das Prinzip von dezentralen Filesharing-Systemen ohne Server. Dabei brauchst du dann genau EINEN bekannten Punkt - bei dem meldest du dich und gibst ihm deine Adresse. Im Gegenzug erhälst du von dem alle Adressen die er kennt. Jetzt nimmst du Kontakt zu jeder dieser Adressen auf - und gibst dort deine Adresse bekannt. Im Gegenzug bekommst du von jedem alle seine bekannten Adressen... Das ganz ein einer schönen Schleife verpackt - und es geht los... Ggf. per Threads im Hintergrund immer wieder aktuallisieren lassen - dann hast du recht schnell eine umfangreiche Liste...
ABER: Das lohnt eben nur bei entsprechender Verbreitung des Programmes. Hast du nur eine Handvoll Systeme die überall eine dynamische IP haben wird das nicht funktionieren - die finden sich ja nicht. Hier würde ich dir empfehlen dir einen zentralen Server zu bauen - diesen kannst du dann in eine XML-Konfiguration packen und zur Laufzeit einlesen. Grade zu Anfang ist das glaube ich auch erheblich einfacher zu bauen und zu verstehen als gleich mit der Tür ins Haus zu fallen...
Schönen Gruß
Mike
klar ist das Möglich. Aber alles andere als trivial. Denn wenn du keinen Master-Server hast dann musst du ja irgendwie erkennen wo dein Programm läuft - dies ist das Prinzip von dezentralen Filesharing-Systemen ohne Server. Dabei brauchst du dann genau EINEN bekannten Punkt - bei dem meldest du dich und gibst ihm deine Adresse. Im Gegenzug erhälst du von dem alle Adressen die er kennt. Jetzt nimmst du Kontakt zu jeder dieser Adressen auf - und gibst dort deine Adresse bekannt. Im Gegenzug bekommst du von jedem alle seine bekannten Adressen... Das ganz ein einer schönen Schleife verpackt - und es geht los... Ggf. per Threads im Hintergrund immer wieder aktuallisieren lassen - dann hast du recht schnell eine umfangreiche Liste...
ABER: Das lohnt eben nur bei entsprechender Verbreitung des Programmes. Hast du nur eine Handvoll Systeme die überall eine dynamische IP haben wird das nicht funktionieren - die finden sich ja nicht. Hier würde ich dir empfehlen dir einen zentralen Server zu bauen - diesen kannst du dann in eine XML-Konfiguration packen und zur Laufzeit einlesen. Grade zu Anfang ist das glaube ich auch erheblich einfacher zu bauen und zu verstehen als gleich mit der Tür ins Haus zu fallen...
Schönen Gruß
Mike
Moin,
naja - wie der Punkt aussieht ist ja die Frage wie du das realisieren möchtest. Du kannst ja z.B. deine Anwendung selbst als Client-Server-Anwendung bauen. D.h. du bist selbst der Server - und gleichzeitig der Client. Das würde ich realisieren indem ich einen Thread "Server" im Hintergrund laufen lasse der eben auf einem Socket hört -> darüber tausche ich dann die IPs aus. Schon kann ich mit meinem local-host-Client diesen Server genauso ansprechen und bekomme immer die aktuellen IPs die mir zur Verfügung stehen. Ich brauche dann die IPs ggf. nur in einer simplen ArrayList / List verwalten -> thema erledigt.
Im Client selbst musst du dann nur per Thread dafür sorgen das der Regelmäßig seine IP an alle IPs aus seiner Liste gibt. Damit registriere ich mich dann bei jedem anderen (bekannten) Client. Am Ende hast du auf jedem Rechner eben einen Server-Prozess der alle bekannten IPs enthält.
Das ganz kannst du natürlich auch ohne extra Hardware lösen. Z.B. über DynDNS dir einen "statischen" Hostnamen aufbauen - und im Programm (bzw. in der XML zur Laufzeit) diesen Hostnamen hinterlegen.
ABER: Wie gesagt, es gibt auch noch andere Optionen. Ich würde dir z.B. empfehlen dir einen Server zu bauen der z.B. eine XML-File entgegen nimmt. Diese könnte wie folgt aussehen:
<xml....>
<host>
<ip>123.123.123.123</ip>
<port>12345</port>
</host>
</xml>
(natürlich sollte die ein gütliges XML-Format haben). Diese Daten kannst du z.B. dann in eine DB eintragen - und mit einem Timestamp versehen. Jetzt hast du einen zentralen Server der eben den Leuten die IPs und die Ports zu den anderen Stationen überträgt. Das hat den Vorteil das du eben nicht eine 1:n-Verbindung in den Clients aufbauen musst - sondern von genau EINEM Server alle Daten bekommst. Damit kann dein Client im Endeffekt wirklich ein Client bleiben - ohne große Server-Komponenten...
naja - wie der Punkt aussieht ist ja die Frage wie du das realisieren möchtest. Du kannst ja z.B. deine Anwendung selbst als Client-Server-Anwendung bauen. D.h. du bist selbst der Server - und gleichzeitig der Client. Das würde ich realisieren indem ich einen Thread "Server" im Hintergrund laufen lasse der eben auf einem Socket hört -> darüber tausche ich dann die IPs aus. Schon kann ich mit meinem local-host-Client diesen Server genauso ansprechen und bekomme immer die aktuellen IPs die mir zur Verfügung stehen. Ich brauche dann die IPs ggf. nur in einer simplen ArrayList / List verwalten -> thema erledigt.
Im Client selbst musst du dann nur per Thread dafür sorgen das der Regelmäßig seine IP an alle IPs aus seiner Liste gibt. Damit registriere ich mich dann bei jedem anderen (bekannten) Client. Am Ende hast du auf jedem Rechner eben einen Server-Prozess der alle bekannten IPs enthält.
Das ganz kannst du natürlich auch ohne extra Hardware lösen. Z.B. über DynDNS dir einen "statischen" Hostnamen aufbauen - und im Programm (bzw. in der XML zur Laufzeit) diesen Hostnamen hinterlegen.
ABER: Wie gesagt, es gibt auch noch andere Optionen. Ich würde dir z.B. empfehlen dir einen Server zu bauen der z.B. eine XML-File entgegen nimmt. Diese könnte wie folgt aussehen:
<xml....>
<host>
<ip>123.123.123.123</ip>
<port>12345</port>
</host>
</xml>
(natürlich sollte die ein gütliges XML-Format haben). Diese Daten kannst du z.B. dann in eine DB eintragen - und mit einem Timestamp versehen. Jetzt hast du einen zentralen Server der eben den Leuten die IPs und die Ports zu den anderen Stationen überträgt. Das hat den Vorteil das du eben nicht eine 1:n-Verbindung in den Clients aufbauen musst - sondern von genau EINEM Server alle Daten bekommst. Damit kann dein Client im Endeffekt wirklich ein Client bleiben - ohne große Server-Komponenten...
generell stimmt das. Ich würde allerdings das so machen das du z.B. alle 5 Minuten deine IP neu an den Server gibst - und nur IPs zurückgegeben werden die nicht älter als 5 Minuten sind. Falls dein Rechner mal abschmiert ist es dann auch kein Problem.
Du kannst z.B. die XML ja noch erweitern ->
<command>login</command> z.B. beim Anmelden senden
<command>update</command> beim aktuallisieren
<command>logoff</command> beim gewollten Abmelden
Du kannst z.B. die XML ja noch erweitern ->
<command>login</command> z.B. beim Anmelden senden
<command>update</command> beim aktuallisieren
<command>logoff</command> beim gewollten Abmelden
Nabend Namensvetter,
Aber fang doch etwas kleiner an. Klappt denn die verbindungsorientierte Kommunikation, bspw. mittels der Klassen Socket und ServerSocket bereits lokal?
LG Florian
ps: bzw ein Problem hätte ich noch, bei dem mir auch Google nicht helfen konnte:
Wie bekomme ich die benötigte Client-Ip heraus?
Auf direktem Wege (IMHO) gar nicht. Du fragst den "zwischengeschalteten" zentralen Server im Netz ab, indem dieser eine entsprechende Methode dafür bereitstellt.Wie bekomme ich die benötigte Client-Ip heraus?
java.net.InetAddress.getLocalHost().getHostAddress()
liefert ja nur die Ip Adresse im lokalen Netzwerk.Aber fang doch etwas kleiner an. Klappt denn die verbindungsorientierte Kommunikation, bspw. mittels der Klassen Socket und ServerSocket bereits lokal?
LG Florian
Hallo nochmal,
Ich würde es erst mal im lokalen Netzwerk ausprobieren. Evtl erst über Verbindungsloses UDP, dann TCP, etc.
Viel Erfolg
Grüsse Florian
Zitat von @Letavino:
Das bedeutet, der Client schickt seine Daten an den Server und der Server verarbeitet diese und kann mit einer geeigneten Methode die Client IP herauslesen, ohne, dass der Client diese explizit mitschicken muss; habe ich das so richtig verstanden?
Genau! Der client zeichnet sich durch seine IP-Adresse übers TCP/IP ja sowieso aus, ansonsten könnte ja überhaupt keine verbindungsorientierte Kommunikation zustandekommen.Das bedeutet, der Client schickt seine Daten an den Server und der Server verarbeitet diese und kann mit einer geeigneten Methode die Client IP herauslesen, ohne, dass der Client diese explizit mitschicken muss; habe ich das so richtig verstanden?
Ich dachte mir, mich erst einmal mit den Grundlagen, bzw dem Verständnis des ganzen auseinander zu setzen.
Sehr gute Idee!Aber wahrscheinlich werde ich erstmal klein anfangen, wenn es ums Programmieren geht und mich dann steigern ;)
dto.Ich würde es erst mal im lokalen Netzwerk ausprobieren. Evtl erst über Verbindungsloses UDP, dann TCP, etc.
Viel Erfolg
Grüsse Florian
Hallo nochmal,
das klingt doch alles schon vielversprechend
Grundsätzlich sind sowohl 1) als auch 2) denkbar.
Als Beispiel, dass der Server Nachrichten direkt an andere Clients schicket findest Du am Beispiel eines Nebenläufigen (Konkurrierenden) Servers unter http://www.dpunkt.de/java/Programmieren_mit_Java/Netzwerkprogrammierung ...
Gerade der untere Abschnitt könnte für Dich interessant sein.
LG Florian
das klingt doch alles schon vielversprechend
Grundsätzlich sind sowohl 1) als auch 2) denkbar.
Als Beispiel, dass der Server Nachrichten direkt an andere Clients schicket findest Du am Beispiel eines Nebenläufigen (Konkurrierenden) Servers unter http://www.dpunkt.de/java/Programmieren_mit_Java/Netzwerkprogrammierung ...
Gerade der untere Abschnitt könnte für Dich interessant sein.
LG Florian