# Kommunikation 2er Programme über Internet...



## Jellysheep (21. März 2009)

Ich möchte eine Fernwartung programmieren (wie ist ja eigentlich egal...) und dabei sollen sich zwei Java-Programme über das Internet Daten schicken... Ich habe schon was von Socket, sSrvlet und so gelesen, aber das geht alles über spezielle Server (oder? Weiß ich auch nicht genau...). Geht das auch "direkt" über Internet?
Ich wäre über eine Antwort echt dankbar! 
VG
Jellysheep


----------



## Kai008 (21. März 2009)

Natürlich.
Der Server (das Programm was gewartet werden soll) wartet auf nen Port, das Wartungsprogramm baut ne Verbindung auf.

Ich habe mal vor langem zur Hilfe etwas für den Classpath damit gebaut.
Sind 2 Klassen die das erledigen (sollten). Hab sie noch nie wirklich außer mal zum testen verwendet, daher sind sicher ein paar dutzend Bugs drinnen.

Im Package lm2d.net
Zum Erklären bin ich jetzt zu müde, aber da der Source beiliegt solltest du kein Problem haben.


----------



## Jellysheep (21. März 2009)

Danke für deine schnelle Antwort so spät am Abend! 
Ich versteh aber die zwei Klassen nicht ganz... 
Hat vielleicht jemand Lust, ein Beispiel zu posten, in dem die Klasse Connection1 (oder so) der Klasse Connection2 einen String über Internet schickt, der dann ausgegeben wird? Wär cool, das wäre die Lösung meines Problems! 
VG
Jellysheep


----------



## hammet (21. März 2009)

http://www.ashishmyles.com/tutorials/tcpchat/index.html


----------



## Jellysheep (21. März 2009)

Hey cool! Danke! Funktioniert!    
Hab rausgefunden, dass man bei dem Socket(...,...) die IP-Nummer des anderen Rechners eingeben muss....
Jedenfalls vielen Dank! 
VG
Jellysheep


----------



## Kai008 (21. März 2009)

Ich finde es besser wenn Klassen übern Hauptspeicher kommunizieren, deshalb habe ich gleich 2 Projekte gemacht. Gebs per JOptionPane aus, da wenn du mehrere Apps laufen hast zumindest unter Eclipse die Konsole meistens nur die Daten einer ausgeben.

€: Mist, so lange habe ich gebraucht?


----------



## Jellysheep (21. März 2009)

Welche Klassen muss ich denn da ausführen? 
Ich blick da nicht durch...


----------



## Kai008 (21. März 2009)

Die mit der main(String[]).
MaintenanceApp hast nicht viel Auswahl, MaintenancedApp die "Start.class".
Im scr-Ordner ist der Source.


----------



## Jellysheep (21. März 2009)

Ah, ok, das Ausgabefenster war hinter Eclipse versteckt... 
Funktioniertg das auch zwischen zwei Computern? Ich hab nirgends "localhost" oder eine IP-Adresse gesehen...


----------



## Kai008 (21. März 2009)

In dem Project was die Verbindung aufbaut (also nur das mit der einen Klasse, welche du als 2. starten musst), in ner final Variable oben. (127.0.0.1, in 99% der Fälle der localhost)


----------



## Jellysheep (21. März 2009)

Oh, habe ich übersehen, sorry... 
Was ist an den Klassen jetzt eigentlich besser? Ich kenn mich nicht so auf dem Gebiet aus und kanns nicht feststellen...


----------



## Kai008 (21. März 2009)

Gegenüber meinen? Das es jetzt vollfunktionierende Programme sind (Um den Fehlerabfang musst du dich noch kümmern, z. B. MaintenanceApp.Main.connect(String, int) = Verbindung fehlgeschlagen, z. B. weil der Server nicht rennt, MaintenancedApp.WaitForClient.createServerSocket() = Hatte ich bisher nur wenn der Port schon belegt war usw, ich HASSE Checked Exceptions im Haupsource. Das einzige was mich an Java stört. Daher die Methoden.)
Außerdem habe ich es nebenbei kommentiert, was ich sonst nie mache.

