# Client sendet nur, wenn das Socket geschlossen wird



## mathiasj (7. Dez 2013)

Hallo,
ich schreibe gerade an einer kleinen Android App, bei der ich mich auch mit meinem Server verbinde... Aber da das irgendwie nicht funktioniert hat, habe ich eine Beispiel App geschrieben, die einfach eine einzelen Nachricht an den Server sendet.


Hier ist der Server: 


```
public class Server {

public static void main(String[] args) {
    new Server().go();
}

public void go() {
    try {
        @SuppressWarnings("resource")
        ServerSocket serverSocket = new ServerSocket(5000);
        while(true) {
            Socket clientSocket = serverSocket.accept();
            Thread t = new Thread(new ClientHandler(clientSocket));
            t.start();
            System.out.println("Connection");
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
}

public class ClientHandler implements Runnable {
    private BufferedReader br;
    private Socket socket;
    private BufferedWriter bw;

    public ClientHandler(Socket clientSocket) {
        try {
            socket = clientSocket;
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            String nachricht;
            while((nachricht = br.readLine()) != null) { 
                System.out.println("Nachricht:" +  nachricht);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
```

Und der Client:


```
public class MainActivity extends Activity {

private Socket s;

@Override
protected void onCreate(Bundle savedInstanceState) {  //Wird beim Start der App aufgerufen
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Thread(new OpenConnection()).start();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {  //Das muss man nicht beachten
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public class OpenConnection implements Runnable {
    public void run() {
        try {
            s = new Socket("letorat.selfhost.bz", 5000);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            writer.write("hello");
            writer.flush();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
```

Wenn ich den Server, und danach die App starte, dann printet der Server erst einmal "Connection". Das heißt ja eigentlich, dass ich eine Verbindung habe. Aber der Server empfängt die Nachricht "Hallo" einfach nicht! Es wird auch keine Exception oder so geworfen... Wenn ich jetzt das Socket (also Client-Side) schließe, oder die Methode shutdownOutput() aufrufe, wird die Nachricht gesendet! Ich will mein Socket aber natürlich für mehr als nur eine Nachricht benutzen... Was macht denn ein shutdownOutput() anders, als ein flush()...?


----------



## Tobse (7. Dez 2013)

[JAPI]OutputStream#flush()[/JAPI] auf dem Stream von [JAPI]Socket#getOutputStream()[/JAPI] fürs senden aufrufen. Die (Buffered)Writer nehmen das mit dem flush() nicht so genau, das ist zeimlich kacke implementiert.


----------



## mathiasj (7. Dez 2013)

Hat leider auch nicht funktioniert... Ich habe auch versucht vor dem flushen noch BufferedWriter.newLine() aufzurufen, hat aber auch nichts gebracht...

Viele Grüße,
mathiasj


----------



## Tobse (7. Dez 2013)

Nein, ich meinte: Du musst die Daten auch dem OutputStream des Sockets mitgeben. Der BufferedWriter (oder der OutputStreamWriter) behält trotz flush() die Daten für sich, dann werden sie auch nicht gesendet.

Du hast also diese möglichkeiten:
1. Direkt auf den OutputStream schreiben (ergo hast du keine bequemen funktionen wie readLine etc)
2. Die flush()-Methode von OutputStreamWriter und BufferedOutputStream überschreiben, dass sie die Daten tatsächlich sendet.


----------



## mathiasj (7. Dez 2013)

OKay, das mit direkt auf dem OutputStream schreiben, werde ich später mal versuchen... Aber wie könnte ich denn flush() umschreiben? Und warum wurde dieser Bug noch nicht behoben?

LG, mathiasj


----------



## Tobse (7. Dez 2013)

Nicht umschreiben, *über*schreiben:


```
class MyBufferedWriter extends BufferedWriter
{
    public void flush() throws IOException
    {
        // ...
    }
}
```
Den Original-Quellcode dazu findest du in der Java-Doku, gidf.


----------



## mathiasj (7. Dez 2013)

