Socket Socketverbindung nur im lokalen Netzwerk

Lexi

Bekanntes Mitglied
Guten Abend zusammen,

Ich habe eine Client und eine Server Klasse die über Sockets miteinander kommunizieren. Der Server wartet in einer while(true) Schleife permanent auf einen Clienten der, sobald er eine Verbindung herstellt eine Bestätigungsnachricht geschickt bekommt und danach wird die Verbindung von Seiten des Server wieder getrennt.
Das ganze geht solange gut, wie ich mich auf lokaler Ebene (localhost, oder im eigenen WLAN) bewege. Sobald ich versuche übers Internet eine Verbindung herzustellen gibts eine Fehlermeldung (s.h. Anhang)
Ein Rechner war Windows 7 und auf dem anderen läuft Ubuntu Linux 10.04, die Firewall auf dem Win7 war aus, auf dem Ubuntu wüsste ich nicht, dass es dort standartmäßig so etwas gibt.

Client.java :
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String ip = args[0];
		int port = Integer.parseInt(args[1]);
		try {
			Socket connection = new Socket(ip,port);
			BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			String line = new String();
			while((line = in.readLine()) != null){
				System.out.println(line);
			}
			System.out.println("Closing down connection...");
			in.close();
			connection.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

Server.java:
Java:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	private Socket socket;

	public Server(int port) {
		try {
			ServerSocket sSocket = new ServerSocket(port);
			System.out.println("Server is ready");
			while (true) {
				System.out.println("Waiting for client...");
				socket = sSocket.accept();
				System.out.println("Connection established. ");
				System.out.println(socket.getInetAddress().toString());
				BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
				out.write("This is a test message.");
				out.flush();
				out.close();
				socket.close();
				System.out.println("Connection closed");
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Server serv = new Server(Integer.parseInt(args[0]));
	}

}
 

Anhänge

  • SocketVerbindung.png
    SocketVerbindung.png
    10,9 KB · Aufrufe: 70
Ich bezweifle, dass es was mit Java zu tun hat... kannst höhstens versuchen dich mit telnet zu verbinden, aber das wird imho auch scheitern.
Bist du dir auch sicher, dass der Router richtig eingestellt ist?
 
Ich habe keine Ahnung was ich beim Router einstellen muss/kann damit das klappt. Wie verbinde ich mich mit telnet ?
 
Code:
telnet 80.143.216.109 16567

Der Server läuft unter ubuntu? Dann hast du mit sicherheit einen Ipfilter aktiv -> iptables. Ist das ein gehostetes Angebot, z.B. ein Server bei 1und1 oder steht der privat irgendwo zuhause hinter eine Fritz!Box oder nem Teledat Router?
 
Je nach dem was du für einen Router hast, gibt es da Einstellungen wie "Portforwarding", "Internetdienste", "NAT" o.ä.
Es läuft darauf hinaus, dass du im Router einstellst, dass er den Port X auf deinen lokalen Rechner weiterleitest, damit eine Verbindung aufgebaut wird.
 
Ich habe keinen extra Server auf dem mein Server Code läuft ich starte die Server Klasse ganz normal im Terminal auf meinem PC auf dem halt Ubuntu läuft. Iptables ? Wie komme ich da dran und was muss ich dort machen ? telnet werde ich noch ausprobieren, ist hier grad nicht möglich und das mit dem Router versuche ich auch noch.
Soweit erstmal vielen Dank für die Hilfe.
 
Hallo Lexi,

da kannst du ohne viel Aufwand leider nicht viel machen 😉 Das liegt an NAT und die entsprechenden Einträgen im gewünschten Frame. Damit dein Programm auch sauber über das Internet funktioniert, brauchst du einen Weg, der daran vorbeiführt: UDP hole punching - Wikipedia, the free encyclopedia

Es ist allerdings meistens angenehmer, nicht mit Sockets zu arbeiten, sondern sich direkt auf ein fertiges Protokoll zu stützen, zum Beispiel XMPP (SmackXMPP für Java ist sehr brauchbar, finde ich).

Alternativ kannst du auf den flächendeckenden Einsatz von IPv6 warten ;D
 
Zuletzt bearbeitet:
Hallo Lexi,

da kannst du ohne viel Aufwand leider nicht viel machen 😉

So ein quatsch. Sofern sich der "Server" an einem "herkömmlichen DSL-Anschluss" angeschlossen ist, und kein allzu exotischer/uralter Router benutzt wird, lässt sich Portforwarding mit wenigen Klicks einrichten. Das ist idR. auch keine Sonderspezial-Experten-Funktion im Router, sondern gang und gebe und in den allermeisten Handbüchern exzellent beschrieben.

Das liegt an NAT und die entsprechenden Einträgen im gewünschten Frame. Damit dein Programm auch sauber über das Internet funktioniert, brauchst du einen Weg, der daran vorbeiführt: UDP hole punching - Wikipedia, the free encyclopedia

Oder die UPNP Funktion des Routers (können recht viele) benutzen.

Es ist allerdings meistens angenehmer, nicht mit Sockets zu arbeiten, sondern sich direkt auf ein fertiges Protokoll zu stützen, zum Beispiel XMPP (SmackXMPP für Java ist sehr brauchbar, finde ich).

Das löst das NAT Problem nicht, macht nur die Entwicklung angenehmer.

Alternativ kannst du auf den flächendeckenden Einsatz von IPv6 warten ;D

Naja, da wird er wohl noch lange warten. So schnell wird sich IPv6 beim Providerkunden (leider) nicht durchsetzen :-(

@Lexi
Was für einen DSL-Anschluss hast du, bzw. was für ein Router ist auf Serverseite in Verwendung?

Gruß
Alex
 
Naja, da wird er wohl noch lange warten. So schnell wird sich IPv6 beim Providerkunden (leider) nicht durchsetzen :-(

ich will hoffen das das noch ein Weilchen dauert ... mit IPv6 fällt der ganze NAT-Kram ... ist zwar für Informatiker einfacher - allerdings wird das die Rechner von Otto-Voll-Dau ins Internet katapultieren und damit $BadGuy wieder Tür und Tor öffnen :autsch:
 
ich will hoffen das das noch ein Weilchen dauert ... mit IPv6 fällt der ganze NAT-Kram ... ist zwar für Informatiker einfacher - allerdings wird das die Rechner von Otto-Voll-Dau ins Internet katapultieren und damit $BadGuy wieder Tür und Tor öffnen :autsch:

Kann ich nur unterschreiben ... Kann mich ebenfalls nicht damit anfreunden dass bald jede Kaffemaschine, jeder Rasierapparat - oder etwas realistischer - jeder SAT-Receiver oder BluRay Player, Rechner, Laptop, IPhone oder Tablet-PC direkt und ohne umwege von überall aus erreichbar sein wird.

NAT ist auf der einen Seite lästig, auf der anderen ist es privatspährentechnisch aber auch praktisch.

Aber gut, *backtotopic*

- Alex
 
Hi tuxedo,

So ein quatsch. Sofern sich der "Server" an einem "herkömmlichen DSL-Anschluss" angeschlossen ist, und kein allzu exotischer/uralter Router benutzt wird, lässt sich Portforwarding mit wenigen Klicks einrichten. Das ist idR. auch keine Sonderspezial-Experten-Funktion im Router, sondern gang und gebe und in den allermeisten Handbüchern exzellent beschrieben.

Du willst es jedem Benutzer zumuten, an seinem Router rumzuspielen, nur damit eine Applikation läuft? Das ist nicht schön =/

Oder die UPNP Funktion des Routers (können recht viele) benutzen.

Aber nicht alle, und was machen diese Nutzer dann?

Das löst das NAT Problem nicht, macht nur die Entwicklung angenehmer.

Im Falle von XMPP schon, vorausgesetzt man hat einen fertig konfigurierten Server zur Verfügung.

Naja, da wird er wohl noch lange warten. So schnell wird sich IPv6 beim Providerkunden (leider) nicht durchsetzen :-(

Ja, da hast du Recht. Mal sehen, wie lange das dauert 😉


Beste Grüße

lama
 
Du willst es jedem Benutzer zumuten, an seinem Router rumzuspielen, nur damit eine Applikation läuft? Das ist nicht schön =/


das hat nichts mit schön oder unschön zu tun, sondern mit der sicherheit, da i.d.r. die ports geschlossen sind. zudem muss nur der router an dem der server dranhängt für das portforwarding konfiguriert werden.
 
Guten Abend,

hier bin ich endlich wieder. Habe nun den entsprechenden Port in meinem Router an meinen Rechner weitergeleitet und es hat alles reibungslos geklappt.
Vielen Danke an alle Beteiligten.

Gruß Lexi
 

Zurück
Oben