Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为关闭的套接字分派事件_Java_Sockets - Fatal编程技术网

Java 为关闭的套接字分派事件

Java 为关闭的套接字分派事件,java,sockets,Java,Sockets,我正在为断开连接客户端执行事件。 这是我的密码: public void run(){ while(isConnected()){ System.out.println("asd"); } serverListener.clientDisconnect(clientID); } public boolean isConnected(){ if(socket.isClosed() || !socket.isConnected()

我正在为断开连接客户端执行事件。 这是我的密码:

public void run(){
    while(isConnected()){
        System.out.println("asd");          
    }
    serverListener.clientDisconnect(clientID);
}

public boolean isConnected(){
    if(socket.isClosed() || !socket.isConnected() || socket.isInputShutdown() || socket.isOutputShutdown()){
        return false;
    }
    return true;
}
问题是我有这样的结果:
isClosed=false
断开连接=正确
IsInputShutdown=false
IsOutputShutdown=false


当客户端断开连接时,我得到了相同的结果:什么也没有发生。

这是正确的。那些旗帜告诉你你做了什么

您没有关闭连接,它只连接了一次,您没有关闭输入或输出

知道连接是否关闭的唯一方法是当您无法从套接字读取时。(或您的选择器通知您)


注意:仅仅因为另一端关闭了连接,并不意味着您要关闭。假设您有一个HTTP请求,服务器向您发送响应并关闭连接。您是否希望连接关闭,即使您尚未在某个随机点读取所有数据,也可能是在您完成或甚至开始之前?如果没有,您希望在读取所有数据后知道它已关闭。

检查此代码发生了什么:

public void run(){
    while(true){ 
        if(packetType == 1) {
            try { 
                String string = getString(); 
                serverListener.readString(string);
            } catch (IOException e) { break; }
        } else if(packetType == 2){
            try { 
                byte[] bytes = getByteArray();
                serverListener.readByteArray(bytes);
            } catch (IOException e) { break; }
        } 
    } 
    serverListener.clientDisconnect(clientID);
} 

您无法知道插座的另一端已关闭。您应该在每一侧使用套接字超时。通常我使用套接字超时,每X秒发送一个keep-alive,现在我修复它!我现在修复:public void run(){while(true){if(packetType==1){try{String String=getString();serverListener.readString(String);}catch(IOException e){break;}}else if(packetType==2){try{byte[]byte=getByteArray();serverListener.readByteArray(bytes);}catch(IOException e){break;}}}serverListener.clientDisconnect(clientID);}