远程应用程序强制关闭后,检测套接字关闭

Luk*_*oll 1 java sockets

我在Java套接字方面遇到了一些麻烦.我有一对应用程序在它们之间建立连接(一个打开a ServerSocket,调用accept()和等待,另一个通过Socket(InetAddress,int)构造函数连接.

建立套接字连接后,使用Thread它创建a 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.
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当其中一个应用程序意外关闭时(在我的情况下从Eclipse终止)调用Socket.isClosed()仍显示套接字已打开,因此循环保持运行,就好像Socket已打开一样.

当另一侧的Java应用程序被强制结束时,如何检测Socket何时关闭?

Jea*_*ard 5

socket.isClosed()返回true 的唯一方法是调用自己,socket.close()因为它是布尔值设置为的唯一部分true.

您可以做的只是尝试从socket使用中读取,inputStream如果它已关闭(如果已到达流的末尾),将返回-1.

有关更多信息,请参阅文档