# Netzwerk übers Internet



## stiewen (18. Jan 2006)

Aloa Leutz!

Ich möchte gerne mal aus dem lokalen Programmieren in ein mehr oder weniger globales Programmieren einsteigen...

Meine Kenntnisse reichen nun um im lokalen Netzwerk was anzufangen... Als ich das auf das Internet erweitern wollte, meinte er, dass die IP nicht vergeben ist... 
Das ganze habe ich mit einem Socket und ServerSocket gemacht... wie auch sonst... nunja... 

Frage: Kann eine Internetkommunikation auch über ServerSockets und Sockets funzen?

Danke
[/code]


----------



## meez (18. Jan 2006)

Lies zuerst mal etwas über Netzwerktechnologien, und frag danach wieder...


----------



## Stiewen (18. Jan 2006)

Das liebe ich an Leuten, wie dir... "Lies erst mal 1000 Seiten und dann reden wir über die erste Seite!"

Find ich Schwachsinnig! Sach mir einfach, was ich dazu wissen muss und schon sind alle glücklicher...
Zudem kannste mir doch auch einfach sagen, wie es geht oder ob es geht!

THX @all


----------



## Roar (18. Jan 2006)

Anonymous hat gesagt.:
			
		

> Sach mir einfach, was ich dazu wissen muss


du solltest erstmal wissen, dass das internet genauspein netzwerk ist, wie das was du zuhause hast...

... und der thread titel ist wirklich köstlich :lol:


----------



## meez (18. Jan 2006)

Stiewen hat gesagt.:
			
		

> "Lies erst mal 1000 Seiten und dann reden wir über die erste Seite!"



Du liest ja nicht mal die erste Seite...


Sobald du wenigestens die Basistechnologien kennst, können wir wieder reden...
Du würdest im Moment sowieso nichts verstehen, wenn ich dir was Antworten würde...


----------



## stiewen (18. Jan 2006)

So, nu mal zum Klarstellen: Das das Inet genauso is, wie fast jedes andere Netzwerk is logisch. Deswegen dachte ich auch, dass ich mit meinem Prog übers Internet gehen kann!
Wenns so ist, wie ihr meint, warum funzt es dann net? Ich beziehe mich da auf eine einfache Socket-Verbindung.

Und nun bitte mal ein Beispiel-Source oder einfach nur "Ich weiß es nicht!" was mir mehr hilft als "Lies erst mal!"


----------



## Roar (18. Jan 2006)

Anonymous hat gesagt.:
			
		

> Wenns so ist, wie ihr meint, warum funzt es dann net? Ich beziehe mich da auf eine einfache Socket-Verbindung.



woher sollen wir das denn wissen. wir kennen ja weder deinen source, noch die fehlermeldung !?


----------



## Bleiglanz (18. Jan 2006)

du hast ein lokales Netzwerk

und 

es gibt das grosse böse Internet

die sind technisch genau gleich, aber dann gibts die Frage: Wie bist du drin (Modem? mit DSL direkt? Gateway? Router? usw.)

du kannst immer:

Sockets aufbauen zu Hosts im grossen bösen Internet wenn du die IP oder den DNS Namen hast (und auf dem Host ein Dienst an dem Port lauscht) und dir der Zugriff erlaubt ist

du kannst aber (ausser bei Direktanschluss mit Modem etc) nie:

einen ServerSocket lokal erzeugen und erwarten, dass sich ein Host aus dem Internet mit dir verbinden kann

welche Fehlermeldung haste denn? was willst du machen?


----------



## meez (18. Jan 2006)

http://en.wikipedia.org/wiki/OSI_model
Das ist eine Seite Lesestoff...danach solltest du deine Frage selbst beantworten können...


btw. Sockets sind L4


----------



## Stiewen (18. Jan 2006)

Ich habs mir angelesen ...
Prob is nur immer dabei, dass ich ka hab, was mir das bringen soll, wenn ich dann in Java meinen Source schreibe, denn dort gibts es eh wieder andere Namen und blablabla Keks...

So, hab nen bissel Source:

```
client.connect(new InetSocketAddress("Empfängername", 80), 2500);
```

Dort gibts es ein Problem ...

Er verbindet nicht und geht ins TimeOut... Demzufolge gibts keine Fehlermeldung, so viel ich weiß


----------



## Roar (18. Jan 2006)

mein lieblings dnsserver kennt keinen host "Empfängername", ergo kannst du zu "Empfängername" auch nicht verbinden.

in deinem ersten post sagtest du dass ein mysteriöser "er" dir eine meldung ausspuckt?


----------



## AlArenal (18. Jan 2006)

Stiewen hat gesagt.:
			
		

