# Socket Verbindung über IP?



## Extremefall (2. Juli 2011)

Hallo, ich versuche momentan, eine Verbindung zwischen zwei PCs einzurichten. Das ganze soll über Sockets funktionieren.
Leider wird der Text, der vom Client gesendet wird, nicht beim Server ausgegeben. Über den localhost klappt es. Die IP vom Router stimmt und es ist beim Router NAT (Portforwarding) aktiviert.

Client:

```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    static Socket clientSocket;
 
    public static void connectToSoccet(InetAddress IP, int port) {
        try {
            Socket clientSocket = new Socket(IP, port);
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
                    clientSocket.getOutputStream()));
            printWriter.println("hhi");
            printWriter.flush();
            System.out.println(clientSocket.isConnected());
            clientSocket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
           e.printStackTrace();
        }
    }
}
```
Server:

```
import java.net.*;
import java.io.*;

public class Server {
    public Server(int port) throws Exception {
        ServerSocket socketServer = new ServerSocket(port);
       while (true) {
            Socket client = socketServer.accept();
            InputStream input = client.getInputStream();
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(
                    input));
            String userInput;

            while ((userInput = stdIn.readLine()) != null) {
                System.out.println("echo: " + userInput);
            }
        }
    }
}
```
Aufruf:

```
Java Code:  
Client.connectToSoccet(InetAddress.getByName("xxx.xxx.xxx.xx"),4447);
// oder für den Server
Server server = new Server(4447);
```

Wo lieft wohl der Fehler? Könnt ihr mir weiterhelfen?


----------



## SE (2. Juli 2011)

Ähm ... NAT und Portforwarding sind zwei verschiedene Dinge. NAT ist standardmäßig hardcoded aktiviert und lässt sich ohne spezielle Firmware auch nicht abschalten. Also hat es wenig damit zu tun das NAT aktiv ist nur weil du Portforwarding ZUSÄTZLICH aktiviert hast.
Was ich mir vorstellen könnte : ich habe einen D-Link DIR-100 ... dieser muss um die Einstellungen zu übernehmen neu gestartet werden. Versuche es doch auch mal. Vielleicht funktioniert es danach.
Auch ist die Kombinaion PrintWriter/BufferedReader schlecht gewählt. Nutze doch mal einen einfachen PrintStream.

Außerdem kannst du dir deine sehr langen imports sparen wenn du stattdessen die Pakete importierst. Also im Client genau so kurz wie im Server.

PS : Es ist schwierig Fehlerquellen auszumachen ohne die nötigen Informationen wie z.B. Router-Hersteller / -Modell / -Firmware.


----------



## Extremefall (2. Juli 2011)

Ich habe den folgenden Router von T-Com:
Sinus 154 DSL Basic 3
Zur Firware weiß ich leider nichts.

Seriennummer: J553461304 

Ein Neustart des Routers hat leider nichts bewirkt.


----------



## SE (2. Juli 2011)

Also was ich so über Google über das Teil rausbekommen habe :

1) garantiert wieder nur so n Werbegeschenk von der Schrott-Com ...
2) für den User nicht-zugängliche Einstellungen die ein nutzen des Port Forwardings verhindern
3) selbst ausgebildete Techniker der Schrott-Com selbst haben nur Probleme damit .. obwohl sie die Fireware genauesten kennen

Mein Rat daher *auch für zukuünftige entscheidungen* : NIE einen Router vom Provider geben lassen ... egal wie toll das Ding auch sein mag ... immer die Option NUR MODEM wählen ... dann einen EIGENEN Router kaufen *im Fachgeschäft und nicht bei Saturn , MediaMartk und CO* und sich vom Fachmann beraten lassen ob der Router das kann was man braucht. Dadurch spart man auch Geld weil man keine teuren Geräte mit Zusatz-Features kaufen muss die man dann nicht nutzt.
Wenn du dann mit deinem Router wieder zu Hause bist : Router vom Modem trennen *wenn es 2 Geräte sind ... wie man es macht wenns nur 1 ist sag ich weiter unten* -> eigenen Router dranhängen -> mit neuem Router verbinden und erstmal sichern *WLAN-PW ändern , Login-Daten des Routers ändern* -> PPPoE einrichten ... FERTIG.

Wenn es nur ein Gerät ist : vermeintliches "Router-Modem" in Optionen als reines Modem konfigurieren und dann seinen Router einfach dran.

Wenn das alles nichts hilft / dir zu kompliziert ist : Schrott-Com anrufen -> Speedport-Modem verlangen !


----------



## Franz Degenhardt (4. Juli 2011)

Auch wenn diese gesponsorten router nicht perfekt sind, reichen sie in 99% der Fälle. Standardkram wie portforwarding unterstützen die eigentlich alle, deiner auch. Die Firmware upzudaten ist sinnvoll, zumal dein Modell tatsächlich bei vielen irgendwelche Probleme hat.

Ich würde folgendes machen:

1. im router UPNP aktivieren
2. im router forwarding einrichten
3. per telnet oder ähnliches testen


----------



## Extremefall (16. Juli 2011)

Der Router unterstützt alles und ist kein billiges Werbegeschenk. Anpingen klappt. Sollte ich die Router Firewall deaktivieren?


----------



## SE (16. Juli 2011)

AUF KEINE FALL !
Die Hardwarefirewall des Routers abzuschalten stellt ein extrem großes Sicherheitsrisiko dar !
Du könntest zum Testen dein Rechner mal als DMZ eintragen.

Was mich nur wundert : der Router bietet ein Menü zum einstellen des Port Forwardings bereit , aber die dortigen Einträge haben keinen Effekt selbst nach reboot des Routers.

*very strange*


