Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

¿Cómo detecta si se ha llamado a Socket # close () en un socket en el lado remoto?

¿Fue útil?

Solución

El método isConnected no ayudará, devolverá true incluso si el lado remoto ha cerrado el zócalo. Prueba esto:

public class MyServer {
    public static final int PORT = 12345;
    public static void main(String[] args) throws IOException, InterruptedException {
        ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT);
        Socket s = ss.accept();
        Thread.sleep(5000);
        ss.close();
        s.close();
    }
}

public class MyClient {
    public static void main(String[] args) throws IOException, InterruptedException {
        Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT);
        System.out.println(" connected: " + s.isConnected());
        Thread.sleep(10000);
        System.out.println(" connected: " + s.isConnected());
    }
}

Inicie el servidor, inicie el cliente. Verás que imprime " conectado: verdadero " dos veces, aunque el zócalo se cierre la segunda vez.

La única forma de averiguarlo realmente es leyendo (obtendrá -1 como valor de retorno) o escribiendo (se lanzará una IOException (tubería rota)) en los Input / OutputStreams asociados .

Otros consejos

Dado que las respuestas se desvían, decidí probar esto y publicar el resultado, incluido el ejemplo de prueba.

El servidor aquí solo escribe datos en un cliente y no espera ninguna entrada.

El servidor:

ServerSocket serverSocket = new ServerSocket(4444);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
while (true) {
  out.println("output");
  if (out.checkError()) System.out.println("ERROR writing data to socket !!!");
  System.out.println(clientSocket.isConnected());
  System.out.println(clientSocket.getInputStream().read());
        // thread sleep ...
  // break condition , close sockets and the like ...
}
    ¡
  • clientSocket.isConnected () devuelve siempre verdadero una vez que el cliente se conecta (e incluso después de la desconexión) extraño!
  • getInputStream (). read ()
    • hace que el hilo espere entrada mientras el cliente esté conectado y, por lo tanto, hace que su programa no haga nada, excepto si obtiene alguna entrada
    • devuelve -1 si el cliente se desconectó
  • out.checkError () es verdadero tan pronto como el cliente se desconecta, así que recomiendo esto

También puede verificar el error del flujo de salida del socket mientras escribe en el socket del cliente.

out.println(output);
if(out.checkError())
{
    throw new Exception("Error transmitting data.");
}

El método Socket.Available arrojará inmediatamente una SocketException si el sistema remoto ha desconectado / cerrado la conexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top