java - multiples - ¿Cómo puede un enchufe estar conectado y cerrado?
sockets java examples (1)
Este hilo tiene algunas discusiones útiles sobre este tema. Resulta que Socket.isConnected
devuelve verdadero si se ha conectado (alguna vez) con éxito.
Del hilo anterior:
Cuando usa
Socket()
, que parece haber pasado por alto,Socket.isConnected()
le dice si se ha llamado o no aSocket.connect()
. Del mismo modo paraisClosed()
yclose()
.La confusión sobre estos métodos resulta de confundir el estado del socket , que está bajo el control de la aplicación, con el estado de la conexión general, que está bajo el control del protocolo.
isConnected()
eisClosed()
indican qué ha hecho con el socket. No hay otras API que no sean de lectura y escritura para determinar el estado de la conexión.
Los documentos dicen:
Devuelve verdadero si el socket se conectó exitosamente a un servidor
y no como uno podría esperar " devuelve verdadero si el socket está conectado a un servidor ".
El comportamiento puede confirmarse mirando la fuente de Socket:
public boolean isConnected() {
// Before 1.3 Sockets were always connected during creation
return connected || oldImpl;
}
También podría ejecutar este pequeño fragmento de prueba:
Socket s = new Socket();
System.out.println("isConnected: " + s.isConnected() +
" isBound: " + s.isBound() +
" isClosed: " + s.isClosed());
s.connect(new InetSocketAddress("google.com", 80));
System.out.println("isConnected: " + s.isConnected() +
" isBound: " + s.isBound() +
" isClosed: " + s.isClosed());
s.close();
System.out.println("isConnected: " + s.isConnected() +
" isBound: " + s.isBound() +
" isClosed: " + s.isClosed());
Que impresiones:
isConnected: false isBound: false isClosed: false
isConnected: true isBound: true isClosed: false
isConnected: true isBound: true isClosed: true
Debo decir que la documentación no está clara en este punto, y que el nombre del método es un poco engañoso.
Estoy usando un cliente de socket Java. En un caso en el que el servidor todavía está conectado a mi cliente pero no envía una respuesta a mi mensaje, finalmente obtengo una excepción de tiempo de espera de lectura.
En ese caso, quiero probar para ver si debo volver a conectar mi socket o simplemente mantenerlo reutilizado.
Yo uso esta condición:
if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) {
try {
socket.close();
} catch (IOException e1) {
}
// Wait on a new connection
socket = connectSocket(.....);
}
Pero siempre parece reconectarme. Cuando registro los valores de las propiedades booleanas veo esto:
connected: true closed: true bound: true
¿Cómo se puede conectar y cerrar?
TIA