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