Estou trabalhando com Sockets no meu sistema e estou com o seguinte problema:
Quando o meu cliente se desliga por algum motivo (desliga máquina, ou fecha o sistema cliente), o socket aonde se encontra o servidor precisa saber que ele não existe mais para poder buscar uma nova conexão.
Tento utilizar algumas informações do socket mas não me retorna falso, ex: socket.isBound(). Nesse caso, se não estivesse vinculado, eu fecharia a conexão (socket.close()), e daria início a busca por uma nova conexão (socket.startServer())
Mas o comando socket.isBound() me retorna true, mesmo com o sistema do socket cliente desconectado!
O socket realmente demora muito para detectar que a outra ponta caiu. Por padrão o timeout do TCP é extremamente longo, na casa dos minutos.
Se você quer detectar mais rapidamente, insira no seu protocolo uma mensagem de KEEP_ALIVE. Ou seja, se um dos lados da conexão ficar silenciosa, envie uma mensagem solicitando uma resposta (uma espécie de ping), que o outro lado obrigatoriamente tem que responder imediatamente. Se a resposta não vier, desconecte.
Essa mensagem é implementada no seu protocolo, não existem métodos prontos no Java para gera-la.
brunobuild
gilvanandre,
Dica fazer sockets na raça é muito complexo tente utilizar algum framework para te auxiliar.
Pode tentar usar o Apache Mina, ele te alguns recursos muito interessantes.
Se você optar por fazer na raça, você precisa tentar enviar alguma coisa via socket para descobrir que ele desconectou uma espécia de “pooling”.
E
entanglement
Por exemplo, no protocolo FIX, há uma mensagem só para isso (Heartbeat ou 35=0).
gilvanandre
brunobuild
Pois é… estou tentando fazer ele na raça mesmo… consegui agora a pouco algumas coisas que me informam se ele está conectado ou não… acho que isso poderá me ajudar!
Pensei sim em utilizar alguma ferramenta, mas como, por enquanto isso é uma “gambiarra” posso deixar assim… vamos ver o que consigo fazer!