recibir multiples examples enviar datos datagrama creación concepto con clientes java sockets

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 a Socket.connect() . Del mismo modo para isClosed() y close() .

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() e isClosed() 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