Validar conexao Socket[RESOLVIDO]

Salve galera,

Seguinte, tenho o meu servidor de socket, onde equipamento vao conectar nele. So que nao estou sabendo quando um equipamento esta conectado.

Estou usando o seguinte codigo para teste:

 ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Serviço no ar.");
            System.out.println("Aguardando cliente!");
            List<Socket> listaSocket = new ArrayList<Socket>();
            //Map<Socket, Socket> map = new HashMap<Socket, Socket>();

            //Thread.sleep(1000);
            Socket socket = serverSocket.accept();
            //listaSocket.add(socket);
            // map.put(socket, socket);
            while (true) {
               
                System.out.println(socket.isConnected());
               
                Thread.sleep(15000);
            }

lembrando que estou usando isso somente para testes.
Quando eu desconecto o meu equipamento continua parecendo true, sendo que o equipamento esta desligado.
Como que eu verifico que se o equipamento ainda esta conectado?

O método tradicional de se fazer isso é criar uma mensagem vazia “Heartbeat” ou “keep alive” que o equipamento deve lhe mandar periodicamente (digamos 1 seg) se não estiver fazendo nada. Quando o equipamento estiver desconectado por mais de 2 segundos, por exemplo, a mensagem não vai chegar e você vai saber que o equipamento está desconectado.

Pq a minha conexao funciona assim:

Equipamento = equipamento de rastreamento de veiculos

O equipamento conecta comigo
Faço a validação do equipamento na minha base,
Equipamento Ok mando para ele um @
Equipamento fica aguardando comandos. Aqui é que esta o problema, Quando mando a @ ele fica com a conexao ativa, envio e recebo comandos do equipamento normalmente. So que passou uma hora e eu quero enviar e receber comandos, mas nao sei se o equipamento esta conectado ainda no meu servidor. Essa que esta sendo a minha duvida. Pq quando uso o isConected() ele me retorna true.

Nao sei se fui claro agora.

Pois é, socket.isConnected vai lhe retornar true enquanto a camada TCP do seu sistema operacional não decidir que realmente o socket está fechado porque o outro lado se desconectou de mau jeito. Isso pode levar de minutos a horas, dependendo da configuração do sistema operacional.
O correto é que o equipamento lhe mande periodicamente um comando que não faz absolutamente nada (usualmente chamado “heartbeat” ou “keepalive”). Esse comando serve apenas para indicar que ele está vivo e funcionando.

Entao eu usei o getKeepAlive do socket e ele sempre me retorna false, mesmo o euipamento conectado.
Usei esse cara aqui socket.getReceiveBufferSize() e mesmo o equipamento desligado ele continua trazendo o mesmo valor.

System.out.println(socket.getSoLinger());
System.out.println(socket.getSoTimeout());
System.out.println(socket.getTcpNoDelay());

Usei esse codigo acima tambem e nada.

Nenhum desses “get alguma coisa” vai efetivamente lhe dizer se o socket está desconectado. Até porque é plenamente possível você recuperar uma conexão socket se a própria conexão física (que é o que você quer saber) for brevemente interrompida (o “brevemente”, é claro, depende da configuração do stack TCP de seu sistema operacional).

Cara, resolvi da seguinte maneira, coloquei o meu Socket Cliente dentro de um try catch, se caso der algum erro de conexao eu jogo o meu equipamento para fora e mando ele conectar de novo. simples e rapido.

Valeu pela força galera.