Socket Chatserver aus dem Internet nicht erreichbar

JDan

Mitglied
Moin moin!
Ich beschaeftige mich seit kurzem mit Socketprogrammierung in Java und habe erstmal einen Chat geschrieben. Im Prinzip klappt das meiste so wie ich es mir ausgemalt habe, wenn beides lokal liegt oder via LAN getrennt ist kann ich mit Server und Chatteilnehmern kommunizieren(im ersten Fall fuettere ich das (Client) Socket mit localhost, im zweiten mit der LAN Adresse des Serverrechners). Sobald ich jedoch versuche meinen Server aus dem Internet heraus anzusprechen wirft die Clientseite folgende Exception: "java.net.ConnectException: Connection refused: connect".

Ich verfahre wie folgt:
*Ich starte den Server mit Port 5555
*In meinem (Alice)Router stelle ich das entsprechende Portforwarding ein (von 5555 zu 5555+ LAN Ip des Serverrechners)
*Ich erfrage meine vom Provider gegebene IP Adresse (z.B. mit whatismyip.com)
*Auf der Clientseite erstelle ich das Socket mit Port 5555 und der Ip die ich vom Provider bekomme.

Ich habe bereits die Firewalls auf beiden Testrechnern ausgemacht. Beide Testrechner befinden sich in unterschiedlichen Netzwerken.
Lasse ich den Server laufen und fuehre beliebige online angebotene Portscantools aus wird der Port als offen erkannt, mein Server erkennt die Anfrage dieser Dienste ebenfalls und meldet mir akzeptierte Verbindungen.

Einzig mein Client weigert sich hartnaeckig.
Ich weiss nicht mehr wo ich nach fehlern suchen kann . Da ich neu in der Materie bin unterliege ich aber auch vielleicht grundlegenden Fehlern? Sind die Sockets nur dazu da in einem lokalen Netzwerk zu funktionieren?

Waere fuer jeden Hinweis dankbar.
 
Ne, theoretisch müsste es funktionieren. Aber so ohne Einzelheiten und Code kann man da nicht viel sagen. Kannst ja ein KSKB machen, wo nur der Verbindungsaufbau vorhanden ist, dann könnte man da schon etwas erkennen.
 
Erstmal danke fuer alle Antworten!
Bin leider gerade bei der Arbeit, aber sobald ich wieder zu Hause bin wird KSKB und Pingergebnis nachgeliefert.

@TheDarkRose
Client und Server befanden sich bei den Versuchen in unterschiedlichen Netzwerken, sogar bei unterschiedlichen Providern.
 
Offtopic: Es gibt keinen Edit Button hier im Forum? Kann man seine eigenen Beiträge etwa nicht Löschen/Editieren? Oder bin ich bilnd? ^^

Topic:
Das hier ist der Clientencode zum Aufbauen der Verbindung, wobei der Fehler bereits in der dritten Zeile beim erstellen des Sockets auftritt:
Java:
try {
			InetAddress adress = InetAddress.getByName("75.80.55.112"); //Ipadresse fiktiv
			controllerSocket = new Socket(adress,4442);
			
			out = new DataOutputStream(controllerSocket.getOutputStream());
			in = new DataInputStream(controllerSocket.getInputStream());
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Und hier der Servercode zum Empfangen der Clienten
Java:
private void startWaitingForClients()
		{
			
			while(true){
			// Clienten akzeptieren
			Client client = new Client(clientNumber++);
			Socket clientSocket = null;
			try {
				//auf clienten warten und seine Verbindung akzeptieren
				clientSocket = serverSocket.accept();

				//client wird in seinem eigenen Thread gestartet
				ClientThread clientThrd = new ClientThread(client); 
				clientThrd.start(); //Thread auf ready to run setzen

				
			} catch (IOException e) {
				System.out.println("Accept failed: " + port);
				System.exit(-1);
			}
}


Pingen: Aus meinem eigenen Netzwerk heraus kann ich meinen Computer via ProviderIp pingen. Von einem anderen Rechner aus konnte ich das bisher nicht testen. Aber Portscantools erkennen mich von außen her wie gesagt, auch den offenen Port.
 
Oben steht 5555, im Code 4442.
mit
Code:
clientSocket
passiert nix.
Wozu überhaupt
Code:
getByName
?
Wie sieht die Initialisierung von
Code:
serverSocket
aus?

P.S. Beiträge kannst du schon ändern, nur eben nicht unbegrenzt lange
 
Hallo!
Entschuldigung, da habe ich wohl zu hastig im Code rumgeschreddert.
Die ServerSocket initialisierung sieht wie folgt aus:
Java:
serverSocket = new ServerSocket(port);

Ports stimmen schon, ich habe beim Threadschreiben nur die zuletzt verwendete Portnummer nicht mehr im Kopf, zwischen Client und Server waren die Ports stets übereinstimmend.

Ja, wozu das getByName ^^. Weiss ich auch nicht so recht, war ein verzweifelter Versuch irgendwas beim initialisieren der Sockets anders zu machen. Anfangs hatte ich den Ipstring direkt bei den Socketparametern stehen gehabt, selbes ergebnis.

Mit dem clientSocket passiert was, wurde nur weggeschreddert ^^( Sorry nochmal). Nach einem accept meldet mir der Server, dass ein Client sich erfolgreich verbunden hat.

Ich fertige mal ein wirkliches KSKB an und poste nochmal, so ist das ganze wohl zu wirr.

EDIT:
Hier das KSKB. Mit localhost funkt es (Client wird akzeptiert), via ProviderIP wird dieselbe Exception geschmissen
Client:
Java:
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:
Java:
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);
		}
	}
	


}
 
