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.