Ja, aber das scheint ja dann ziemlich kompliiziert zu werden, die Methode zu überschreiben...

Und auch mit dem normalen OutputStream funktioniert es erst, wenn das Socket geschlossen wird:

Server

```
public void run() {
			try {
				char[] msg = new char[100];
				while((is.read(msg)) != -1) { 
					for(int i = 0; i < msg.length; i++) {
						System.out.println(msg[i]);
					}
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
```

Client: 

```
public void run() {
			try {
				s = new Socket("letorat.selfhost.bz", 5000);
				OutputStreamWriter out = new OutputStreamWriter(s.getOutputStream());
				out.write("hello\n");
				out.flush();
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
```


----------



## Tobse (7. Dez 2013)

mathiasj hat gesagt.:


> Ja, aber das scheint ja dann ziemlich kompliiziert zu werden, die Methode zu überschreiben...
> 
> Und auch mit dem normalen OutputStream funktioniert es erst, wenn das Socket geschlossen wird:



Nein. Du benutzt schon wieder einen Writer. Dashier wird mit 100%iger sicherheit klappen:


```
// Server
InputStream in = clientSocket.getInputStream();
int k;
while ((k = in.available()) != -1)
    System.out.print((char) in.read());
```


```
// client
Socket serverSocket = new Socket(hostname, port);
OutputStream out = serverSocket.getOutputStream();
out.write("Hello World!".getBytes());
```

Ausgabe an der Server-Seite:

```
Hello World!
```


----------



## mathiasj (7. Dez 2013)

Also, wenn ich das genauso übernehme, passiert gar nichts. Wenn ich ein out.flush() hinzufüge, passiert auch nichts. Füge ich anstatt out.flush() ein socket.close() hinzu, wird mir zwei mal "Hello world" ausgegeben. Außerdem hatte ich in einigen Fällen, die ich jetzt nicht reproduzieren kann plötzlich lauter Fragezeichen, die ausgegebn wurden usw. Wirklich komisch...

Zur Sicherheit nochmal mein jetziger Code:


```
public class MainActivity extends Activity {
	
	private Socket s;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		new Thread(new OpenConnection()).start();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	public class OpenConnection implements Runnable {
		public void run() {
			try {
				s = new Socket("letorat.selfhost.bz", 5000);
				OutputStream out = s.getOutputStream();
				out.write("Hello World!".getBytes());
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
```

und


```
public class Server {
	
	public static void main(String[] args) {
		new Server().go();
	}
	
	public void go() {
		try {
			@SuppressWarnings("resource")
			ServerSocket serverSocket = new ServerSocket(5000);
			while(true) {
				Socket clientSocket = serverSocket.accept();
				Thread t = new Thread(new ClientHandler(clientSocket));
				t.start();
				System.out.println("Connection");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public class ClientHandler implements Runnable {
		private BufferedReader br;
		private Socket socket;
		private InputStream is;
		
		public ClientHandler(Socket clientSocket) {
			try {
				socket = clientSocket;
				is = socket.getInputStream();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		public void run() {
			try {
				int k;
				while ((k = is.available()) != -1)
				    System.out.print((char) is.read());
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}
```

Viele Grüße,
mathiasj


----------



## Tobse (8. Dez 2013)

Das ist allerdings sehr komisch, ja ...

Versuch mal anstadt

```
int k;
                while ((k = is.available()) != -1)
                    System.out.print((char) is.read());
```
das

```
int k;
                while ((k = is.read()) != -1)
                    System.out.print((char) k);
```

Also ich habe jetzt gerade diesen Code bei mir getestet und der lief mit [c]k = in.read()[/c] einwandfrei:

