Socket Closed Exception verhindern

H0m3r

Neues Mitglied
Ich zeig euch erstmal kurz mein Programm und darauf folgt dann die Problembeschreibung.

Client.java
Java:
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client extends Thread {
	private Socket socket;
	private InputStream in;
	private OutputStream out;

	public Client(Socket socket) {
		this.socket = socket;
	}

	public void run() {
		try {
			in = socket.getInputStream();
			out = socket.getOutputStream();

			while (true) {
				int len = in.read();

				if (len == -1) {
					break;
				}

				len = (len << 8) + (in.read() & 0xFF);
				byte[] buffer = new byte[len];
				in.read(buffer, 0, len);
				[...]
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			disconnect();
		}
	}

	public void disconnect() {
		if (socket != null && !socket.isClosed()) {
			try {
				out.close();
				in.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Jetzt hab ich folgendes Problem: Möchte ich den Client disconnecten, rufe ich die Methode disconnect auf. Hierbei kommt es immer zu einer Exception, da in Zeile 21 zu diesem Zeitpunkt versucht wird vom Stream zu lesen. Gibt es eine Möglichkeit diese Exception zu verhindern?
 
Zuletzt bearbeitet von einem Moderator:
nicht wirklich, außer du setzt einen Timeout und wartest mit dem Schließen auf eine Gelegenheit zwischen zwei read()-Aufrufen,
aber das ist unnötig,
sieh die Exception nicht als etwas schlimmes an sondern zunächst mal als eine Information,
wenn du dann noch vor dem close()-Aufruf irgendeinen boolean auf true gesetzt hast kannst du das im catch berücksichtigen und auf das ansonsten nötige Loggen der Exception verzichten,
 
Zuletzt bearbeitet von einem Moderator:
Man könnte das zwar mit einem sauberen "Client verabschiedet sich beim Server und Server verabschiedet sich beim Client" vermeiden, ist aber m.M. den Aufwand nicht wert.
 

Zurück
Oben