letavino
Goto Top

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.

Content-Key: 160142

Url: https://administrator.de/contentid/160142

Printed on: April 26, 2024 at 02:04 o'clock

Member: maretz
maretz Feb 04, 2011 at 12:16:40 (UTC)
Goto Top
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
Member: Letavino
Letavino Feb 04, 2011 at 12:38:45 (UTC)
Goto Top
Hallo und vielen Dank für deine Antwort Mike!
Sie hat mir schon einige meiner Fragen beantwortet.
Doch nun stellen sich mir neue fragen, zum einen zum Verständnis des ganzen Themas, als auch zur Realisierbarkeit meines Projekts.

Zitat von @maretz:
Dabei brauchst du dann genau EINEN bekannten Punkt

Wie würde solch ein Punkt aussehen? Wie kann ich mir das vorstellen?
Wäre zb eine schon bestehende Verbindung zwischen zwei Computern?

Hier würde ich dir empfehlen dir einen zentralen Server zu bauen

Das heißt, man müsste selber für die nötige Hardware und Anbindung (feste IP) sorgen?
Oder gibt es vielleicht Möglichkeiten, dies irgendwo gestellt zu bekommen, zb. über normalen Webspace, wie ihn zum Beispiel "bplaced" anbietet?
Da ich mich ja erst einmal in das Thema einarbeiten muss und verschiedene Sachen testen will, würde ich es bevorzugen, noch nicht in Hardware investieren zu müssen.

Ps: Zum testen dachte ich erst einmal an ein Programm, das von einem Benutzer zu einem anderen Daten verschicken kann.
Eine Erweiterung wäre das ganze, mit einer Hand voll Benutzer. Aber an eine sehr große Gruppe wird das ganze wohl erst einmal nicht gehen.

Mfg, Florian N.
Member: maretz
maretz Feb 04, 2011 at 12:54:26 (UTC)
Goto Top
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...
Member: Letavino
Letavino Feb 04, 2011 at 13:43:38 (UTC)
Goto Top
Hallo,

verstehe ich das so richtig? Könnte man das so realisieren? :

Der Client startet sich beim Computerstart selber, ließt seine Internet IP aus und packt diese mit einer Benutzerkennung in eine XML Datei.
Diese wird in Bytes umgewandelt und per TCP an den Server übertragen (dessen IP bekannt sein muss, bzw anhand des Namens aufgeschlüsselt wird).
Der Server lauscht ständig an vorher definierten Empfangsport und wenn ein Packet ihn erreicht, ließt er Benutzerkennung und IP aus und schreibt sie in eine Datenbank.
Will er den Clienten nun erreichen, kann er einfach die IP auslesen und ihm somit Daten schicken.

Stimmt das soweit?
Wie kann man erreichen, dass beim Herunterfahren des Pc's die Daten vom Server entfernt werden?
(Oder muss man zb. jede Minute neu abfragen, ob der Client da ist?)

Mfg, Florian N.
Member: maretz
maretz Feb 04, 2011 at 13:49:32 (UTC)
Goto Top
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
Member: Letavino
Letavino Feb 04, 2011 at 14:31:05 (UTC)
Goto Top
Ok, ich denke damit kann ich erstmal arbeiten und einiges ausprobieren.
Das grundsätzliche Prozedere habe ich nun endlich verstanden.

Vielen Dank nochmal für deine gute und ausfürhliche Hilfe! face-smile

mfg, Florian N.


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?

java.net.InetAddress.getLocalHost().getHostAddress()

liefert ja nur die Ip Adresse im lokalen Netzwerk.
Member: Florian.Sauber
Florian.Sauber Feb 04, 2011 at 22:19:22 (UTC)
Goto Top
Nabend Namensvetter,

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?
java.net.InetAddress.getLocalHost().getHostAddress()
liefert ja nur die Ip Adresse im lokalen Netzwerk.
Auf direktem Wege (IMHO) gar nicht. Du fragst den "zwischengeschalteten" zentralen Server im Netz ab, indem dieser eine entsprechende Methode dafür bereitstellt.

Aber fang doch etwas kleiner an. Klappt denn die verbindungsorientierte Kommunikation, bspw. mittels der Klassen Socket und ServerSocket bereits lokal?

LG Florian
Member: Letavino
Letavino Feb 09, 2011 at 08:04:32 (UTC)
Goto Top
Hallo,

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.
Aber wahrscheinlich werde ich erstmal klein anfangen, wenn es ums Programmieren geht und mich dann steigern ;)

Lg
Member: Florian.Sauber
Florian.Sauber Feb 10, 2011 at 12:47:27 (UTC)
Goto Top
Hallo nochmal,

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.

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 face-smile

Grüsse Florian
Member: Letavino
Letavino Feb 17, 2011 at 15:44:52 (UTC)
Goto Top
Hallo,

Auch, wenn es nun schon ein paar Tage her ist, melde ich mich doch noch einmal, bevor ich das gesammte Problem als gelöst markiere.

Ich habe mich nun schon ein ganzes Stück weiter in die Materie eingearbeitet und bin weiter vorangekommen.
Mein jetziger Stand:

Lokal laufen Client und Server.
Der Client schickt dem Server alle 5min seine Kennung.
Der Server speichert diese mit der Client IP in einer Datenbank.
Stand der Client schon vorher drin, wird er erst rausgelöscht.

Alles läuft bisher, wie es soll.
Doch nun noch eine Frage:

Wie kann Client 1 einem Client 2 Daten schicken?

Ich habe folgende Ideen:
1) Client 1 schickt dem Server die Daten. Dieser legt sie mit einem Vermerkt für den Empfänger ab. Client 2 fragt regelmäßig, ob Daten da sind und ließt sie ggf aus.

2) Client 1 verbindet sich mit dem Server und erfragt die IP von Client 2. Hat er diese, schickt er die Daten direkt an Client 2.

Wird das so gehandhabt? Oder kann der Server vielleicht selber in Aktion treten?

Ich hoffe, ihr könnt mir nochmal bei meinem Problem helfen. ;)

mfg, Florian
Member: Florian.Sauber
Florian.Sauber Feb 18, 2011 at 00:11:43 (UTC)
Goto Top
Hallo nochmal,

das klingt doch alles schon vielversprechendface-smile

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
Member: Letavino
Letavino Feb 18, 2011 at 15:50:43 (UTC)
Goto Top
Vielen Dank noch einmal.
Ich denke, der Rest wird sich nach ein paar Versuchen von alleine geben.

Vielen Dank an alle, die mir so gut geholfen haben!

Lg, Florian