```
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Tester {
    public static void main(String... args) throws Exception
    {
        new Thread(new Runnable()
        {
            public void run()
            {
                try {
                    ServerSocket ss = new ServerSocket(5600);
                    Socket a = ss.accept();
                    InputStream in = a.getInputStream();
                    int k;
                    while((k = in.read()) != -1)
                        System.out.print((char) k);
                    ss.close();
                }
                catch (Exception ex)
                {
                    System.out.println(ex);
                }           
            }
        }).start();
        // warten, damit das ServerSocket auch offen ist
        Thread.sleep(100);
        Socket s = new Socket("localhost", 5600);
        OutputStream out = s.getOutputStream();
        out.write("Hello World!".getBytes());
        // sicherstellen, dass die JVM den Stream nicht gleich flusht
        Thread.sleep(3000);
        System.out.println("\nFinished");
        System.exit(-1);
    }
}
```
Und die Ausgabe war wie erwartet:

```
Hello World!
Finished
```
Und das [c]Finished[/c] kam auch 3 Sekunden nach dem [c]Hello World[/c], d.h. [c]flush()[/c] oder [c]close()[/c] haben keinen Einfluss gehabt.

Teste das mal bei dir. Wenn du auf einem deiner beiden Geräte die Ausgabe nicht kriegst, ist etwas mit dem OS falsch (Ist ja anscheinend ne Android-App). Wenn das glatt geht, aber *exakt dieser code* nicht ziwschen den Geräten funktioniert ist irgendwas mit deiner Internet/LAN-Verbindung futsch.


----------



## mathiasj (8. Dez 2013)

Okay, langsam kommen wir der Sache näher... Das Beispiel funktioniert auf dem localhost, doch sobald ich meine IP Addresse oder meine DynDNS Addresse eingebe, funktioniert das ganze nicht mehr (Da ich bei meinem Android Gerät natürlich nie localhost eingeben konnte, war mir das nicht klar). ABER ich kann ja eine Verbindung zum ServerSocket aufbauen ("Connection" wird geprintet). Die Nachrichten werden aber nicht empfangen (also erst wenn sich das Socket schließt). 
Meine Firewall auszuschalten hat nichts gebracht, Port-Forwarding ist auch aktiviert... Gibt es sonst anoch irgendwelche Ideen, woran es liegen könnte, das ich eine Verbindung aufbauen kann, aber keine Nachrichten senden kann?

Vielen Dank schonmal, du hast mir sehr geholfen 

Viele Grüße,
mathiasj


----------



## Tobse (8. Dez 2013)

Also sehe ich das richtig, du hast diesen code auf Android ausgeführt:


```
import java.io.OutputStream;
    import java.net.Socket;
     
     
    public class Tester {
        public static void main(String... args) throws Exception
        {
            String serverHostname = "...";
            Socket s = new Socket(serverHostname, 5600);
            OutputStream out = s.getOutputStream();
            out.write("Hello World!".getBytes());
            // sicherstellen, dass die JVM den Stream nicht gleich flusht
            Thread.sleep(5000);
            System.out.println("\nFinished");
            System.exit(-1);
        }
    }
```
Und den auf dem Server

```
import java.io.InputStream;
    import java.net.ServerSocket;
     
    public class Tester {
        public static void main(String... args) throws Exception
        {
                    try {
                        ServerSocket ss = new ServerSocket(5600);
                        Socket a = ss.accept();
                        InputStream in = a.getInputStream();
                        int k;
                        while((k = in.read()) != -1)
                            System.out.print((char) k);
                        ss.close();
                    }
                    catch (Exception ex)
                    {
                        System.out.println(ex);
                    }          
        }
    }
```

Und da kam absolut keine Ausgabe, bevor das Socket nicht geschlossen war? Wenn ja, dann liegt es höchstwahrscheinlich irgendwie an Android, aber da bin ich dann mit meinem Latein am Ende, sorry :/


----------



## mathiasj (8. Dez 2013)

Ja, dann kommt keine Ausgabe. Aber es kommt auch keine Ausgabe, wenn ich den Code an meinem PC ausführe und anstatt "localhost" mein IP-Addresse eingebe... Wie gesagt, "Connection" wird geprintet aber die Nachricht kann ich einfach nicht senden.

Viele Grüße,
mathiasj


----------



## Tobse (8. Dez 2013)

