Reconectando Socket

1 resposta
leo.mendes

Bom dia pessoal;
gostaria de uma ajudinha com meu código,pois, não consegui identificar o problema ainda.
Tenho um SocketClient que se conecta ao servidor para troca de mensagens,no primeiro momento meu socket funciona sem nenhum problema,eu mando alguns comandos ao servidor e obtenho a resposta, no entanto, quando a conexão cai eu tento reconectar e consigo,o problema está no seguinte: depois de reconectar eu preciso mandar 3,4,5 vezes o comando pra que ele chegue no servidor e obter a resposta.
Aí vai meu codigo pra quem puder dar uma olhada.
Valeu pessoal!

Esse é o socket

package threads;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author leonardo
 */
public class SocketLeitura extends Observable implements Runnable{

    public class EventoConexao{


    }

    public class EventoDesconexao{



    }

    //declara variavel socket
    Socket conecta;

    public SocketLeitura(Socket s){
        //metodo que recebe socket como parametro
        conecta = s;
    }

    @Override
    //sobrescreve metodo run
    public void run(){
        setChanged();
        notifyObservers(new EventoConexao());
        try {
            //captura os streams de entrada no socket
            BufferedReader entrada = new BufferedReader(new InputStreamReader(conecta.getInputStream()));
            do{
                String mensagem = entrada.readLine();

                if(mensagem==null){
                    conecta.close();
                    break;
                    
                }else{



                //enquanto o buffer tiver entrada
                System.out.println("do Servidor: "+ mensagem);}
                //imprime as linhas de entrada
            }while(Thread.currentThread().isAlive());            

        } catch (IOException ex) {
            Logger.getLogger(SocketLeitura.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            setChanged();
            notifyObservers(new EventoDesconexao());
        }
        
    }

}

Aqui o MAIN

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package threads;

import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.Observable;
import java.util.Observer;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author leonardo
 */
public class testaleitura implements Observer{
    SocketAddress server = new InetSocketAddress("tele-teste", 22000);
    
    private void executaSocket(){
        try {
            //cria o socket com o endereço e porta do server
            Socket s = new Socket();
            s.connect(server);
            
            //passa o socket como parametro para a classe que cria as Threads
            SocketLeitura leitura = new SocketLeitura(s);
            //cria a Thread
            Thread t = new Thread(leitura);
            // Me registro como ouvinte dos eventos do socket
            leitura.addObserver(this);
            //inicia a Thread
            t.start();


            //Ler comandos digitados no teclado
            Scanner teclado = new Scanner(System.in);
            //cria saida dos Streams para a conexão
            PrintStream saida = new PrintStream(s.getOutputStream());

           //laço - enquanto houver comandos a enviar
           while(teclado.hasNextLine()){
                 //envia comandos
                 saida.println(teclado.nextLine());

               }

        }

        catch(NoRouteToHostException e){
            System.out.println("Não foi possível localizar o caminho especificado!");
        }
        catch (UnknownHostException uHException) {
            uHException.printStackTrace();
            System.out.println("Host não encontrado ou fora da rede!");

        } catch (IOException iOException) {
            iOException.printStackTrace(); }
    }
    



    public void update(Observable o, Object arg) {
        if(arg instanceof SocketLeitura.EventoConexao){
            System.out.println("Socket conectado!");
            return;
        }
        if(arg instanceof SocketLeitura.EventoDesconexao){
            System.out.println("Socket desconectado! Tentando reconectar!");
            
            try {
                for(int i=0;i<30;i++){
                    Thread.sleep(5000);
                    
                    executaSocket();
                    System.out.println("tentativo: "+(i+1));
                }
                                
               } catch (Exception ex) {
                Logger.getLogger(testaleitura.class.getName()).log(Level.SEVERE, null, ex);
            }
            return;
        }
    }
            public static void main(String[] args)   {
        testaleitura tl = new testaleitura();
        tl.executaSocket();
}

}

1 Resposta

B

Olhando rapidamente seu código notei que sei método executaSocket não retorna nada e está dentro de um loop, cuja condição de parada é i = 30, para começar o ideal serial tentar reconectar enquanto o método não retornar um true…
Você vai encontrar o erro mais facilmente se chamar o printStackTrace nas exceções que são pegas dentro do método executaSocket… Use o printStackTrace e se não conseguir resolver poste a exceção aqui.

Criado 19 de agosto de 2009
Ultima resposta 19 de ago. de 2009
Respostas 1
Participantes 2