Socket Abhören eines Sockets/Ports in extra Thread

userSeb

Mitglied
Hallo,
ich versuche mich gerade an der Kommunikation zwischen einem VB-Programm und einem Java-Programm (siehe auch meine anderen Forumsbeträge).

Realisiert wird dies über eine Socket-Verbindung (VB als Server, Java als Client). Senden funktioniert wie gewünscht. Den Abhörvorgang wollte ich in einen extra Thread auslagern.

Java:
listeningThread = new Thread() {
            public void run () {
            	try {
      			  InputStream in = socket.getInputStream();
      			  InputStreamReader isr = new InputStreamReader(in);
      			  BufferedReader br = new BufferedReader(isr);
      			  int i;
	      			 while(true){
		      			 while ((i = br.read()) != -1) {
		      			   System.out.print((char) i);
		      			 }
		      			 System.out.println("end");
		      		}
            	}
      			catch (IOException ex) {
      			}
            }
            	
       };
       listeningThread.start();

Dabei sind mir aber noch etwas unklar. Warum erreiche ich nie das "end". Ich bekomme immer nur den String auf die Konsole, den ich auch sende. Und, bei genauerer Betrachtung hätte ich auch erwartet, dass unabhängig davon, ob

Java:
i != -1

immerzu auf der Konsole "end" ausgegeben wird (wegen der Endlosschleife). Wo ist mein Denkfehler?

Über Anregungen wäre ich sehr dankbar.

viele Grüße
 
eine Endlosschleife bedeutet doch gerade dass der Befehl danach NICHT ausgeführt wird,
System.out.println("end");
steht nicht in der Schleife?

ohne sinnvolle Begründung klingt deine Frage wie:
'ich fahre auf dem Nürburgring immer im Kreis, ich hätte jetzt erwartet in New York anzukommen, wieso nicht, wo ist mein Denkfehler?'
 
ah, OK. ich verlasse die innere while-Schliefe nie. Das habe ich übersehen. Sorry dann wars tatsächlich ne dumme Frage.
Hast du eine Empfehlung für eine Abbruchbedingung, wenn ein Datenpaket vollständig gesendet wurde (ich schicke Strings)? Ich will die Strings als Attribut an der Stelle wo jetzt ein einfaches "end" ausgegeben wird, an eine Methode übergeben und dannach wieder auf neuen Empfang warten.
 
lies eine ganze Zeile auf einmal ein (auf Zeilenumbruch \n achten beim Senden!) oder lies ein großes char[] auf einmal ein,
damit jede Nachricht in nur einem Lesevorgang ankommt, was für einfache Fälle klappen sollte,
dann kannst du direkt in die Schleife den Verarbeitungsbefehl schreiben

Alternativen:
- komplett eigenes Protokoll, am Ende einer Nachricht, evtl. auch am Beginn bestimmte Kontrollinformationen wie XML-Tags
<nachricht>...</nachricht>
- zeitliche Bearbeitung: wenn nach x ms nix mehr kommt dann ist wohl ein zusammenhängender Block gefunden,
entweder auf das read() einen Timeout, falls möglich, sonst mit zwei separaten Threads bearbeiten,
einer hängt im read(), der andere prüft die Zeit seit der letzten Übergabe eines gelesenen Zeichens, hat alles bisherige gesammelt
 
Zuletzt bearbeitet von einem Moderator:
Hab mich für die erste Alternative entschieden...

Java:
while(true){
  while (((i = br.read()) != -1) & !(String.valueOf((char)i).equals("#"))) {
    //System.out.print((char) i);
    sb.append((char) i); //StringBuffer
  }
  JOptionPane.showMessageDialog(null,sb,"Message from VB", JOptionPane.INFORMATION_MESSAGE);
  sb = sb.delete(0, sb.length());
}

danke nochmal!
 

Zurück
Oben