Ajuda com Thread

7 respostas
S

Galera, estou com um programa pra ler linhas que um socket envia, ele se conecta a mim e eu rodo uma thread para ler linhas, porém nao consigo lelas e nao sei como resolver:

package org.inpe.popularBanco;


import java.io.*;
import java.net.*;
import java.util.Scanner;

public class SocketServer extends Thread {
    
    public static void main(String args[]) {
        try {
            //Cria um servidor via socket recebendo como argumento os dados passados pelo usuario
            System.out.println(args[0]);
            ServerSocket server = new ServerSocket(Integer.parseInt(args[0]));
            Socket conexao = server.accept();
            
            Thread t = new SocketServer(conexao);
            t.start();
            
        } catch (IOException e) {
            // Caso ocorra alguma excessão de E/S, mostre qual foi.
            System.out.println("IOException: " + e);
        }
    }

    // parte que controla a recepção de mensagens deste cliente
    private Socket conexao;
    

    // construtor que recebe o socket deste cliente
    public SocketServer(Socket s) {
        conexao = s;
    }

    // execução da thread
    @Override
    public void run() {
        try {
            Scanner scan = new Scanner(System.in);
            BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
            String linha;
            String linha2;
            while (true) {
                System.out.println("Ta rodando");
                // pega o que o servidor enviou
                linha = entrada.readLine();
                linha2 = scan.next();
                System.out.println(linha);
                // verifica se a linha é valida ou nao é nula
                // Se a linha for nula, termina a execução saindo com break
                if (linha != null)
                    PopulaBanco.popularBancoViaSocket(linha.split("\t"));
                
                if(linha2.equalsIgnoreCase("sair")){
                    System.out.flush();
                    return;
                }

            }
        } catch (IOException e) {
            // caso ocorra alguma exceção de E/S, mostre qual foi.
            System.out.println("IOException: " + e);
        }finally{
            try {
                conexao.close();
            } catch (IOException ex) {
                System.out.println("aqui");
                ex.printStackTrace();
            }
        }
    }
}

7 Respostas

TeiTei

Cara inves de fazer assim:

Thread t = new SocketServer(conexao);

faz assim e testa:

Thread t = new Thread(new SocketServer(conexao));
S

Mesma coisa, ele começa a thread e fica parado em apenas uma linha que o socket manda e nao faz mais nada. Ta estranho, nao sei o que fazer. Se alguém tiver ideia ai, abraços.

TangZero

Carinha,

dei uma mexida no seu código, espero que não se importe…
O problema era que para cada linha lida via Socket, o código travava esperando uma linha no terminal(console) para ser lida. Era necessário cria uma Thread só para tratar a leitura do terminal.

package org.inpe.popularBanco;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class SocketServer extends Thread {
    
    public static void main(String args[]) {
        try {
            //Cria um servidor via socket recebendo como argumento os dados passados pelo usuario
            System.out.println(args[0]);
            ServerSocket server = new ServerSocket(Integer.parseInt(args[0]));
            Socket conexao = server.accept();
            
            Thread t = new SocketServer(conexao);
            t.start();
            
        } catch (IOException e) {
            // Caso ocorra alguma excessão de E/S, mostre qual foi.
            System.out.println("IOException: " + e);
        }
    }

    // parte que controla a recepção de mensagens deste cliente
    private Socket conexao;
    

    // construtor que recebe o socket deste cliente
    public SocketServer(Socket s) {
        conexao = s;
    }

    // execução da thread
    @Override
    public void run() {
        
    	try {
            
            BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
            BufferedWriter saida = new BufferedWriter(new OutputStreamWriter(conexao.getOutputStream()));
            String linha;
            
            TerminalScanner scanner = new TerminalScanner();
            scanner.start();
            
            saida.write("Conected!\r\n");
        	saida.flush();
            
            while (true) {            
            	
            	// aguarda até tiver dados
            	while (!entrada.ready()) {
            		if (scanner.isExit()){
                        System.out.flush();
                        saida.write("Bye bye!\r\n");
                    	saida.flush();
                    	saida.close();
                    	entrada.close();
                        return;
                    }
            	}            	
                System.out.println("Receiving data...");
                
                // pega o que o servidor enviou
                linha = entrada.readLine();
                System.out.println(linha);
                                
              if (linha != null)  
                	PopulaBanco.popularBancoViaSocket(linha.split("\t"));
                
            }
        } catch (IOException e) {
            // caso ocorra alguma exceção de E/S, mostre qual foi.
            System.out.println("IOException: " + e);
        } finally {
            try {
                conexao.close();                
            } catch (IOException ex) {
                System.out.println("aqui");
                ex.printStackTrace();
            }
        }
    }
    
    class TerminalScanner extends Thread {
    	
    	private boolean exit;
    	
    	@Override
    	public void run() {
    		System.out.println("Terminal ready...");
    		while (true) {
	    		Scanner scan = new Scanner(System.in);
	    		String linha;
	    		
	    		while (!scan.hasNext());
	    		
	    		linha = scan.next();
	    		if (linha.equals("sair")) {
	    			exit = true;
	    			return;
	    		}
    		}
    	}
    	
    	public boolean isExit() {
    		return exit;
    	}
    	
    }
    
}

Espero que ajude… :wink:

S

Brigado pelo código cara, só que ainda ta dando problema, ele me lançou um erro agora:

40005
Terminal ready...
Ready...
0	2008	5	26	18	2	[telefone removido]	-25.3408	-50.9380	-33	0	76	105.40	0.70	0.30	3.30	10.4	28.0	-0.0	0	1	0	1
Exception in thread "Thread-0" java.lang.ExceptionInInitializerError
	at org.inpe.popularBanco.SocketServer.run(SocketServer.java:66)
Caused by: java.lang.NullPointerException
	at java.lang.String.concat(String.java:1997)
	at org.inpe.popularBanco.PopulaBanco.<clinit>(PopulaBanco.java:228)
	... 1 more

Creio eu que ele chegou a ler a linha, mas nao sei porque ele deu problema na linha 66 dizendo que era nullpointerexception, linha 66 é:

PopulaBanco.popularBancoViaSocket(linha.split("\t"));

onde meu PopulaBanco.popularBancoViaSocket recebe:

public static void popularBancoViaSocket(String[] vetor){

Nao entendi o erro dessa vez, se a linha nao era nula pq ele deu erro?

TangZero

Poste o código de PopulaBanco, pois deu erro nela.

at org.inpe.popularBanco.PopulaBanco.<clinit>(PopulaBanco.java:228)
S

Cara, show de bola, agora ta funcionando. Tentei usar o esquema que o amigo falou de criar uma nova thread dentro da thread para ler o “sair” e sair do programa, o problema é que ele nao faz nada, simplismente nada hehe. Alguém sabe como fazer? Ou se tem algo errado? Já tentei de tudo aqui, porém nao estou conseguindo.

TangZero

Pelo StackTrace que você postou, o erro que deu foi na classe PopulaBanco… Poste o código dela…

Criado 26 de maio de 2008
Ultima resposta 29 de mai. de 2008
Respostas 7
Participantes 3