# client server socket via internet



## yyannekk (28. Mai 2011)

hallo,
also ich habe immer noch ein problem mit einer socket verbindung übers internet
ich habe ein chat system für ein spiel umgeschrieben, allerdings probier ich es jetzt erstma mit dem chatprogramm da es insgesamt simpler aufgebaut ist...

mein server programm läuft auf einem rechner hinterm router.
mein client läuft auf einem anderen rechner

problem:
wenn ich eine verbindung zwischen zwei pcs (der eine als server der andere als client) im *lokalen netzwerk aufbaue klappt alles.
wenn ich übers internet komme, kriege ich keine verbindung hin. * ich habe im router den port freigegeben (9999) (zum testen alle firewalls ausgeschaltet) und dann von einem rechner der nicht im lok netz ist über internet über die öffentliche ip addresse des serverrechners versucht zu connecten. es kommt dann eine

```
java.net.ConnectException: Connection timed out: connect
```
exception auf der clientseite

ich könnte jetzt auch ein bischen code posten allerdings denke ich liegt es eher daran das ich was mit der verbindung übers internet nicht richtig mache, portfreigabe etc...

ich häng mal den server und client ran. evlt kann jemand testen ob es bei ihm klappt!?
wie gesagt ich weiß das das programm im lokalen netzwerk funktioniert, ich will aber eine verbindung über internet aufbauen.


----------



## Marcinek (28. Mai 2011)

Hast du den port auch an deine lokale IP Adresse forwarded?


----------



## yyannekk (28. Mai 2011)

ja im router (o2 router) hab ich folgende einstellungen gewaehlt:
dienstname: userdefine ( hier konnte ich sonst noch www, http5, ftp, email, telnet voip(sip) etc  in verbindung mit einer server ip addresse auswählen)
bei userdefine konnte ich dann folgendess eingeben:
aktiv [x]
dienstname: chat
start-port: 9999
end-port: 9999
serveripaddresse: "hier hab ich die lokale ip addresse des rechners auf dem das serverprogramm
läuft eingegeben" die addresse hab ich dem lan adapter (win 7) entnommen. sie stand aber auch im router. hat die form 192.168.1.30


----------



## masder (30. Mai 2011)

Hi yyannekk

Ich habe das gerade mal getestet und bei mir hat es nicht funktioniert

zeig uns doch mal den Quellcode


----------



## yyannekk (30. Mai 2011)

ok danke schonmal das du dir die zeit genommen hast um es auszuprobieren.
ich hab das ganze problem jetzt ma runtergebrochen auf ein sehr kleines programm mit dem man nur die verbindung testen kann
es gibt 2 klassen, client und server. es wird ne verbindung aufgebaut und 2 sätze gesendet fertig. es kann auch nur ein client eine verbindung aufbauen, auf threads etc wird also verzichtet

der folgende code ist komplett kompilierbar, ich hängs aber auch nochma ran...
ich denke der code ist relativ leserlich und ohne kommentare leicht zu verstehen

das programm funktioniert bei mir im lan, über internet  bekomme ichs nicht hin
das programm nutzt* port 4321*


```
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Client
{
	static JFrame    fenster = new JFrame("Client");
	static JTextArea inhalt  = new JTextArea();
	static JTextField eingabe = new JTextField();
	static JButton connect = new JButton("connect");
	static JFrame ipFenster = new JFrame("Bitte geben sie die Addresse des Servers ein");
	
	static DataInputStream  din;
	static DataOutputStream dout;
	static String host = null;

	public static void main( String... args )
	{
		new Client();
	}
	
	public Client()
	{
		setupGUI();
	}
	
	private void setupGUI()
	{
		fenster.add(inhalt);
		fenster.setSize(600, 300);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		connect.addActionListener(new ActionListener()
		{

			@Override
            public void actionPerformed( ActionEvent arg )
			{
				ipFenster.setVisible(false);
				host = eingabe.getText();
				connect();
            }
			
		});
		Container pane = ipFenster.getContentPane();
		pane.setLayout(new BoxLayout(pane,BoxLayout.X_AXIS));
		pane.add(eingabe);
		pane.add(connect);
		ipFenster.setSize(300,70);
		ipFenster.setVisible(true);		
	}
	
	private void connect()
	{
		boolean error = false;
		Socket socket = null;
		try
		{
			socket = new Socket(host, 4321);
			din = new DataInputStream(socket.getInputStream());
			dout = new DataOutputStream(socket.getOutputStream());
		}
		catch (Exception e)
		{
			error = true;
			print("Fehler beim verbindungsaufbau: " + e);
		}
		if (!error)
		{
			print("Verbindung erfolgreich aufgebaut. Socket: " + socket);
			
			sende("knock knock");
			
			print(empfangeDaten());

			try
            {
	            din.close();
	            dout.close();
            }
            catch (IOException e)
            {
	            print("Fehler: " + e);
            }
            
            print("Uebertragung erfolgreich");
		}
	}

	private static void sende( String message )
	{
		print("sende " + message);
		try
        {
	        dout.writeUTF(message);
        }
        catch (Exception e)
        {
        	print("Fehler. konnte " + message + " nicht senden: " + e);
        }
	}
	
	private static String empfangeDaten()
	{
		try
        {
			din.toString();
	        return "empfange " + din.readUTF();
        }
        catch (IOException e)
        {
        	print("Fehler: " + e);
        }
        return "";
	}

	private static void print( String text )
	{
		inhalt.append("\n" + text);
	}
}
```


