Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
951 views
in Technique[技术] by (71.8m points)

java - Detect Socket is closed after remote application is closed forcibly

I'm having some trouble with Java Sockets. I have a pair of applications that establish a connection between them (one opens a ServerSocket, calls accept() and waits, and the other connects via the Socket(InetAddress,int) constructor.

After the socket connection is established, a Thread is created with this Runnable.

 public void run() {    
    System.out.print("Watching Socket for closing ");
    while(running) {
        if(socket.isClosed()) {
            System.out.println("Socket has been closed");
            break;
        }
    }
    this.running = false;
    //safely ends this application by closing i/o and exiting.
}

My problem is that when one of the applications is closed unexpectedly (in my case terminated from Eclipse) calling Socket.isClosed() still shows the socket is open, and so the loop keeps running as if the Socket was open.

How can I detect when the Socket is closed when the Java application on the other side is forcibly ended?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The only way that socket.isClosed() return true is if you call yourself socket.close() as it is the only part where the boolean will be set to true.

What you could do is simply try to read from the socket using an inputStream and -1 will be returned if it is closed (if the end of stream has been reached).

See documentation for more information.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...