Zuletzt bearbeitet:
Wieso beginnst du mit dem Komplizierten? Du hast ja auf diese Art keinen Hinweis welche Ebene der Kommunikation nicht geht.

Versuch doch erst mal einen Ping - das ist absolut low level. Wenn das nicht geht, bringt alles Andere gar nichts.

Danach kannst du überprüfen, ob auch der Port erreichbar ist. Dazu brauchst du Telnet (z.B. Linux) oder putty (Windows)

Dann kannst du mit programmieren beginnen.
 
Wenn du einen Ping auf die öffentliche IP machst, antwortet der Router darauf. In standardeinstellung wird nochdazu bei so gut wie jedem Router das paket einfach geschluckt, mit einer Option a la "Respond to ICMP ping" kann man das einstellen. Eine Portweiterleitung sollte aber in jedem Fall funktionieren, wenn sie denn richtig eingestellt ist.
Dein Java Code sieht in ordnung aus, ich glaube das ist ein Netzwerk problem. Bist du sicher dass die richtige Adresse bei der Weiterleitung eingestellt ist (Achtung bei DHCP)? Bei manchen Routern musst du aufpassen bezüglich port range, ausserdem sichergehen dass du TCP weiterleitest nicht nur UDP.
 
Ausser der Server hat eine öffentliche IP, aber egal ping sagt trotzdem schon sehr viel aus - den Rest macht telnet

Beides sind Tools die keine programmiertechnischen Unsicherheiten enthalten ...
 
Ich weis ja nicht, hast du dir den OP überhaupt durchgelesen? JDan hat einen Server im Lan laufen und die Portweiterleitung klappt nicht. Da kannst du pingen so viel du willst, das sagt gar nix aus. Ein Interetanschluss hat nur eine öffentliche IP, hinter der steht dann im Normalfall ein Router, und hinter dem das Lan (auf irgendwelche Topologien a la DMZ will ich hier nicht eingehen).
Jetzt könntest du vielleicht den ICMP port weiterleiten (ob das der Router überhaupt zulässt) und dann Pingen, aber was das bringen soll...
edit:
JDan ich hab deinen Code so nicht zum laufen gekriegt. Aber das hier funktioniert bei mir ohne weiters, es ist also zu 99% ein Netzwerkproblem:
Java:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class PubIPTest {
	
	PubIPTest()
	{
		Server s=new Server();
		s.start();
		Client c=new Client();
		c.start();
	}
	public static void main(String[] args)
	{
		new PubIPTest();
	}
	 
	 
	 
	class Client extends Thread {	    
	    Socket clientSocket;
   
	    public void run()
	    {
	        try {
	            clientSocket = new Socket("localhost",5555);
	    
	        } catch (IOException e) {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
	        }
	    }
	}
	public class Server extends Thread{
	    
	    ServerSocket serverSocket;
	    Socket clientSocket;

	    public void run()
	    {
	        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);
	        }
	    }
	}
}
 
Zuletzt bearbeitet:
Wieso beginnst du mit dem Komplizierten? Du hast ja auf diese Art keinen Hinweis welche Ebene der Kommunikation nicht geht.

Weil das mir zur Verfügung stehende Lehrmaterial eben dieses Vorgehen vorschlägt. Ich bin ja noch am Lernen und so ist mir der bestmögliche Weg das ganze anzugehen leider noch nicht bekannt. Wie nutze ich putty dazu herauszufinden, ob der Port frei ist? Ich habe das Programm bisher immer nur für SSH Verbindungen genutzt.

@Pingen
Sowohl die Win7 Firewall als auch vorher schon der Router schlucken die Pings.

