FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Java Webprogramming - Problem :(

Java Webprogramming - Problem :( 2011-10-23 23:44
Anonymer User
Hallo Leute. Ich schreibe gerade ein onlinefähiges Javaprogramm, um genauer zu sein einen Chat. Das ganze basiert auf Sockets. Im Grunde habe ich alles wesentliche bereits geschrieben, Client und Serverseite stehen und können lokal auch miteinander kommunizieren.

Doch sobald ich versuche das ganze über das Internet zu testen kommt es zu Problemen. Das Clientseitige Socket schmeisst eine ConnectionException. Nun weiss ich leider absolut nicht wo der Fehler liegt :(.

Ich schreibe einfach mal auf wie ich mir das denke, vielleicht liegt bereits hier der Hase im Pfeffer begraben.

Um das ganze "offline" zu testen, erstelle ich clientseitig den Socket wie folgt:
controllerSocket = new Socket("localhost",4441);

Das funktioniert auch wunderbar, da der Server und der Client auf derselben Maschine liegen. Nun möchte ich aber über das Internet auf meinen Server zugreifen. Client und Server sollen also weiterhin auf meiner Maschine laufen, aber die das ganze soll erst durchs Internet zu mir zurück kommen(ist hieran bereits was falsch?), da ich leider gerade keinen Laptop o.ä. zur Hand habe, um die zwei Seiten physikalisch zu trennen.

Ich schaue also nach was meine vom Provider zugewiesene IP-Adresse ist (z.b. über whatismyip.com oder so). Dann konstruiere ich mir eine Instanz des InetAdress Objektes:
InetAddress adress = InetAddress.getByName("88.44.159.77"); //ipadresse fiktiv

Mit diesem Objekt füttere ich dann den Socket:
controllerSocket = new Socket(adress,4441);

Beides ist so in der Dokumentation nachlesbar, das holen der InetAdress Instanz und das erstellen des Sockets damit sollte genau so funktionieren.

Nun bekomme ich aber wie gesagt die "java.net.ConnectException: Connection refused: connect" Exception. Was ist nun falsch? Liegt es am Port? Wie muss ich diesen Port wählen? Muss ich am Rechner irgendwas umstellen, dass der Port nach außen hin frei steht? Oder im Router?

Ich google schon Ewigkeiten ohne glücklich zu werden :(. Ich hoffe irgendjemand kennt sich damit einbisschen aus. Wäre euch echt dankbar!

RE: Java Webprogramming - Problem :( 2011-10-24 00:09
Anonymer User
Du musst den Port in deinem Router an deinen Rechner weiterleiten. Du öffnest den Port ja jetzt auf deinem Rechner. Der andere Client verbindet sich aber auf deinen Router, der den nicht auf hat.

RE: Java Webprogramming - Problem :( 2011-10-24 00:21
Anonymer User
Hallo. Danke für die Antwort, das habe ich bereits versucht aber es bleibt bei der Exception.

Im Router bei Portforwarding habe ich folgendes stehen:
TCP: externes Paket: portstart:4441 portende:4441 ::::: internets Paket portstart:4441 portende:4441

Und die IP meines Rechners in der LAN. Selbige Ports nutzt Server und Client. Windows Firewall habe ich deaktiviert.

Irgendwer noch Ideen? :(

RE: Java Webprogramming - Problem :( 2011-10-24 01:06
Anonymer User
Kurioserweise bestätigen mir Portscantools im Internet, dass entsprechende Ports von außen erreichbar sind. Sie werden auch von meinem laufenden Server als Clienten erkannt. Einzig mein eigener Client scheint sich nicht nach außen durchwählen zu können :(. Verstehe absolut nicht wieso? Ich habe auch schon Firewall und Virenscanner deaktiviert gehabt, brachte keinerlei Erfolg.

Weiss echt nicht mehr was ich noch versuchen soll :/.

RE: Java Webprogramming - Problem :( 2011-10-24 09:35
Anonymer User
Auf welchem Interface lauscht dein Server denn? Wenn der nur lokal auf Verbindungen wartet, bekommt er die von deinem Router natürlich nicht.

netstat -an | grep 4441 hilft dabei.

RE: Java Webprogramming - Problem :( 2011-10-24 12:34
Anonymer User
Hallo und danke für die Antwort. Ich kann leider nicht folgen, scheine wirklich riesige Wissenslücken zu haben. Auf welchem Interface mein Server lauscht? Was bedeutet das? Also ich kann den ServerSocket nur an einen Port binden, auf den er lauscht. Dieser Port wird bei netstat auch als "abhörend" aufgeführt.

Und wie gesagt können sich Portscantools zu meinem Server verbinden, dieser meldet mir nämlich jedes mal, wenn ein Client eine Anfrage an ihn stellt. Also wird er schon durch den Router durch Anfragen aus dem Internet bekommen und beantworten können (die Tools melden auch, dass sie einen Dienst gefunden haben).

Nur mein Client scheint schwierigkeiten zu haben :/.

RE: Java Webprogramming - Problem :( 2011-10-24 13:27
Anonymer User
Portforwarding funktioniert bei handelsüblichen Routern i.d.R. nur bei Verbindungen, die von außen (=aus dem Internet) initiiert werden. Willst du den lokal laufenden Dienst aus demselben Netz erreichen, musst du dies daher auch über eine lokale Adresse tun.

tzwoenn

RE: Java Webprogramming - Problem :( 2011-10-25 12:09
Anonymer User
Echt? Na das wäre ja mal ein fieser "bug". Nie im Leben wäre ich auf sowas gekommen. Werde versuchen das mal auf einem anderen Rechner zu testen. Soweit schonmal vielen Dank an alle, die geantwortet haben.

RE: Java Webprogramming - Problem :( 2011-10-27 10:34
Anonymer User
Hm, ich habe es jetzt von einem anderen Rechner(+anderes Netz) aus probiert. Aus einer LAN heraus funktioniert alles wunderbar (ueber die LAN Adresse), sobald man es aber durchs Internet versucht (aus einem anderen Netz) wird die altbekannte Exception geworfen.

Das ist echt zum Verzweifeln. Irgendjemand vllcht andere Ideen? Sind die Sockets etwa nur fuer lokale Netzwerke geeignet?

RE: Java Webprogramming - Problem :( 2011-10-27 19:18
Anonymer User
Nee, das macht für den socket keinen unterschied.

Hast du auf Clientseite einen Socket und auf Serverseite einen ServerSocket? Der Client Socket muss sich nun wenn du im LAN bist auf die lokale IP verbinden und wenn du es übers inet machst auf die externe IP. Zusätzlich musst du den Port halt in deinem Router auf deine lokale IP forwarden.

RE: Java Webprogramming - Problem :( 2011-10-27 20:01
Anonymer User
Nee, das macht für den socket keinen unterschied.

Hast du auf Clientseite einen Socket und auf Serverseite einen ServerSocket? Der Client Socket muss sich nun wenn du im LAN bist auf die lokale IP verbinden und wenn du es übers inet machst auf die externe IP. Zusätzlich musst du den Port halt in deinem Router auf deine lokale IP forwarden.

Hm, das passiert alles bereits so und wie gesagt via LAN geht es auch.

Ich habe das Problem mal isoliert und ein KSKB (kleines selbstständiges kompilierbares Beispiel). Vielleicht kann hier jemand dort bereits Fehler entdecken, es hackt bei mir genauso wie mein richtiger Chat. Und zwar wirft das "new Socket("12.34.567.88", 4441)" die im Ausgangspost beschriebene Exception.

Client, mit localhost funkt es und mit externer Ip nicht:
import java.io.IOException; import java.net.Socket; public class Client {          Socket clientSocket;     public static void main(String []args)     {         new Client();     }          private Client()     {         try {             clientSocket = new Socket("localhost",5555);              } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }     }
Server:
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JFrame; public class Server{          ServerSocket serverSocket;     Socket clientSocket;          public static void main(String []args)     {         new Server();     }          private Server()     {         try {             serverSocket = new ServerSocket(5555);             waitForClient();         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }     }          //wartet auf Clienten     private void waitForClient()     {         clientSocket = null;         try {             //auf clienten warten und seine Verbindung akzeptieren             clientSocket = serverSocket.accept();             System.out.println("Client accepted");             clientSocket.close(); //clientSocket wieder schließen             serverSocket.close();//Serversocket wieder schließen         } catch (IOException e) {             System.out.println("Accept failed");             System.exit(-1);         }     }      }

RE: Java Webprogramming - Problem :( 2011-10-28 12:07
Slater
nur ganz allgemein:
new Socket("localhost",5555);
besagt dass beim Server Socket 5555 angesprochen werden soll, da wo der ServerSocket wartet,
welchen Port der Client für die Verbindung bekommt ist zunächst zufällig,
gerade bei "localhost"-Verbindung könnten ja nicht Server + Client denselben Port nehmen

klingt aber nicht nach deinen Problem, spätestens wenn du ohne Firewall agierst

RE: Java Webprogramming - Problem :( 2011-10-29 16:48
Anonymer User
Wenn die externen Portscanner bis zu deinem Server durchkommen und lokal alles geht, dann ist auf deinem Client anscheinend noch ne firewall oder so die das blockt.

RE: Java Webprogramming - Problem :( 2011-10-31 12:57
Anonymer User
Entpuppte sich als Hardwareproblem (wahrscheinlich Router), der Code ans ich funktioniert einwandfrei. Danke nochmal für alle Hilfestellungleistenden!