为已关闭的套接字调度事件

时间:2013-10-06 13:34:15

标签: java sockets

我正在为断开连接客户端做事件。 这是我的代码:

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
isConnected = true
IsInputShutdown = false
IsOutputShutdown = false

当客户端断开连接时,我得到了相同的结果:没有任何反应。

2 个答案:

答案 0 :(得分:1)

这是正确的。那些标志告诉你你做了什么。

您尚未关闭连接,它已连接一次,您没有关闭输入或输出。

了解连接是否已关闭的唯一方法是无法从套接字读取。 (或者您的选择器会通知您)

注意:仅仅因为另一端关闭了连接,并不意味着你要关闭。想象一下,您有一个HTTP请求,您的服务器会向您发送响应并关闭连接。即使您没有在某个随机点读取所有数据,也可能在完成甚至开始之前,您是否希望连接关闭?你没有,你想知道一旦你读完了所有数据它就被关闭了。

答案 1 :(得分:0)

检查此代码会发生什么:

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);
}