Socket bricht bei Verbindungstrennung nicht ab zu lesen

Blue Effect

Mitglied
Guten Morgen Sportsfreunde,

ich habe einen Socket, der ständig Daten empfängt und sendet - klappt wunderbar.

Wenn ich aufgrund Verbindungsprobleme des Servers keine Antwort erhalte, möchte ich bestimmte Dinge der GUI blockieren. Bei mir lokal bleibt er aber nur im Stack bei socketRead() anstatt irgendwann dann mal eine Exception auszulösen. Das daraus ergebene nächste Problem ist, dass ich bei Verbindungs-Wiederaufbau dennoch keine Daten mehr erhalte. IOException fange ich ab, wird aber in dem Fall nicht ausgelöst.
Ist das normal? Kann ich eine Zeit angeben, die maximal für das Lesen einer Zeile gebraucht wird? Der Server, mit dem ich mich verbinde, sendet alle 10 Sekunden zur Sicherheit eine Antwort.
Im Notfall wollte ich im anderen Thread den letzten Stamp abgleichen, ist aber sicherlich nicht sauber, weil er im Socketleser-Aufruf-Thread ja trotzdem ganze Zeit im Stack hängt.

Java:
	      socket = socketFactory.createSocket(host, port);
	      out = new PrintWriter(socket.getOutputStream(), true);
	      in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

	      String msg = in.readLine();
	      String komplettesXML="";
	      while (msg != null) {
		    System.out.println(msg);
	    	if(msg.equals("")==true) 
	    	{
	    		setRadarnachricht(komplettesXML);
	    		komplettesXML="";
	    	} else komplettesXML+=msg;
	        buf.append(msg);
	        msg = in.readLine();
	        if(laeuft==false)
	        {
	        	break;
	        }
	      }

Danke im Voraus für jeden Tipp :)
 

Anhänge

  • socketread.jpg
    socketread.jpg
    178,3 KB · Aufrufe: 13
Deine read-Methode sieht echt irgendwie komisch aus.
Sowas sollte man erstens in einem eigenen Thread machen und zweitens etwas logischer strukturieren
Java:
//package und imports
class ReaderClass extends Thread
{
	private BufferdReader in;
	private MainClass main;
	protected ReaderClass(MainClass main, BufferedReader in)
	{
		this.main=main;
		this.in=in;
	}
	public void run()
	{
		String line="";
		try
		{
			while((line=in.readLine())!=null)
			{
				//process line
			}
		}
		catch(Exception e) { main.raiseException(e); }
	}
}

Was das Timeout angeht : einen zweiten Thread starten der mit dem ersten kommunizieren kann und jedes mal wenn eine Nachricht empfangen wird einen Counter wieder auf 0 setzen. Wenn eine gewisse Zeit nichts empfangen wurde den ersten Thread einfach killen.
 
was die Struktur des Quellcodes angeht muss ich Spikee recht geben. Aber das mit dem Timeout geht noch viel sauberer. Es gibt in der Klasse Socket extra eine Methode setSoTimeout(int timeout), die genau das macht was du willst. Wenn der Timeout abläuft wird eine SocketException geworfen die du dann abfangen kannst. Den Socket kannst du nachher normal weiterverwenden als wäre nichts gewesen.
 
Hehe danke Technoblade,
das wusste ich auch noch nicht. Kann ich gut in meinem Projekt brauchen =)
 
Zurück