Gegenüber hammet's Link? Keine Ahnung, den Post habe ich erst gesehen nachdem ich mit dem schreiben der beiden Apps fertig war. Hatte wärend dessen das Browserfenster offen. Deshalb hat mich auch die Zeit ein wenig gewundert.


----------



## Jellysheep (21. März 2009)

Ah, ok! Danke für euer Hilfe, ich probier jetzt mal eine bisschen herum! 
VG
Jellysheep


----------



## finger361 (21. März 2009)

danke mir hat es auch sehr weiter geholfen


----------



## Jellysheep (22. März 2009)

Echt coole Bilder, finger361! 
Was sollen die darstellen? Ich seh nur einen weißen Pixel... 

Noch ne Frage: Wenn ich zwei Java-Programme mach und die sich gegenseitig schicken *und *empfangen können sollen, brauchen dann beide erstmal die IP-Adresse vom anderen? Oder kann man eine Verbindung mit einer IP aufbauen und die andere mit dieser Verbindung übertragen?


----------



## Kai008 (22. März 2009)

Hast du dir den Source nicht angeschaut? Ein Server baut NIEMALS eine Verbindung auf, er WARTET auf Clienten. Die accept-Methode gibt bei aufgebauter Verbindung ein Socket zurück, was für die Datenübertragung verwendet wird.


----------



## Jellysheep (23. März 2009)

Dass der Server wartet, weiß ich, und die accept-Methode kenn ich auch.
Jedenfalls, wenn ein Server WARTET und ein Client mit der IP des Servers daraufzugreift, kann dann der Client dem Server irgendwie seine IP mitteilen, bzw. kann der Server herausfinden, mit welcher IP auf ihn zugegriffen wurde?


----------



## Kai008 (23. März 2009)

Das muss er ja, immerhin schickt er ja auch Daten zurück. Aber du benötigst ja die IP auch nicht um Daten zu übertragen sondern nur um Verbindungen aufzubauen. Aber wenn dus trotzdem willst: Socket.getInetAddress().


----------



## Jellysheep (23. März 2009)

Cool, danke! Dann braucht man zum Senden und empfangen zwischen zwei Computern nur die IP-Adresse von einem Computer... Schön! 
Also, bis dann mal
Jellysheep


----------



## Jellysheep (24. März 2009)

Also, ich hab jetzt nen Server und nen Client. Der Server wartet, der Client greift drauf zu, der Server schickt dem Client was und der Client schickt was zurück. So weit, so gut... 
Jetzt habe ich aber ein Problem: Das Ganze funktioniert nur "innerhalb" eines Routers. Sobald ich einen außenstehenden Computer als Client auf den Server zugreifen lasse, kommt eine "Time Out Exception" beim Client... Geht eine Verbindung auch irgendwie zwischen zwei entfernten Computern?


----------



## hammet (24. März 2009)

Sicher geht die Verbindung, aber dabei ist zu beachten, dass du aus dem internet nicht mit der lokalen IP-Adresse des Servers auf diesen zugreifen kannst. Du musts die IP-Adresse des Routers ansteuern (also die WAN-Adresse) und der Router muss dann ein Portforwarding in dein lokales Netz vornehmen.


----------



## Jellysheep (24. März 2009)

Ah, ok. Danke! 
Macht ein Router dieses Portforwarding von alleine? Bzw. muss man bestimmte Daten vorausschicken um es anzusteuern? 

Ich hab mal ein Java-Programm geschrieben zum Rausfinden aller IPs (statisch, dynamisch und die vom Router). Wers mal haben will, einfach schreiben.


----------



## takidoso (24. März 2009)

Ja mit dem Verbinden von Rechnern die von einander durch Router und Firewalls getrennt laufen ist das so eine Sache.
JXTA ist eine Technologie bzw. Framework, die/das dies ganz gut meistert. Ich  stehe aber auch erst dort am Anfang meines Verstehens.


Gruß

Takidoso


----------

