Socket zu eigener Serveranwendung per öffentlicher IP-Adresse

timestamp

Mitglied Käsekuchen
Hallo Forum,

ich schreibe gerade zum Testen eine kleine Socketanwendung. Zum einen der Server, der auf ankommende Textnachrichten wartet, sowie die Clients, die diese eben Senden können (quasi ein Chat). Client und Server laufen beide auf meinem Laptop. Solange ich über 127.0.0.1, bzw meiner lokalen IP-Adresse die Verbindung aufbauen will, klappt das auch.
Nehme ich nun meine "öffentliche IP" (wieistmeineip.de) schlägt der Verbindungsaufbau allerdings fehl.
Es wäre allerdings schon praktisch, wenn ich Socketanwendungen so schreiben kann, dass Server und Client nicht auf dem selben Rechner bzw im LanNetzwerk liegen müssen.
Wie kann ich das Problem umgehen?
 
Hi.

Das ist wohl kaum ein Java Problem.

Wie ist denn der Rechner mit dem Netz verbunden? Stimmt die IP deiner Netzwerkkarte mit der IP von "wieistmeineip.de" überein?

Welches Betriebssystem?

Firewall aktiviert?

Gruß
 
Hallo deepthroat,

ich gehe über WLAN über einen Router ins Internet. Betriebssystem ist Win7 HomePremium.
FireWall hat sich nicht gemeldet (ich hatte sie desweiteren ohnehin zum Testen deaktiviert).

Ich habe mal testweise die IP die mir angezeigt wird angepingt, was einen Durchschnittswert von etwa ~1ms gebracht hatte (deswegen gehe ich mal davon aus, dass sie stimmt).
Wie stelle ich denn fest ob die IP mit der von der Netzwerkkarte übereinstimmt? Ich habe ipconfig /all eingegeben, dort erhalte ich allerdings nur die lokalen IPs

Gibt es weiterhin eine Möglichkeit die öffentliche IP mit Java auszulese, ohne dafür eine Seite parsen zu müssen? Ich kenne die Methode eine PHP-Seite auszulesen, bei der ich mittels $_SERVER['REMOTE_ADDR'] die IP Anzeige.
 
Zuletzt bearbeitet:
Hallo,

wenn du über einen Router ins Internet gehst, dann entspricht deine öffentliche IP-Adresse nicht der IP-Adresse der Netzwerkkarte deines lokalen Rechner sondern der IP-Adresse der Netwerkkarte deines Routers. Desweiteren wird deine Server-Anwendung netzwerktechnisch über einen Port identifiziert. An diesen Port kann ein Client über das Internetprotokoll an deine Serveranwendung dann andocken. Der Port ist aber nur beim lokalen Rechner vorhanden (da wo der Server läuft) nicht auf dem Router. D.h. ein Client der von außen erstmal nur den Router kennt (über die öffentliche IP) wird den Port nicht vorfinden. Lange Rede kurzer Sinn, das Stichwort ist Portforwarding auf dem Router. Du musst also den Port der Server Anwendung für Clientanwendungen auf deinem Router freischalten und Anfragen die auf diesem Port kommen an deinen lokalen Rechner weiterleiten. Wie das geht hängt vom Gerät ab und sollte normalerweise in der Bedienungsanleitung deines Routers stehen.

Gruß,
RedWing
 
Hallo,

ja das macht Sinn. Alternativ lässt sich die Serveranwendung ansonsten auf einem "echten" Server hosten oder? Dann erspare ich mir zumindest auf den Clientrechner das Portforwarding, richtig?

Und zu meiner letzten Frage: Kann ich die IP mit Java an sich auslesen? Oder muss ich da den Umweg über z.B. PHP nehmen?
 
Hi

bei Clients muss kein P.Fw. gemacht werden
(außer sie sind programmmäßig auch Server, dh. listen/accept).

Gruß
 
Hi

danke für deine Antwort.
Ich habe allerdings noch ein kleines Problem was ich hier gerade mal mit hinein schreibe:
Ich würde gerne prüfen ob der Client noch verbunden ist. Nach dem Beenden des Clients allerdings,
wird mir immer noch ausgegeben, dass er verbunden ist:
Java:
//Server
System.out.println("Closed: "+clients.get(i).isClosed());
System.out.println("Connec: "+clients.get(i).isConnected());

Java:
//Client
public void windowClosing(WindowEvent e){
  try{			
    client.close();
  }
  catch(Exception e2){}
}
 
Die restlichen Antworten noch ;-)

Hallo,

ja das macht Sinn. Alternativ lässt sich die Serveranwendung ansonsten auf einem "echten" Server hosten oder? Dann erspare ich mir zumindest auf den Clientrechner das Portforwarding, richtig?

Ja genau. Man sollte halt dann drauf achten das die Firewall nicht den Port sperrt. Ansonsten meintest du sicher "Router" anstatt "Clientrechner"..

Und zu meiner letzten Frage: Kann ich die IP mit Java an sich auslesen? Oder muss ich da den Umweg über z.B. PHP nehmen?

Versuchs mal so:

Java:
      java.util.Enumeration<java.net.NetworkInterface> ifs = java.net.NetworkInterface.getNetworkInterfaces();

      while (ifs.hasMoreElements())
      {
        java.util.Enumeration<java.net.InetAddress> addresses = ifs.nextElement().getInetAddresses();
        while (addresses.hasMoreElements())
        {
            System.out.println(addresses.nextElement());
        }
      }

  }

RedWing
 
Zuletzt bearbeitet:
Hallo,

das eine Exception geworfen wird, sobald der Client disconnected habe ich auch schon festgestellt. Ich werde dann einfach den Weg nehmen und diese Abfangen.

Das Codebeispiel habe ich auch schon gefunden, allerdings liefer mir das nur die lokalen IP-Adressen (mit VPN-Netzwerken). Scheinbar muss man also doch den Umweg über eine PHP Seite nehmen.

Ich bedanke mich bei allen Antwortern für eure schnelle Reaktion :)
 
Zurück