Okay, und was ist, wenn du das Android-Gerät auf deinen PC verbinden lässt? Wenn das klappt wäre ich mir ziemlich sicher, dass beim Server irgendwas schief läuft; dass der Code funktionieren sollte ist ja inzwischen eindeutig.


----------



## mathiasj (8. Dez 2013)

Ich glaub hier liegt irgendwie ein leichtes Missverständnis vor:
Ich will den Server auf meinem PC laufen lassen und den Client auf meinem Android Gerät. Wenn ich den Client mit localhost auf dem PC laufen lasse, klappt alles. Auf meinem Gerät kann ich natürlich kein localhost laufen lassen, da er dann nach einem Server auf dem Gerät selbst suchen würde. 
Deshalb muss ich bei dem Client die IP meines Rechners eingeben. Egal ob ich den Code mit der IP des Servers auf meinem Rechner oder auf dem Android Gerät laufen lasse, es passiert dasselbe: Der Server zeigt mir an, dass ich eine Verbindung habe, aber ich kann keine Nachrichten austauschen.

Das heißt wenn ich diesen Server starte:


```
import java.io.BufferedReader;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	
	public static void main(String[] args) {
		new Server().go();
	}
	
	public void go() {
		try {
			@SuppressWarnings("resource")
			ServerSocket serverSocket = new ServerSocket(5000);
			while(true) {
				Socket clientSocket = serverSocket.accept();
				Thread t = new Thread(new ClientHandler(clientSocket));
				t.start();
				System.out.println("Connection");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public class ClientHandler implements Runnable {
		private BufferedReader br;
		private Socket socket;
		private InputStream is;
		
		public ClientHandler(Socket clientSocket) {
			try {
				socket = clientSocket;
				is = socket.getInputStream();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		public void run() {
			try {
				int k;
				while ((k = is.read()) != -1)
				    System.out.print((char) k);
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}
```

Und dann (egal ob auf Android oder auf der selben Maschine) diesen Code ausführe:


```
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	
	public static void main(String[] args) {
		new Client().connect();
	}
	
	public void connect() {
		try {
			Thread.sleep(100);
			Socket socket = new Socket("Meine Ip Addresse", 5000);
			OutputStream out = socket.getOutputStream();
			out.write("Hello World!".getBytes());
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```

Dann zeigt mir der Server Connection an, aber die Nachricht wird erst geschickt, wenn ich das Socket schließe.

Viele Grüße,
mathiasj


----------



## Tobse (8. Dez 2013)

Achso okey, ich dachte du hättest da einen root-server/cloud-server.

Welche JVM und welches OS hast du? Das ist jetzt das lezte, was mir noch einfällt, woran es liegen könnte


----------



## mathiasj (8. Dez 2013)

Ich benutze Windows 7 Home Premium 64-Bit und die jdk 1.7.0_45 (also auch zum kompilieren). Bei der jdk benutze ich die 32 Bit Version, aber auch die 64 Bit Version zu benutzen hat nichts geändert.


----------



## Tobse (8. Dez 2013)

Das ist sehhhr strange, ich habe hier das gleiche und kann mit Java zwischen dem PC mit Win7-64bit und dem Laptop Ubuntu-64bit (beide auf JDK 1.7u45) wunderbar alles hin und her senden, was ich mag... ich weiss leider nichtmehr weiter, sorry :/


----------



## mathiasj (9. Dez 2013)

Kannst du das auch mit dem selben PC, wenn du deine IP Addresse angibst?

Viele Grüße,
mathiasj


----------



## Tobse (9. Dez 2013)

Nachdem das Port-Forwarding eingeschaltet war gings problemlos, ja.


----------



## mathiasj (9. Dez 2013)

Hmm sehr komisch, da ich ja eigentlich eine Verbindung habe... Ich bemerke grade, dass es auch funktioniert, wenn ich den Stream schließe (also zum Beispiel PrintWriter.close() aufrufe).

Könnte es sein, dass der Router vielleicht irgendwie die Verbindung, aber keine Kommunikation zulässt?

Viele Grüße,
mathiasj


----------



