Socket schließen klappt nicht....

nautiLus`

Erfahrenes Mitglied
hallo, ich habe aus einemSocket Tutorial in Java von hier
http://java.sun.com/docs/books/tutorial/networking/sockets/readingWriting.html
den Code etwas modifiziert. Auf das Wesentliche halt....

Code:
import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) throws IOException {

        Socket echoSocket = null;

        try {
            echoSocket = new Socket("www.dslab.tuwien.ac.at", 10000);
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        }

		System.out.println(echoSocket.isConnected());
		System.out.println(echoSocket.isClosed());
		echoSocket.close();
		System.out.println(echoSocket.isConnected());
		System.out.println(echoSocket.isClosed());
    }
}

Mit der oben angegebenen Server URL kann man das Programm testen. Also nur kompilieren und ausführen.

Ich bekomme dann folgende Ausgabe:

true
false
true
true

Sollte das aber nicht anders aussehen nach dem Schließen des Sockets oder habe ich einen Befehl vergessen?

So sollte es sein:

true
false
false
true

Danke für Hilfe.

//edit: ein sleep hilft anscheinend auch nicht....
 
Zuletzt bearbeitet:
Hi, danke für die Hilfe, aber sowas ist doch nicht logisch oder?
Wie prüf ich dann, ob eine Verbindung steht oder nicht?
 
Genau das Problem hatte ich neulich auch ;) Ich hab das so gelöst, dass ich einfach immer ein "Dummy" Byte schreibe.. (Wenn das mit deinem Programm mgl. ist..) Wenn die Verbindung nicht mehr steht, schmeißt der ne Exception.. Nen anderen Weg hab ich nicht gefunden..
 
Hallo,
mir ist klar, dass der Thread hier schon lange veraltet ist. Trotzdem betrifft mich dieses Problem gerade, und darum krame ich ihn nochmal hervor.

Normalerweise erkenne ich die Unterbrechung der Verbindung daran, dass InputStream.readLine() null zurückliefert. Wenn die Verbindung allerdings unsauber geschlossen wird (.. Client-Abstürze .. ), scheint dies nicht so zu sein.
Wie kann ich in solchen Fallen trotzdem erkennen, dass keine Vebindung mehr besteht?

Fälschlicherweise habe ich dies nämlich auch mit der Abfrage "isConnected" versucht.
Die von javaprogger1987 vorgeschlagene Möglichkeit möchte ich eigentlich nicht verfolgen, da ich vorhabe in ziemlich kurzen Intervallen die Verbindung zu überprüfen. Dabei dann jedesmal ein Dummy zu versenden halte ich nicht für so elegant.
Gibt es da bessere Möglichkeiten?
Vielen Dank,
Blandorin
 
Hallo!

Also wenn ich ein minimales Client/Server Socket Beispiel mache und bei beiden über einen Bufferedreader/BufferedWriter Nachrichten hin und her sende und der Server in BufferedReader.readLine() wartet und ich den Client beende bekomme ich auf dem Server diese Exception innerhalb von 1-2 Sekunden:
Java:
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
    at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at de.tutorials.Server.run(Server.java:58)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
    at java.lang.Thread.run(Thread.java:595)

Gruß Tom
 
Zurück