> Ich habs mir angelesen ...
> Prob is nur immer dabei, dass ich ka hab, was mir das bringen soll, wenn ich dann in Java meinen Source schreibe, denn dort gibts es eh wieder andere Namen und blablabla Keks...



Lieber blöde bleiben, weil einen das Wissen angeblich eh nicht weiterbringt.. macht man das heute so?  



> So, hab nen bissel Source:
> 
> ```
> client.connect(new InetSocketAddress("Empfängername", 80), 2500);
> ...



Wo im Internet ist denn "Empfängername"??? 
Vielleicht solltest du Seite 2 auch noch lesen...



> Er verbindet nicht und geht ins TimeOut... Demzufolge gibts keine Fehlermeldung, so viel ich weiß



Ist ein Timeout keine Fehlermeldung?


----------



## stiewen (18. Jan 2006)

Dann also noch mal anders:


```
client.connect(new InetSocketAddress(194.123.1.13, 80), 2500);
```

IP is dort ausgedacht ...


----------



## Roar (18. Jan 2006)

wie wärs wenn du dir auch mal existierende addressen aussuchst und dir die nicht aus den fingern saugst. so ists ja kein wunder dass du nicht connecten kannst.
außerdem kannst du da nicht einfach: 194.123.1.13 reinschreiben, das lässt sich eh nich kompilieren.


----------



## stiewen (18. Jan 2006)

Wenn du willst, kannst du deine IP da gerne Eintragen... Viel Spaß mit allen Leuten, die sich um deinen Rechner kümmern ...

Ich würde jetzt einfach nur noch auf den Post von Bleiglanz warten...


----------



## Lim_Dul (18. Jan 2006)

Solange auf der echten IP die du da einträgst, kein Server läuft dre auf dem Port lauscht, kann das nicht gehen.

Und es sollte keine IP aus dem Bereich 192.168.X.Y, 10.X.Y.Z sein.


----------



## stiewen (18. Jan 2006)

Danke,super ...

Also ich habe mein Prog so ausgestattet, dass es immer einen Server bildet, der in einem 2. Thread läuft, sodass man doch eigentlich die andere Person ansprechen können sollte oder? Ich weiß aber nicht warum er keine Verbindug aufbauen kann ... 

Baut ihr eine Internet-Verbindung anders auf, als so, wie ich es vor 2. Posts schrieb?


----------



## Roar (18. Jan 2006)

Anonymous hat gesagt.:
			
		

> Also ich habe mein Prog so ausgestattet, dass es immer einen Server bildet, der in einem 2. Thread läuft, sodass man doch eigentlich die andere Person ansprechen können sollte oder? Ich weiß aber nicht warum er keine Verbindug aufbauen kann ...



:autsch: dann hat das ganze doch nix mehr mit dem internet zu tun, wenn du wieder lokal nen server startest. ich dachte fürs lan hättest du schon einiges programmiert? wo is dann noch dein problem, außer dass du mal endlich nen validen host zum connecten angeben solltest :?:


----------



## stiewen (19. Jan 2006)

Haloa Leutz...

Ich hab meinen Source noch mal gründlich überarbeitet, verglichen, überarbeitet, verglichen, überarbeitet...

Mir ist aufgefallen,dass ich auch SSL nutzen hätte können im Bezug auf das Socket...

Könnte das ein Grund sein, weil es nicht funktioneiert? Wenn nicht, dann nehmt mich bitte nicht auseinander, sondern schickt mir mal ne Verbindung von euch, damit ich vll daran sehen kann, was ich falsch gemacht habe...

THX


----------



## AlArenal (19. Jan 2006)

Was für ne "Verbindung" möchtest du von uns und was soll das nun mit SSL zu tun haben???


----------



## stiewen (19. Jan 2006)

na, könnt ihr mir nicht mal Source geben, wie ihr einen Verbindungsaufbau zu einem Server im Internet machen würde?

Zudem vll noch auf Serverseiten ...?

Und SSL: www.galileocomputing.de/openbook/javainsel4/javainsel_16_008.htm#Rxx365java16008040006341F03C100


----------



## AlArenal (19. Jan 2006)

stiewen hat gesagt.:
			
		

> na, könnt ihr mir nicht mal Source geben, wie ihr einen Verbindungsaufbau zu einem Server im Internet machen würde?



Einem Server WOFÜR?

HTTP, POP3, IMAP, SMTP, FTP, NTP, NNTP, ... ???



> Zudem vll noch auf Serverseiten ...?



Also Webserver? 
Dafür schlag ich mich nicht mit Sockets und so nem Driss rum:
http://jakarta.apache.org/commons/httpclient/tutorial.html



> Und SSL: www.galileocomputing.de/openbook/javainsel4/javainsel_16_008.htm#Rxx365java16008040006341F03C100



Und was SSL? SSL für welches Protokoll?


----------



## .:BwA:. (20. Jan 2006)

Hi!

Also du hast da einige Teile schwer missverstanden.

1. Das INTERNET ist EIN großes NETZWERK.
2. d.h. du brauchst bei deinen Programmen fürs Internet eigentlich gar nichts ändern.

Du wirst nur auf einige Probleme stoßen.
Wenn du eine Verbindung zu einem ganz normalen Benutzer mit einem Standart Internet Anschluss aufbauen willst, wird dieser großteils geblockt, da die meisten internetprovider keine Server Ports zulassen.
Zweites Problem, auch wenn die Verbindung nicht vom Provider geblockt wird wird sie teilweise vom Benutzer wieder geblockt sofern er über einen Router, Firewall, etc verfügt.

Bei einem Server z.B. einem Webserver, GameServer, .. kannst du ohne Probleme auf die Ports zugreifen.

MFG
BWA

PS: Kennen wir uns von Computerhilfen?


----------



## .:BwA:. (20. Jan 2006)

Achja noch zu SSL

SSL .. Secure Socket Layer

SSL ist eine sichere verschlüsselte Verbindung um zum Beispiel bei einer Bank Seite die Benutzerdaten nicht offen zu übertragen. (Stichwort "https" statt "http").

Also am besten schnell wieder vergessen.

MFG
BWA


----------



## stiewen (21. Jan 2006)

ICH WEIß DAS DAS INTERNET EIN NETZWERK IST!
ICH WEIß DAS DAS INTERNET EIN NETZWERK IST!
ICH WEIß DAS DAS INTERNET EIN NETZWERK IST!
ICH WEIß DAS DAS INTERNET EIN NETZWERK IST!


SO, ... und nochmal:
ICH WEIß DAS DAS INTERNET EIN NETZWERK IST!

Die überschrift hab ich vll dumm gewählt, aber ich war in eile und wusste nicht, wie ich mein Prob beschreiben soll.

So, auch in diesem Fall hilft BWA mal wieder am besten mit seinem Post... Danke an der Stelle

Heißt soviel, wie dass ich keine P2P Verbindung aufbauen kann? Ich habs mal mit deinem Prog probiert BWA, aber da gehts auch net, kann das sein?
*Wie kann man dann das Prob lösen?*

_Edit by Illuvatar: Sache etwas verkürzt, ich hoffe, dass 4 Zeilen reichen, damit die Leute das mal kapieren  _


----------



## Grizzly (21. Jan 2006)

Also ich muss zugeben, dass ich - genau wie der Rest hier - das Problem nicht ganz verstehe.

Erst einmal solltest Du schauen, ob Du zu dem anderen Rechner bzw. der IP der Gegenstelle eine Verbindung hast. Dazu kannst Du den ping Befehl in der Eingabeaufforderung benützen. Also bspw. 
	
	
	
	





```
ping 192.168.0.123
```
 wenn die IP 192.168.0.123 die IP Adresse der Gegenstelle ist. Wenn das nicht klappt, wird kein Verbindungsaufbau möglich sein. Das ist aber eine Sache der Konfiguration des Netzwerkes und hat mit Java gar nix zu tun.

Dein zum Prinizip der Socket Verbindung (für SSL Sockets gilt das entsprechend, außer das Du hier auch noch Schlüssel für die Verschlüsselung der Verbindung brauchst):
Eine Seite braucht einen Socket, der lauscht und Verbindungen annehmen kann (in Java: ServerSocket). Und die andere Seite braucht einen Socket, mit dem sie mit lauschenden Sockets Verbindung aufnehmen kann (in Java: Socket).

Fazit:
Du brauchst ein Programm, das auf einem Rechner die Verbindung annimmt, und ein Programm, das eine Verbindung aufbaut.


----------



## stiewen (21. Jan 2006)

ich gebs auf... schließt den thread!


----------



## Grizzly (21. Jan 2006)

Hier mal ein kleines Beispiel:

```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class Client {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Socket server = null;
		OutputStream out = null;
		OutputStreamWriter ou2;
		BufferedWriter ou3;
		BufferedReader in;
		String line;
		
		try {
			server = new Socket("localhost", 4444);
			System.out.println("Connected to " + server.getInetAddress() + ":"
				+ server.getPort());
			
			out = server.getOutputStream();
			ou2 = new OutputStreamWriter(out);
			ou3 = new BufferedWriter(ou2);
			in = new BufferedReader(new InputStreamReader(System.in));
			do {
				line = in.readLine();
				ou3.write(line + '\n');
				ou3.flush();
				System.out.println("Zeile [" + line + "] gesendet.");
			} while ((line != null) && (!line.equals("exit")));
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			try {
				server.close();
			} catch (IOException ioe) {
				System.out.println("Verbindung zum Client nicht geschlossen!");
				ioe.printStackTrace();
			}
		}
	}
}
```


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ServerSocket server = null;
		Socket client = null;
		InputStream in;
		InputStreamReader inr;
		BufferedReader inw;
		String line;
		
		System.out.println("Warte auf Verbindung...");
		try {
			server = new ServerSocket(4444);
			while (true) {
				client = server.accept();
				System.out.println("mit Client über Port "
					+ server.getLocalPort() + " verbunden");
				in = client.getInputStream();
				inr = new InputStreamReader(in);
				inw = new BufferedReader(inr);
				while ((line = inw.readLine()) != null) {
					System.out.println(line);
				}
				System.out.println("Verbindung geschlossen.");
			}
		} catch (IOException ioe) {
			System.err.println("Verbindung unterbrochen" + ioe);
			ioe.printStackTrace();
			System.exit(1);
		} finally {
			try {
				server.close();
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}
	}

}
```
Erst den Server starten, dann den Client. Dann kann man im Client Text eingeben, bei drücken der Return Taste wird dieser verschickt. Bei der Eingabe des Textes _exit_ beendet der Client die Verbindung.

