Client sendet nur, wenn das Socket geschlossen wird

mathiasj

Bekanntes Mitglied
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:

Java:
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:

Java:
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

Top Contributor
[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.
 
Zuletzt bearbeitet:

mathiasj

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
Nicht umschreiben, überschreiben:

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

mathiasj

Bekanntes Mitglied
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
Java:
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:
Java:
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

Top Contributor
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:

Java:
// Server
InputStream in = clientSocket.getInputStream();
int k;
while ((k = in.available()) != -1)
    System.out.print((char) in.read());
Java:
// client
Socket serverSocket = new Socket(hostname, port);
OutputStream out = serverSocket.getOutputStream();
out.write("Hello World!".getBytes());

Ausgabe an der Server-Seite:
Code:
Hello World!
 
Zuletzt bearbeitet:

mathiasj

Bekanntes Mitglied
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:

Java:
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

Java:
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

Top Contributor
Das ist allerdings sehr komisch, ja ...

Versuch mal anstadt
Java:
                int k;
                while ((k = is.available()) != -1)
                    System.out.print((char) is.read());
das
Java:
                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:
Java:
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:
Code:
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

Bekanntes Mitglied
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

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

Java:
    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
Java:
    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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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:

Java:
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:

Java:
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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
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

Bekanntes Mitglied
Wird denn wenn du auf deinem Handy

Java:
            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

Bekanntes Mitglied
Wird denn wenn du auf deinem Handy

Java:
            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?

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
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Bekanntes Mitglied
Hm...echt seltsam.

Meine letzte mögliche Änderung wäre,
wenn du es mit
Java:
            Socket socket = new Socket();
            socket.connect(InetSocketAddress.createUnresolved("deineIP", 5000), 0);
versuchst.
Vill macht das einen Unterschied.
 

mathiasj

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

Viele Grüße,
mathiasj
 

mathiasj

Bekanntes Mitglied
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

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

Java:
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

Java:
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
 

mathiasj

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

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

mathiasj

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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
 

Anhänge

  • xampp.png
    xampp.png
    32,7 KB · Aufrufe: 19

Tobse

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
das-mo Client/Server sendet nicht Netzwerkprogrammierung 7
V Client Server Problem, empängt oder sendet nichts Netzwerkprogrammierung 4
S Client sendet - Server leitet weiter Netzwerkprogrammierung 4
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
B TCP Client Android Netzwerkprogrammierung 3
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
OnDemand Ist Client noch angemeldet? Netzwerkprogrammierung 7
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
J Client Server - Serialisierung Netzwerkprogrammierung 8

Ähnliche Java Themen

Neue Themen


Oben