# [Java] Client-Server gebaut, kann nicht verbinden



## DarkMo (20. September 2013)

Huhu, ich hatte ja mal vor längerer Zeit nen Client-Server dingens gebaut, weil ich das als Projekt für ne Prüfung brauch. Daher is die Frage fast chon peinlich xD

Jedenfalls funzt nun alles soweit, wie ich das möchte. Starte ich die Hütte hier aufm Rechner (also Server und Client) kann ich wunderbar verbinden und alles. Jetz wollt ichs aber mal übers Netz probiern. Also bei meiner Freundin uffn Läppi geschmissen, startet auch wunderbar, aber ich kann nich verbinden (also PC->Lappy). Geht halt über nen Router und hab nu schon hier 192.168.0.2-6 ausprobiert, nix. In den Einstellungen is automatische IP-Beziehung eingestellt - sollte ich das mal auf ne feste verdrahten? Oder woran kann das liegen? Bzw wie finde ich die aktuell benutzte interne IP raus?


----------



## kühlprofi (20. September 2013)

start -> cmd -> ipconfig 
über welche Ports soll kommuniziert werden? Evtl. Ports freigeben auf dem Router..


----------



## DarkMo (20. September 2013)

ich hab da irgend ne wilde 4 stellige zahl genommen ^^ 3141 oder so. aber das wäre mal nen versuch wert. jetz müsst ich nur noch rausfinden, wie das geht. also die...0.1 aufrufen, einloggen und wo steht sowas üblicherweise? hab sonen "default"-router von alice ^^

gott, wie ich netzwerk gelumbe hasse. das is für mich son plug&play feature wo man sich ned mit beschäftigen muss. das man als informatiker auch sowas lernen muss *tz* xD


edit: also im router bin ich schonmal drin und das nächste was passen würde wäre port-forwarding oder? aber so wie sich der hinweis ließt, gilt das nur fürs "nach draussen telefonieren". und was mir auch aufgefallen war: die firewall meckert garnich rum.


----------



## Evandar (20. September 2013)

Also wenn ich das richtig verstehe, dann ist es nicht im gleichen "Sub"-Netz oder?

Gesetzt den Fall, dass ich richtig liege, kannst du nicht den Server direkt anwählen, sondern musst die externe IP des Routers haben. Bekommst du in der Regel einfach wenn du von den Rechner wo der Server läuft What Is My IP ® | Shows Your IP Address. aufrufst. Das ist dann die IP die der Client verwenden muss! Jetzt wird es etwas komplizierter, den dein Router weiß ja jetzt gar nicht was es damit machen soll. Du musst nun also den Port auf den "Server" weiterleiten. Als letztes darfst du dann noch schauen ob eine Firewall auf den Server aktiv ist und wenn ja, bei dieser eine Regel definieren, die eingehenden Trafic für den Port/Programm zulässt. 

Das war jetzt einfach mal die kurze Zusammenfassung 

Edit:
Sollten sich Client und Server im gleichen Netz befinden wird es einfacher, da der Router dann egal ist. Hier brauchst du dann nur die interne IP und die Firewall überprüfen.


----------



## DarkMo (20. September 2013)

ja also beide rechner (mein pc und ihr lappy) hängen am selben router und sind nur wenige m räumlich getrennt ^^ sie hatte die 192.168.1.5, ich die ...1.3 und der router die ...1.1. den port hatte ich auf 3141 gestellt (völlig willkürlich, ohne irgendeine feste idee dahinter ^^). start ich bei mir den server und zig clients und lass die clients über localhost verbinden, klappt alles wunderbar. bei ihr aufm rechner auch. aber will ich von mir nen client auf den server auf ihrem lappy verbinden, rödelt er ne weile und gibt schlussendlich auf. keine firewall meckert und nix passiert ><

gut, notfalls könnte man es mal übers netz probieren, auch wenns an und für sich wohl unnötig is. aber vllt bekommt man so mal die fw zum schimpfen ^^


----------



## bingo88 (20. September 2013)

Die normalen Home-Router haben keine Firewall fürs interne Netz, daher musst du für netzinterne Kommunikation nichts freigeben. Ob die IPs dynamisch oder fest sind, spielt auch keine Rolle, solange man die richtige Adressen angibt (was bei dynamischen IPs ohne funktionierendes DNS halt schon mal schwierig werden kann). Die Windows Firewall meldet sich übrigens wenn eine Java Anwendung was mit dem Netz machen möchte (es kann aber sein, dass dabei java.exe angeben wird und nicht der Name des Programms).

