Socket + thread loop infinito

6 respostas
P

Ola pessoal deixa eu explicar um pouquinho do meu programa pra vocês entenderem o problema: o meu programa visa buscar uma máquina remota dados de um determinado arquivo atraves de sockets. o cliente solicita os dados do arquivos o servidor recebe a mensagem de qual arquivo e envia as linhas do arquivo ao cliente, acontece que eu só consigo listar os dados no cliente quando eu fecho o programa no servidor, a impressão é que ele entra em loop infinito ao seja ele envia os dados perfeitamente, mas só passa pra linha que lista os dados no cliente quando se fecha o programa no servidor segue abaixo os codigo pra vcs me ajudarem. desde já eu agradeço.

classe servidor:

public class socket extends Thread{
   leArquivo arquivo = new leArquivo();
   Socket socket = null;
   ServerSocket servidor =null ;

   //CONSTRUTOR QUE IRA RECEBER A CONEXÃO//

   public socket(Socket s){
        socket = s;

    }

   //METODO ESTÁTICO INICIO DO PROGRAMA
   public static void main (String[] args){
     try {
         ServerSocket server = new ServerSocket(7002);

        while(true){
         System.out.println("Esperando alguém conectar");
             Socket s = server.accept();
         System.out.println("o cliente :"+ s.getRemoteSocketAddress());

         Thread t = new socket(s);
         t.start();
         
         }

     }
    catch (IOException e) {

      System.out.println("IOException: " + e);
}

    }

   //CODIGO DA THREAD 
      public void run(){
        try {
            BufferedReader entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintStream saida = new PrintStream(socket.getOutputStream());
            leArquivo arquivo = new leArquivo();
             arquivo.leitura(entrada.readLine());
            int i =0;
            while(i<arquivo.dados.size()){
              saida.println(arquivo.dados.get(i));
              i++;
            }

           
        } catch (IOException ex) {
            Logger.getLogger(socket.class.getName()).log(Level.SEVERE, null, ex);
        }


    }
    public static void sleep(int s){
        try {
            Thread.sleep(s);
        } catch (InterruptedException ex) {
            Logger.getLogger(socket.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Classe Cliente:

public class cliente extends Thread {

    Socket soc = null;
    BufferedReader entrada;
    PrintStream saida;
    ArrayList dados;
    String linha = null;

    public cliente(Socket s){
        soc = s;
    }
// CODIGO DA THREAD
    public void run(){
        try {
            saida("/etc/dansguardian/bannedsitelist");
            entrada = new BufferedReader(new InputStreamReader(soc.getInputStream()));
         dados = new ArrayList();
         
            while((linha=entrada.readLine())!=null){    //  AQUI ESTA O PROBLEMA NESSE  WHILE  FICA COM  LOOP  INFINITO //
                dados.add(linha);    
                }
         int i=0;
         while(i<dados.size()){
         System.out.println(dados.get(i));                   
         i++;
         soc.close();
         }
           } catch (IOException ex) {
            Logger.getLogger(cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
      
    }
    public void saida(String s){
        try {
            saida = new PrintStream(soc.getOutputStream());
        } catch (IOException ex) {
            Logger.getLogger(cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    saida.println(s);

    }

    public static void main (String[] args){
        try {
            Socket s = new Socket("192.168.1.254", 7002);

            Thread t = new cliente(s);
            t.start();
           
            


        } catch (UnknownHostException ex) {
            Logger.getLogger(cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
        

    }
    public static void sleep(int s){
        try {
            Thread.sleep(s);
        } catch (InterruptedException ex) {
            Logger.getLogger(cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

6 Respostas

G

Use a TAG CODE e coloque só as partes que julgar importantes do seu código, depois dou uma olhada…

P

Ja coloquei a tag code, se puder me ajudar, desde já agradeço!

G

while((linha=entrada.readLine())!=null){ ...

Não está num loop infinito, é que, depois que o servidor termina de enviar todas as linhas do arquivo, o cliente fica esperando mais uma linha…

Só por que o servidor parou de enviar, não quer dizer que o cliente vai receber null, na realidade, ele fica esperando o servidor enviar novos dados!

P

Certo, mas como devo proceder sendo que ele so sai desse loop quando eu fecho o programa que esta enviando?

G

Mantendo o seu estilo, você pode mandar um String pre definida no servidor e comparar no cliente, ou simplesmente fechar a conexão e tratar no cliente.

P

obrigado,

resolvi da seguinte forma:

while(!(linha=entrada.readLine()).contains("fim"))
Criado 30 de junho de 2009
Ultima resposta 30 de jun. de 2009
Respostas 6
Participantes 2