```
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Server
{
	static JFrame           fenster = new JFrame("Server");
	static JTextArea        inhalt  = new JTextArea();
	static DataInputStream  din;
	static DataOutputStream dout;
	static Socket clientSocket = null;

	public static void main( String... args )
	{
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setLocation(600, 0);
		fenster.add(inhalt);
		fenster.setSize(700, 300);
		fenster.setVisible(true);

		ServerSocket serverSocket = null;
		boolean error = false;
		try
		{
			serverSocket = new ServerSocket(4321);

		}
		catch (Exception e)
		{
			print("Erstellen des Servers fehlgeschlagen: " + e);
			error = true;
		}
		if (!error)
		{
			print("Erstellen des Servers erfolgreich. " + serverSocket);
			try
			{
				print("Warte auf Verbindung");
				clientSocket = serverSocket.accept();

				din = new DataInputStream(clientSocket.getInputStream());
				dout = new DataOutputStream(clientSocket.getOutputStream());

				print("Neu eingehende Verbindung. " + clientSocket);

				print(empfangeDaten());

				sende("whos there?");

				din.close();
				dout.close();
				
				print("Uebertragung erfolgreich");

			}
			catch (Exception e)
			{
				print("Fehler: " + e);
			}
		}
	}

	private static void sende( String text )
	{
		print("sende " + text);
		try
		{
			dout.writeUTF(text);
		}
		catch (Exception e)
		{
			print("Fehler. Kontte " + text + " nicht senden: " + e);
		}
	}

	private static String empfangeDaten()
	{
		try
		{
			return "empfange " + din.readUTF() + " von socket " + clientSocket;
		}
		catch (Exception e)
		{
			print("Fehler: " + e);
		}
		return "";
	}

	private static void print( String text )
	{
		inhalt.append("\n " + text);
	}

}
```


----------



## masder (30. Mai 2011)

also es gib noch eine andere möglichkeit um eine verbindung auf zu bauen 

für den server

```
serverport= new ServerSocket();
			   serverport.bind(new InetSocketAddress ("Port"));
```
für client 

```
Server = new InetSocketAddress ("IP", "Port");
				client = new Socket();
				client.connect(Server, 100); // hir kannst du noch die milisecunden einstellen wie lang er auf verbindung wartet
```

so habe ich das bei meinem chatt gemacht und bei mir geht ers über das internt

Gruß masder


----------



## yyannekk (1. Jun 2011)

ich hab dein beispielcode ausprobiert, leider ohne erfolg.
es funktioniert mit deinem code weiterhin im lan, nicht aber im internet.

kannst du mir evtl dein prog schicken? dann kann ich da ma ausprobieren ob ichs über internet zum laufen krieg?


----------



## masder (2. Jun 2011)

Hi yyannekk

ich habe mir noch mal deinen Code an gesehen und da einen Fehler gefunden danach habe ich ihn getestet und es funktionierte auch übers Internet
dann nach habe ich deinen Chat noch mal getestet und der geht doch übers Internet war ein kleiner Tipp Fehler meiner Seitz sorry 

also liegt der Fehler an der Port weiterleitung 


Gruß masder


----------



## yyannekk (2. Jun 2011)

ok vielen vielen dank dass dus nochma getestet hast!
endlich weiß ich mit sicherheit wo das problem liegt!
hab jetzt auch rausgefunden das relativ viele leute probleme mit der port weiterleitung meines routers (son zyxel von o2 surf and phone) haben. scheint nicht ganz so einfach zu sein wie man denkt/ wie man es von anderen routern gewohnt ist


----------