Könntest du vielleicht mal den Codeausschnitt posten, der bei dir die Verbindung herstellt?


----------



## DarkMo (20. September 2013)

```
public void connect(String host, int port) {
        this.connected = true;
        try {
            server = new Socket(host, port);
            out = new DataOutputStream(server.getOutputStream());
        }
        catch (UnknownHostException e) {
            this.connected = false;
            e.printStackTrace();
        }
        catch (IOException e) {
            this.connected = false;
            this.output("Status", 2, "Der Server ist offline. " + e.getMessage());
            this.updateHeader();
        }
        
        if(this.connected) {
            JavaClient2013.clientThr = new JavaClient2013Thread(this, server);            // thread zum abhören erzeugen
            this.output("Status", 2, "Verbunden mit Server " + host + ":" + port + ".");
            this.updateHeader();
        }
    }
```
damit mach ich den verbindungsaufbau und das "new JavaClient2013Thread(this, server);" sieht dann so aus:

```
public class JavaClient2013Thread extends Thread
{
    private Socket socket = null;
    private JavaClient2013 client = null;
    private DataInputStream streamIn = null;

    public JavaClient2013Thread(JavaClient2013 client, Socket socket)
    {
        this.client = client;
        this.socket = socket;
        this.open();                                                            // beschafft inputstrem
        this.start();                                                            // startet den thread
    }

    public void open() {
        try {
            this.streamIn  = new DataInputStream(this.socket.getInputStream());
        } catch(IOException e) {
            System.err.println(e);
        }
    }
    ...
```


----------



## bingo88 (20. September 2013)

Hmm, das sieht jetzt eigentlich in Ordnung aus. Was passiert denn genau, wenn du versuchst die Verbindung herzustellen? Gibt es sofort eine Fehlermeldung oder dauert das etwas (wie ein Timeout)?


----------



## DarkMo (20. September 2013)

timeout mäßig. dauert so rund 10 secs oder so. hab grad ne idee. meine freundin hatte keine jvm druff, ich schon. bei mir wird also recht warscheinlich die java.exe schon in der fw stehen, bei ihr wohl eher nich. könnte es damit zusammen hängen? weil der server horcht ja nur und sendet nicht aktiv (bis ne verbindung da is).

hmm, jetz hab ich ma bei mir den server gestartet und den lappy druff verbinden lassen - ging ohne probs. hääääää?! also btw: ihre fw hat auch ned angeschlagen >< habsch jetz nen hacker tool gebaut oder was? xD


----------



## bingo88 (20. September 2013)

Wenn auf dem einen Rechner kein Java installiert ist, wie soll denn dann das Java-Programm funktionieren? Oder meinst du das JDK? Es kann auch sein, dass die FW-Einstellung für Java global gilt (eben weil java.exe die Regel festlegt) und die Regel in der FW schon da war. Dann fragt der nicht noch einmal nach (meine ich zumindest, ist schon was länger her, dass ich damit mal was getestet hatte)


----------



## DarkMo (21. September 2013)

ja, das war etwas wirr geschrieben ^^

auf meinem rechner hab ich das jvm gedöhns ja scho ewig druff, da ich viel damit mach. bei meiner freundin is das halt ned druff gewesen und ich habs erst neu draufgepackt gehabt. aber kann gut sein, dass das dingen sich automatisch in der fw freigibt, kA. jedenfalls kam keinerlei meldung und von ihr zu mir gings. andersrum wollts vorhin ned. naja, wurst. hab jetz noch die feinheiten abgeschlossen und werds dann morgen zum prof schicken. bzw heute ><

jedenfalls mal thx soweit an alle


----------



## Evandar (23. September 2013)

Verstehe ich das richtig das du das ganze in einer VM laufen hast?


----------



## DarkMo (23. September 2013)

na man muss den krempel doch über java ausführen. is doch diese plattformunabhängigkeit (nix ausführbares programm, sondern bytecode generierung was dann mittels plattform spezifischem dingenskirchen (dieses jvm) da ausgeführt wird). also ich hab jetz ned solche spirenzien mit nem OS im OS oder wie man sich das vorstellen soll. hab sowas noch nie gemacht >< kenn das an und für sich auch nur von den "radikalen origin verweigerern"


----------



## Evandar (23. September 2013)

Ok, dann hab ich das jetzt beim überfliegen falsch verstanden. Dachte du meintest jetzt explizit eine VM auf den Rechner und nicht die Java VM


----------