Wenn Du den Server auf einem anderen Rechner als den Client laufen lässt, muss Du halt statt _localhost_ die enrsprechende IP oder den entsprechenden DNS Namen eintragen.


----------



## Grizzly (21. Jan 2006)

stiewen hat gesagt.:
			
		

> ich gebs auf... schließt den thread!


Okay, dann anders: Du willst also eine verschlüsselte Verbindung aufbauen? Dann musst Du halt statt Socket und ServerSocket SSLSocket und SSLServerSocket verwenden. Dann wird es aber etwas kompliziert, da Du Dich auch noch mit den Schlüsseln zum Verschlüsseln rumschlagen musst.

Ein alternative wäre einfach ein VPN aufzubauen. Das funktioniert dann für alle Programme (auch Spiele, Teamspeak, FileSharing, usw.) udn ist völlig unabhängig von Java.


----------



## .:BwA:. (21. Jan 2006)

Hallo!

Die ganzen Filesharer benutzen "Ultra peers" (Oder so ähnlich, wird je Filesharer anders gennant) dieser Ultra peer ist einer von vielen, 
der Client baut eine ausgehende Verbindung zu diesem "Ultra" auf, was ohne weiters möglich ist, da diese Ultra Peers so am Netz gebunden sind wie z.B. ein Webserver. 
Nun Verbinden sich aber gleich mehrere Clients zu diesen Ultra Peer.
Nun wenn ein Client die Daten von einem anderen Client herunterladen will, stellt der Ultra Peer sozusagen die Brücke dar, er "rooted"  Datenpackete von dem einem zum anderen Client.
Denn es ist im Internet als normaler Surfer ohne weiters möglich ausgehende Verbindungen herzustellen(sonst wäre die Internet anbindung ja sinnlos).

