Galera to entregando um projeto…
mas to com um mega problema…
seguinte… tenho um programa em C++ q é meu ServerSocket ok?!
meu cliente é uma classe em Java…
eu estabeleço uam conexão socket com um new Socket(maquina,porta);
consigo escrever usando BufferedWriter e le a resposta com BufferedReader, na boa! td ok! o problema é…
qnd eu fecho meu programa feito em C++… dai meu programinha em java tenta escrever… p ele escreve!!! ele não ve q a conxeão fechou!!
tentei usar os metodos…
isBound()
isClosed()
isConnected()
e nenhum me diz se perder a conexão!
alguem ja passou por isso? como resolver???
isso está me atrasando nessa entrega…
abraços!!!
kubanacan,
já tentasse fazer o seguinte.
Quando você fechar seu programa feito em C++, manda um padrão de caracteres que indica que sua aplicação c++ fechou. Aí seu programa em java receberá isso e saberá que deverá fechar a conexão.
Na verdade, demora um pouco mesmo para o Socket perceber que a conexão fechou. O problema não está na implementação do Socket no Java, mas na pilha TCP/IP que é implementada dessa forma. Pense bem, a internet é feita para trabalhar com máquinas que podem ir e vir com relativa facilidade, então é de se esperar que leve algum tempo que o Socket perceba que alguma coisa deu errado.
Por exemplo, pode acontecer de você fechar um socket no servidor e, ao tentar reabri-lo no cliente, esse não percebe que o Socket fechou e diz para você que não pode fazer “bind” pq um outro socket está ligado por lá! E quem é esse outro socket? É um “fantasma” da conexão passada.
O problema que citei é um dos exemplos. Existe até um método para atenua-lo chamado setReuseAddress().
Uma das saídas é realmente a que o colega deu, usar um comando na camada de aplicação. Mas nem sempre isso é possível (você pode nem ter o código da aplicação C++, por exemplo).
Outra é conviver com o problema. Por isso existem protocolos de aplicação que implementam algoritmos de keep alive mais curtos do que o do TCP. Enfim, seja qual for a solução que você vai adotar, saiba que essa não é uma situação incomum ou que é um erro de sua lógica.
Sakei…
valeu pelo esclarecimento ViniGodoy e pela dica Petrônio.
vou fazer isso!!
abraços