----------



## zerix (16. Juli 2011)

Hallo,

hier wird ja diskutiert was bei deinem Router eingestellt werden soll und was nicht. Was ich mich aber gerade Frage ist, wie sieht dein Netzwerk überhaupt aus?
Du sagst, dass dein bei deinem Router Protforwarding eingeschaltet ist und auch die IP des Routers stimmt. Da du einen Telekom-Router hast, schätze ich mal, dass du bei dir Zuhause gerade testest. 
Hast du zwei Netze eingerichtet, dass du bei deinem Router unbedingt Portforwading brauchst?

Du sagst auch, dass der Text nicht gesendet wird, wird denn überhaupt die Verbindung hergestellt? 

Gruß

Sascha


----------



## Extremefall (17. Juli 2011)

Habe es nun noch einmal nach der Einstellung von DMZ probiert. Jetzt erhalte ich einen Fehler:

```
java.net.ConnectException: Connection timed out: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at Client.connectToSoccet(Client.java:15)
	at Execution_Client.<init>(Execution_Client.java:6)
	at Execution_Client.main(Execution_Client.java:10)
```
.

Wie muss ich denn die Verbindung aufbauen? Über die InetAddress oder wie? Ist mein Code dafür richtig?


----------



## zerix (17. Juli 2011)

Beantworte doch mal bitte meine Fragen oben. 

Gruß

Sascha


----------



## Navy (17. Juli 2011)

SPiKEe hat gesagt.:


> AUF KEINE FALL !
> Die Hardwarefirewall des Routers abzuschalten stellt ein extrem großes Sicherheitsrisiko dar !
> Du könntest zum Testen dein Rechner mal als DMZ eintragen.



Grundsätzlich ist das Ausschalten einer "Hardware"-Firewall (und selbst das ist streng genommen schon falsch) nicht gefährlich. Denn 1. sollte sich das Betriebssystem der dahinterliegenden Rechner selber um die eigene Sicherheit kümmern, 2. müssen angreifbare Services laufen und 3. ist Portfowarding ein Teil von NAPT/PAT welches wiederum ein Teil von NAT ist und setzt damit auf den vorhandenen Stack auf.

Zurück zum Thema: Hast Du das ganze mal lokal auf einem Rechner versucht auszuführen, um zu testen, ob Client und Server prinzipiell funktionieren?


----------



## Extremefall (17. Juli 2011)

@navy: Ja, habe ich. Ich habe es über den localhost getestet, den ich als String übergeben habe (siehe auch Ausgangspost).

@zerix: 
Ich habe meines Wissens nach keine zwei Netze erstellt.
Zur Verbindung: da wohl nun ein Timeout entsteht, gibt es keine Verbindung. Woran liegt der Timeout wohl?


----------



## zerix (17. Juli 2011)

Also versuchst du Zuhause von einem Rechner eine Verbindung zum anderen Rechner aufzubauen? (Beide bei dir Zuhause)
Dann brauchst du gar nichts an deinem Router zu machen. 
Wie lauten denn die IPs von den Rechnern und welche IP gibst du für den Verbindungsaufbau an?

Gruß

Sascha


----------



## Extremefall (17. Juli 2011)

Auf Dem Client habe ich die IP: 290.190.53.189 (IP durch das Programm Free Hide iP geändert.
Auf dem Server habe ich so eine IP: 79.xxx.xxx.xxx (ich würde diese nicht so gerne veröffentlichen. Für den Verbindungsaufbau gebe ich die zweitgenannte IP an.


----------



## zerix (19. Juli 2011)

Also stehen die Rechner nicht bei dir zu Hause?

Gruß

Sascha


----------



## Navy (19. Juli 2011)

FreeHideIp ist eine ProxyLösung. Filtern diese gegebenfalls? Versuch es doch ersteinmal ohne Spielereien wie diese.


----------



## Extremefall (19. Juli 2011)

Beide Rechner stehen bei mir Zuhause. Der eine Rechner ist ein normaler Computer (Server), der andere ein Notebook (Client). Ich rufe bei beiden Rechnern das Programm über die JAVA Entwicklungsumgebung Eclipse auf. 

Wie soll es denn ohne einen "IPChanger" gehen? Denn sonst wären ja die IP vom Client und vom Server gleich, da sich beide im Lan befinden. Natürlich ist die "interne IP" im Lan anders, aber so würde ja auch keine Verbindung über das Internet hergestellt werden können.


----------



## zerix (19. Juli 2011)

Zum Testen kannst du ruhig die IPs aus dem LAN nehmen. Das was du da versuchst ist unnötig kompliziert. 
Das Vorgehen übers Internet ist nachher das gleiche, also du musst nichts an Code ändern. 

Gruß

Sascha


----------



## Navy (19. Juli 2011)

Zum einen kannst Du unter Windows bestimmt auch einem NIC mehrere Adressen zuteilen, zum Anderen kann man das Ganze mit 2 Rechnern testen oder ggf. über Virtualisierung. Den Timeout solltest Du aber auf jeden Fall über ein Exception-Handling abfangen, denn das kann Dir immer wieder passieren.

Im Übrigen sagt ein Timeout, dass es eine Route gibt, aber keine Antwort kommt.


----------



## Extremefall (29. Juli 2011)

*Es klappt nun über das LAN UND über das Internet. Vielen Dank für eure super Hilfe. *
Der Fehler lag beim Port-Forwarding. Dort war eine falsche Endung der Fehler. Jetzt klappt alles wie gewünscht.

Eine Frage noch: Wie muss der Code für den Clienten sein, damit er dauerhaft auf Outputstreams des Servers wartet? Momentan versendet der Client ja noch Outputstreams.


----------