## Tobse (9. Dez 2013)

mathiasj hat gesagt.:


> Hmm sehr komisch, da ich ja eigentlich eine Verbindung habe... Ich bemerke grade, dass es auch funktioniert, wenn ich den Stream schließe (also zum Beispiel PrintWriter.close() aufrufe).
> 
> Könnte es sein, dass der Router vielleicht irgendwie die Verbindung, aber keine Kommunikation zulässt?
> 
> ...


Wie gesagt, die Writer nehmen das mit dem flush() und close() nicht so genau.

Dass der Router keine Kommunikation zulässt wäre eigentlich välliger Schwachfug weil die Verbindung dann ja nutzlos ist aber unmöglich ist es nicht.


----------



## anti-held (10. Dez 2013)

Wird denn wenn du auf deinem Handy


```
s = new Socket("letorat.selfhost.bz", 5000);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            writer.write("hello");
            writer.close();
```

ausführst, am Server das 'hello' angezeigt?


----------



## mathiasj (10. Dez 2013)

anti-held hat gesagt.:


> Wird denn wenn du auf deinem Handy
> 
> 
> ```
> ...



Ja, wenn ich diesen Code ausführe schon. Schreibe ich aber anstatt close() ein flush(), wird mir das Hallo nicht angezeigt. Auch ein newLine() und dann flush() bringt nichts.

Viele Grüße,
mathiasj


----------



## anti-held (10. Dez 2013)

Lass dir bitte mal am Android-Gerät ausgeben, ob eine Exception geworfen wird.
Das e.printStackTrace() wird da nämlich nichts bringen.
Verwende stattdessen [c]Toast.makeText(getApplicationContext(), e.getClass + ": " + e.getMessage(), Toast.LENGTH_LONG).show();[/c]


----------



## mathiasj (10. Dez 2013)

Nein, es wird keine geworfen (printStackTrace sieht man ja auch im LogCat, aber auch der Toast wird nicht angezeigt). Das Problem besteht ja auch, wenn ich auf meinem PC zu dem Server connecten möchte... Gebe ich localhost ein, klappt alles, gebe ich meine IP ein, muss ich den OutputStream schließen, damit die Daten gesendet werden können. Sehr komisch...

Viele Grüße,
mathiasj


----------



## anti-held (10. Dez 2013)

Hm...echt seltsam.

Meine letzte mögliche Änderung wäre,
wenn du es mit

```
Socket socket = new Socket();
            socket.connect(InetSocketAddress.createUnresolved("deineIP", 5000), 0);
