Socket, cliente e desconectado, como saber?

3 respostas
homisinho

como eu sei q um cliente c desconectou???

eu criei uma thread e a memsa ta parada na linha

entrada.read(dados);

onde “entrada” é meu BufferedReader do socket servidor e “dados” um vetor de Char…

a thread para nessa linha e fica aguardando receber algo, mas ai digamos q deu pau na conexão “CRTL+ALT+DEL” no meu cliente, ele sai dessa linha e continua adiante no codigo…

como eu testo c o cliente desconectou :?: :?: :?:
e como eu posso especificar um tempo para o servidor ficar aguardando e quando ele passar eu finalizar a thread?

tinha postado no java baisco já, mas ninguem respondeu…
http://www.guj.com.br/posts/list/71101.java

alguem responde ai!!!

3 Respostas

ViniGodoy

Quando o cliente desconectar, o método read vai lançar uma exceção. Capture-a.

Para especificar o tempo, você deve usar um método read com timeout. Eu geralmente tenho feito as conexões com os java.nio, que tem métodos assim.

PS: Não entendi pq vc criou um tópico novo. O teu tópico original estava bastante ativo!

homisinho
ai q ta viniGodoy, eu to dando "CTRL+ALT+DEL" finalizando meu sistema cliente..... e no servidor simplesmente sai do metodo read e continua a passar pela minha thread.... eu to capturando as exceptions mas n ta gerando nenhuma!!!!
try {
.............
.............
                   Arrays.fill(dados,(char)0);///limpa vetor...
                   entrada.read(dados);                   
                   setanome(); ////pega o nome e passa pra global    
..............
................

       }
       catch (Exception i){
           System.out.println("ERRO na leitura: "+lendoOQ+" - - "+ i);       
       }

repostei o tópico no "java avançado", pois vi a descrição do forum pra java avançado, e la consta socket...

a questão do tempo n sei c é uma boa mas eu achei nos docs

conexao.setSoTimeout(20000); ////espera 20000 pra passar no erro...

fiz algo errado q n ta gerando o exception quando eu finalizo o programa do cliente?

homisinho

ai pessoal depois de garimpar na net e olhar os docs, vi q o metodo read tem um return.....

try {  
 .............  
 .............  
                    int numbytes;
                    Arrays.fill(dados,(char)0);///limpa vetor...  
                    numbytes = entrada.read(dados);                     
                    if (numbytes != -1) {

                          setanome(); ////pega o nome e passa pra global     
                    }
                    else {
                        ///o cliente desconectou ou deu algum pau.....
                    }
 ..............  
 ................  
   
        }  
        catch (Exception i){  
            System.out.println("ERRO na leitura: "+lendoOQ+" - - "+ i);         
        }

tão simples e eu n tinha achado..... :oops:

Criado 10 de outubro de 2007
Ultima resposta 10 de out. de 2007
Respostas 3
Participantes 2