# Java: Anbindung an einen realen Server? (+ Portfreigabe)



## setNewUser() (6. Feb 2021)

Hallo allerseits,

ich versuche gerade - und bewege mich dabei ein ganzes Stück über meinem (Anfänger-) Niveau - in Java ein kleines Programm zu schreiben, wo Server und Client (bisher jeweils eine Klasse) miteinander kommunizieren. Ich folge hierbei diversen Youtube-Tutorials. Toll wäre, wenn ich ein ganz kleines Chat-Programm hinbekommen könnte.
Aber ich komme momentan noch nicht einmal dahinter, wie die Server-Klasse mit einem echten Server in Kontakt treten könnte.
So sieht momentan die Server/Main-Klasse aus:


```
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerMain {

    public static void main (String[] args ){
        int port = 8818;
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            while (true) {
                Socket clientSocket = serverSocket.accept();
                OutputStream outputStream = clientSocket.getOutputStream();
                outputStream.write("Hello Wolrd\n".getBytes());
                clientSocket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

Ich habe bisher (sogar das ist für mich Neuland ^^) herausgefunden, dass ich den Port bei meinem Router freigeben muss.
Aber mir ist noch überhaupt nicht klar, wie nun meine Server-Klasse mit einem real existierenden Server (IP-Adresse) in Kontakt treten könnte.

Über eine kleine Hilfestellung würde ich mich sehr freuen. 


Beste Grüße

Christian


----------



## setNewUser() (6. Feb 2021)

Oh je, und es scheitert schon am Simpelsten (sollte ich doch ganz die Finger davon lassen ...), nämlich der Portfreigabe:

Ich brauche die dynamischen Ports, oder?

Sind auslösende Ports oder diese Umleitungen für mich relevant??

Und noch zwei Fragen:

Die Client Klasse (die dann am Ende wohl auf einem anderen Gerät läuft, denke ich ...) muss nicht denselben Port haben, oder?

Und was mich vor allem irritiert: Offenbar arbeiten sowohl Server als auch Client mit einem Port. Aber in der Realität wird man von einem Client ja wohl nicht ernsthaft eine Portfreigabe verlangen; wie wird das dann in echt gemacht?

Ich weiß, dass diese Fragen sehr dilettantisch sind. Ich würde mich aber sehr freuen, wenn sich trotzdem jemand meiner erbarmte! Tausend Dank!


LG Chris


----------



## LimDul (6. Feb 2021)

Du brauchst keine Portfreigaben. Portfreigaben brauchst du nur, wenn der Rechner, der die Verbindung *aufbaut* die Verbindung zu einem Rechner hinter dem Router aufbauen will.

Sprich, bei der Richtung Client => Server ist eine Portfreigabe nur auf Seite des Server notwendig, wenn der Server hinter einem Router steht. Deswegen betreibt man in der Regel Server mit einer öffentlichen IP und nicht hinter einem Router versteckt.


----------



## setNewUser() (6. Feb 2021)

Hi, LimDul!

Ah vielen Dank, das leuchtet ein! 

Brauche ich auch keine Portfreigabe, um mit der Server-Klasse auf meinem Rechner an den echten Server zu kommen? Denn immerhin will der Konstruktor des ServerSockets einen Port als Parameter entgegen nehmen.

Was mir aber tatsächlich weiterhin nicht klar ist: Wie kann meine Server-Klasse mit dem realen Server (den ich erst noch miete muss^^) korrespondieren? Hm...

Beste Grüße und einen schönen Tag!


----------



## LimDul (6. Feb 2021)

Was ist eine "Server Klasse".?

Du lässt das Programm *auf* dem Server laufen und erstellst dann einen ServerSocket (wo du den Port angibt). Dadurch wird der Port erst aufgemacht und der Client kann sich dahin verbinden.

Ein Serversocket baut keine Verbindung auf, sondern lauscht auf eingehende Verbindungen.


----------



## Dukel (6. Feb 2021)

setNewUser() hat gesagt.:


> Was mir aber tatsächlich weiterhin nicht klar ist: Wie kann meine Server-Klasse mit dem realen Server (den ich erst noch miete muss^^) korrespondieren? Hm...


Zum entwickeln und testen kannst du alles Lokal machen. Du kannst Lokal einen Server laufen lassen und einen Client laufen lassen und beide miteinander sprechen lassen.


----------



## setNewUser() (6. Feb 2021)

Server-Klasse = die Klasse, die den ServerSocket bereitstellt (und die ich oben gepostet habe)

Danke für eure Antworten!


----------



## setNewUser() (6. Feb 2021)

Noch eine Frage ich:
Wie läuft das genau, dass man ein Programm auf einem Server startet, wenn man beispielsweise einen gemietet hat?
Lade ich das Programm auf den Server wie auf eine Festplatte und starte ihn dort mit einer Benutzeroberfläche oder einer Art Terminal?
In welcher Form muss sich ein Java-Programm befinden, um auf einem Server gestartet werden zu können? Als Projekt, als .jar ...?

Wenn das relativ einfach geht, lohnt sich für mich auf jeden Fall, mal einen zu mieten.
Danke euch!


----------



## LimDul (6. Feb 2021)

In der Regel loggt man sich über ssh ein und hat dann eine Linux Konsole. Also ein Terminal. Dort startet man es im Zweifelsfall ganz normal wie auf einer Kommandozeile.

Problem ist natürlich, je nach dem was du mietest musst du auch selbst dafür sorgen, dass das Betriebssytem aktuell gehalten wird - sonst hast du ggf. schneller Untermieter als dir lieb ist, die dann Spam & Co verschicken.


----------