```
versuchst.
Vill macht das einen Unterschied.


----------



## mathiasj (10. Dez 2013)

Das wirft mir immer eine UnknownHostException, egal ob ich meine IP, localhost, oder meine DynDNS eingebe...

Viele Grüße,
mathiasj


----------



## anti-held (10. Dez 2013)

Verwendest du wirklich die IP-Adresse oder einen Namen im Netzwerk?


----------



## mathiasj (10. Dez 2013)

Also egal, ob ich meinen Netzwerk Namen, meine IP Addresse (von wieistmeineip.de), den DynDNS Namen oder localhost verwende... Ich glaube der String wird überhaupt nicht überprüft; es kommt sofort zu der Exception... Sehr mysteriös 

Viele Grüße,
mathiasj


----------



## mathiasj (10. Dez 2013)

Langsam blick ich echt nicht mehr durch... Folgender Code funktioniert nicht (auch auf localhost):


```
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	
	public static void main(String[] args) {
		new Server().go();
	}
	
	public void go() {
		try {
			@SuppressWarnings("resource")
			ServerSocket serverSocket = new ServerSocket(5001);
			while(true) {
				Socket clientSocket = serverSocket.accept();
				Thread t = new Thread(new ClientHandler(clientSocket));
				t.start();
				System.out.println("Connection");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public class ClientHandler implements Runnable {
		private BufferedReader br;
		private Socket socket;
		private PrintWriter pw;
		
		public ClientHandler(Socket clientSocket) {
			try {
				socket = clientSocket;
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		public void run() {
			try {
				String msg;
				while ((msg = br.readLine()) != null) {
					System.out.println(msg);
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}
```

und 


```
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;

public class Client {
	
	public static void main(String[] args) {
		new Client().connect();
	}
	
	public void connect() {
		try {
			Thread.sleep(100);
		    Socket socket = new Socket("localhost", 5001);
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			writer.write("Hi");
			writer.flush();
			JFrame frame = new JFrame();
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setVisible(true);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```

Vielleicht liegt es auch daran, dass ich jjetzt nicht mehr konzentriert bin, aber was ist da denn los!?

Viele Grüße,
mathiasj


----------



## Tobse (10. Dez 2013)

der Writer schreibt keine neue Zeile, deswegen blockiert readLine() weiterhin.


----------



## anti-held (10. Dez 2013)

Verwende statt dem localhost doch mal 127.0.0.1
Vill befinden sich falsche Einträge in deiner hosts-Datei


----------



## mathiasj (11. Dez 2013)

Ah ja natürlich, ich hatte vergessen writer.newLine() aufzurufen. Vorher hatte ich mit meiner IP  Addresse kurz Probleme, aber da hat sich die Firewall dazwischen geschaltet (hat aber auch nichts zu meinem eigentlichen Porblem geholfen). Kann es evtl. sein, dass sich die Router Firewall zwischen die Nachrichten stellt? Aber dann würde sie ja keine Verbindung zulassen...
Es muss ja eigentlich irgendwie an meinen Verbindungseinstellungen liegen, da der Code ja mit dem localhost funktioniert... Aber was blockt nicht die Verbindung, aber die Nachrichten? (Bis der Stream geschlosesen wird)

Viele Grüße,
mathiasj


----------



## anti-held (11. Dez 2013)

Einen ähnlichen Fehler hatte ich mal auf meinem Raspi.
Es wurden die Daten erst gesendet, als die JVM terminierte.

Schau mal, ob die Daten nach dem [c]socket.close()[/c] sofort gesendet werden, auch wenn
der Thread noch läuft.
Mach hierzu ein [c]Thread.sleep(5000)[/c] nach dem [c]close()[/c] rein und schau, ob die Daten
erst nach den 5 sec gesendet werden.


----------



## mathiasj (11. Dez 2013)

Nein, die Daten werden nach dem Socket.close() sofort gesendet... Sehr komisch.

Viele Grüße,
mathiasj


----------



## anti-held (12. Dez 2013)

Sry...ich habe keine Lösung hierfür.


----------



## mathiasj (13. Dez 2013)

Könnte es vielleicht irgendwie am NAT Loopback oder so liegen? Es muss ja etwas mit dem Router zu tun haben, da localhost ja funktioniert... Ich habe den W921v von der Telekom. Vielleicht hilft das ja weiter. Aber ich habe es schonmal geschafft einen Server auf diesem Router zu kontaktieren...

Viele Grüße,
mathiasj


----------



## Tobse (13. Dez 2013)

Wie ist es denn mit anderen Anwendungen hinter dem Router? (z.B. Apache, MySQL, TeamSpeak ... )


----------



## mathiasj (13. Dez 2013)

Tobse hat gesagt.:


> Wie ist es denn mit anderen Anwendungen hinter dem Router? (z.B. Apache, MySQL, TeamSpeak ... )



Ich habe bisher nichts davon laufen...  Hmm, ich könnte ja mal probieren ob das hanze von außerhalb läuft...

Viele Grüße,
mathiasj


----------



## Tobse (13. Dez 2013)

Einfach XAMPP runterladen und anwerfen, Port-Forwarding einrichten und schauen ob du die Xampp-Seite von aussen erreichst.


----------



## mathiasj (13. Dez 2013)

Was soll ich denn mit XAMPP machen? Ich kenn mich damit nicht wirklich aus... Also javaw.exe wird mir als neues Socket angezeigt, wenn ich den Client starte.

Viele Grüße,
mathiasj


----------



## Tobse (14. Dez 2013)

XAMPP ist ein Entwicklungs-Webserver; da ist Apache 2, MySQL 5, PHP 5, Pearl etc drin. Wenn du's installiert hast einfach xampp_start.exe ausführen, Port 80 und 443 freigeben und im Webbrowser deine DynDNS eingeben.


----------



## mathiasj (14. Dez 2013)

Also beim Ausführen der xampp_start.exe bekomme ich eine Fehlermeldung (Bild im Anhang).
Muss ich bei der Eingabe der DynDNS Addresse eigentlich ein Protokoll angeben?

Ach ja, das Porgramm funktioniert, wenn ich die Netzwerk IP des Rechners angebe.

Viele Grüße,
mathiasj


----------



## Tobse (14. Dez 2013)

Das liegt daran, dass ein anderes Programm deinen Port 80 schon benutzt, das ist meistens Skype (lässt sich in den Einstellungen abschalten).

Nein, das Protokoll ist HTTP, das macht der Browser automatisch.


----------



## mathiasj (14. Dez 2013)

Ah ja, Skype hat den Fehler verursacht. Aber ich bekomme dann keine Verbindung mit der DynDNS Addresse. Ich habe es aber schon richtig verstanden, dass ich Port 80 und 443 auf meinen PC forwarden muss?

Viele Grüße,
mathiasj


----------



## Tobse (14. Dez 2013)

Ja, das hast du.

Also, wenn XAMPP läuft, du per 127.0.0.1/localhost/Lokaler IP die XAMPP-Seite siehst (http://localhost/xampp/) aber mit port-forwarding mit deiner Öffentlichen IP / deiner DynDNS keine Verbindung bekommst, liegt das Problem 100% beim Router.


----------



## mathiasj (14. Dez 2013)

Wahrscheinlich kann ich dann in dem Netzwerk nur meine interne IP benutzen, denn ich habe es gerade mit einem Freund von außen geteset; dabei hat alles wunderbar geklappt.
Kann man den irgendwie einstellen, dass sich die interne IP, die dem Rechner gegeben wird sich nicht mehr ändert?

Viele Grüße,
mathiasj


----------



## Tobse (14. Dez 2013)

Kommt auf den Router an. Auf meiner FritzBox kann man einstellen, welche IP welches Gerät bekommt. Innerhalb eines netzwerks kannst du deinen PC aber auch per Computername ansprechen also z.B. http://meinPC/


----------



## mathiasj (14. Dez 2013)

Also das mit dem Computernamen funktioniert irgendwie nicht... Weder auf dem Android Gerät noch auf dem PC selbst. Ich gebe dann ein new Socket("http://Mathias-Server", 5001) und bekomme ein UnknownHostException.

Viele Grüße,
mathiasj


----------



## Tobse (14. Dez 2013)

mathiasj hat gesagt.:


> Also das mit dem Computernamen funktioniert irgendwie nicht... Weder auf dem Android Gerät noch auf dem PC selbst. Ich gebe dann ein new Socket("http://Mathias-Server", 5001) und bekomme ein UnknownHostException.
> 
> Viele Grüße,
> mathiasj


Naja, das kann auch mit deinem Router zusammenhängen. Abder de-fakto ist der XAMPP-Server bei port-forwarding nicht zu erreichen?


----------



## mathiasj (14. Dez 2013)

Nein XAMPP ist nicht zu erreichen. Aber ich habe es jetzt hingekriegt mit dem Computernamen in Java: Einfach das http weglassen! Vielen, vielen Dank!

Viele grüße,
mathiasj


----------



## Tobse (14. Dez 2013)

Dann ist dein Router kaputt (ode reben so eingestellt, dass man connecten kann aber keine Daten senden, was kaputt so ziemlich gleich kommt). Telekom halt...


----------



## mathiasj (14. Dez 2013)

Ja so siehts aus  Ich freu mich schon, wenn ich in solchen Dingen nicht mehr auf meine Eltern angewiesen bin...

Viele Grüße,
mathiasj


----------