Dass das Portforwarding im Prinzip richtig eingestellt ist bin ich mir ziemlich sicher. Es ist auf jeden Fall TCP und auch die LAN-IP des Rechners ist richtig(da auch einziger Rechner in der LAN). Was müsste man besonderes bei der Range beachten? Also bei mir sind es Rangeangaben, aber wenn ich sage von 5555 bis 5555 sollte ja nicht viel schief laufen, da das nur der eine Port ist?

Was mich am meisten Verwundert ist eben, dass Portscanner wie der hier: Online Port Scan | Port Scanning | Port Scanner | Port Checker alles erkennen und sich sogar zu meinem Server verbinden. Schicken die ihre Anfrage etwa nicht wirklich von außen sondern lokal?

Langsam wird das ganze echt nur noch ein einziger Frust :/.

Mal was anderes, gehe ich recht in der Annahme, dass Webspace, der meinen Server hosten könnte (der bräuchte ja dann eine JVM?) quasi unbezahlbar ist? Oder anders, kennt vllcht jemand "relativ" günstige Anbieter? Erstmal bräuchte ich nur Leistung für zwei Clienten, also nur zu Testzwecken. Was genau müsste ich da beachten?

Und nochmal vielen Dank an alle Beteiligten hier. Sich mit anderen auszutauschen erleichtert die Last des Problems enorm.
 
Eben bei einer Range von 5555 bis 5555 hakts bei manchen Routern, hängt vom jeweiligen Router ab aber das muss nicht dein Problem sein. Hast du schon versucht dich selber über die Öffentliche IP zu erreichen?
Edit: wenn du beim Portscanner in deinem Link deinen Port überprüfst, schreibt er dann
isn't responding on port 5555().
oder
isn't responding on port 5555(ndmp).

Wenn der Portscanner dich nämlich findet, dann stimmt auch die Weiterleitung. Dann passt was beim Verbinden zum Server nicht, deshalb teste mal ob du vom rechner über die öffentliche ip zum rechner wieder zurückkommst (meinen Code mit deiner Öffentlichen IP ausführen).
 
Zuletzt bearbeitet:
Zuletzt bearbeitet:
Anscheinend haben auch andere Probleme mit dem Portforwarding bei alice routern. Fehlerhaftes Port Forwarding beim 1421 WLAN • Alice Community Forum
Ich hab keine Erfahrung mit Alice routern, am besten du stellst deine Frage im Alice forum.
Der generelle Lösungsvorschlag von da war einen Hardwarereset zu machen. Mein Vorschlag: kauf dir einen neuen Router.
Ich bin kein Netzwerkexperte, aber ich hab gute Erfahrungen mit Netgear und Linksys Routern gemacht. Seit ich meinen WRT54GL von Linksys mit Tomato Firmware haben, blieben mir ähnliche Probleme wie du sie grade geschildert hast erspart.
Ansonsten könntest du noch einen Screenshot von deinen Portforwarding Einstellungen liefern, falls da was falsch ist.
 
Hallo bERt0r,

vielen Dank für die Mühe, die du hier machst 🙂. Inzwischen habe ich rausfinden können, dass es zu 100% ein Netzwerkproblem ist. Mein Bruderherz nahm sich die Zeit einige Dinge mit mir und seinem Rechner auszuprobieren, bei ihm läuft alles tadellos.

An deinen Vorschlag habe ich auch bereits gedacht. Werde jetzt einfach einbisschen sparen und mir was vernünftiges kaufen. Vorher aber auch Hardwarereset probieren.

Danke nochmal an alle, die hier mitgeholfen haben! Hat mir auf jeden Fall geholfen nicht daran zu verzweifeln ^^.

Ich berichte später auch mal ob es geklappt hat.
 
Siehste - Netzwerkproblem - und da kamen so viele Posts wie man sockets programmiert und was man da alles falsch machen kann - das mit Ping und telnet ist halt immer noch die schnellste Variante.

Seid mir nicht böse, dass ich mir den neblig trüben Montag morgen mit einem siegesgewissen Grinsen aufhelle 😀
 
Dass du keine Posts lesen kannst wissen wir bereits, aber wenn man sowas von null Ahnung von der Materie hat wie du, sollte man sich sein Grinsen über Probleme anderer und derartige Posts sparen.
 
Ok, wenn du meinst dass ich keine Ahung habe, dann wird das wohl stimmen undich werde nicht widersprechen - Meinungsfreiheit ist IMHO in der Bundesverfassung beider Länder verankert.

Ich pflege halt den banalen Ansatz zuerst mal die Basis zu prüfen und das mit banalen Tools wie Ping und telnet, die keine Unsicherheit betreffend port-Ansteuerung enthalten.

Wem dieser Ansatz zu banal ist - der kann gerne Umwege beschreiten
 

Zurück
Oben