Auf diesem bzw. einem ähnlichen Konzept bassiert auch das Internet Telefonie Programm Skype soweit ich weiß.

Noch zu MyCC, es dient eigentlich nur als Lan-Filesharer und ist nur begrenzt im Wan bereich einsetzbar, 
ich habs z.B. geschafft mit MyCC Freunden zugriff auf meine Freigegeben Dateien zu geben.
1. Ich habe bei meinem Router die MyCC Ports 16001 und 16002 gerootet
2. Ich habe beim Programmieren schon darauf geachtet, dass ich auf Ports größer 1024 liege und auch auf keinen spezialports wie 8080, da diese Ports von den meisten Providern für eingehende Verbindungen geblockt werden.

MFG
BWA


----------



## Bleiglanz (21. Jan 2006)

> Das INTERNET ist EIN großes NETZWERK.


na ja, ist wohl Ansichtssache

würde eher sagen, das sind SEHR VIELE verschiedene (Teil-) Netzwerke (es heisst ja auch interconnected networks oder so)



es gibt zwar einen globalen Adressraum, aber nicht alle am Internet beteiligten Netze nutzen diesen

deshalb gibts

Router = wenn ein Teilnetz am globalen IP-Adressraum hängt dann routet ein Router die IP-Pakete einfach unverändert zum nächst "besten" Host

Gateways = wenn ein Teilnetz NICHT am globalen IP-Adressraum hängt, dann kann nur über spezielle Hosts mit diesem kommuniziert werden. Diese Gateways VERÄNDERN die IP-Adressen (NAT, Masquerading) und sorgen für die richtige Zustellung von Paketen

Ohne weitere Eingriffe - das sog. Port-Forwarding - kann man sich nicht mit einem Rechner verbinden, der hinter einem Gateway 
steht


----------

