Conexao Thread

5 respostas
R

O galera, estou tentando conectar no servidor usando thread, porem toda vez que eu chamo a função para enviar um determinado dado para o servidor ele conecta novamente. se eu tirar a linha NEW CONEXAO da erro, ou seja, nao posso ter a linha verde. alguem pode me ajudar.

OBS: o procedimento leitura vai ser lido e passado como paramentro atraves de outra classe.

import <a href="http://java.io">java.io</a>.<em>;

import <a href="http://java.net">java.net</a>.</em>;

public class Cliente extends Thread {

public Cliente(){

}

// Flag que indica quando se deve terminar a execução.

private static boolean done = false;

public static void main(String args[]) {
try {
 
  Socket conexao = new Socket("127.0.0.1", 2222);
PrintStream saida = new

PrintStream(conexao.getOutputStream());

// enviar antes de tudo o nome do usuário

BufferedReader teclado =

new BufferedReader(new InputStreamReader(System.in));

System.out.print("Entre com o seu nome: ");

String meuNome = teclado.readLine();

saida.println(meuNome);
// Uma vez que tudo está pronto, antes de iniciar o loop

// principal, executar a thread de recepção de mensagens.

Thread t = new Cliente(conexao);

t.start();

// loop principal: obtendo uma linha digitada no teclado e
// enviando-a para o servidor.

}

catch (IOException e) {

// Caso ocorra alguma excessão de E/S, mostre qual foi.

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

}

new Menu().show();

}
// parte que controla a recepção de mensagens deste cliente

private Socket conexao;

// construtor que recebe o socket deste cliente

public Cliente(Socket s) {

conexao = s;

}
[color=blue]public void leitura(String l){[/color]

try {

[color=green]Socket conexao = new Socket(127.0.0.1, 2222);[/color]

PrintStream saida = new

PrintStream(conexao.getOutputStream());

String linha;

linha = l;

}

catch (IOException e) {

// caso ocorra alguma exceção de E/S, mostre qual foi.

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

}

}

// execução da thread

public void run() {

try {

BufferedReader entrada = new BufferedReader

(new InputStreamReader(conexao.getInputStream()));

String linha;

while (true) {

// pega o que o servidor enviou

linha = entrada.readLine();

// verifica se é uma linha válida. Pode ser que a conexão

// foi interrompida. Neste caso, a linha é null. Se isso

// ocorrer, termina-se a execução saindo com break

if (linha == null) {

System.out.println(“Conexão encerrada!”);

break;

}

// caso a linha não seja nula, deve-se imprimi-la

System.out.println();

System.out.println(linha);

System.out.print(”…> ");

}

}

catch (IOException e) {

// caso ocorra alguma exceção de E/S, mostre qual foi.

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

}

// sinaliza para o main que a conexão encerrou.

done = true;

}

}

5 Respostas

Abdon

O erro que acontece é de compilação não é?
Isso acontece prq quando vc declarou a varial conexão vc estava dentro do seu try. No seu metodo leitura, ela simplesmente não existe, pois não foi declarada naquele scopo. Um fato curioso é que este metodo não esta sendo chamado no seu codigo.
Vc pode corrigir o problema passado um socket como parametro para seu método.

R

t

R

e ai companheiro blz, o metodo leitura é chamado por outra classe que nao mencionei, o erro é o seguinte, a variavel conexao foi declarada acima dentro do try, o que eu preciso fazer para nao precisar declarar ela novamente ?, ou seja se eu declarar da forma acima ela vai conectar novamente no servidor (NEW), e eu nao quero fazer isso, pois o metodo leitura vai ser chamado varias vezes no decorrer do programa para enviar dados ao servidor, e eu quero ja estar conectado. vc mencionou passar a conexao em parametro. como eu faço isso ?.

R

e ai companheiro blz, o metodo leitura é chamado por outra classe que nao mencionei, o erro é o seguinte, a variavel conexao foi declarada acima dentro do try, o que eu preciso fazer para nao precisar declarar ela novamente ?, ou seja se eu declarar da forma acima ela vai conectar novamente no servidor (NEW), e eu nao quero fazer isso, pois o metodo leitura vai ser chamado varias vezes no decorrer do programa para enviar dados ao servidor, e eu quero ja estar conectado. vc mencionou passar a conexao em parametro. como eu faço isso ?.

ViniGodoy

Em primeiro lugar, use a opção de editar no seu post original e coloque-o dentro das tags code, como descrito neste tópico. Fica muito mais difícil te ajudar se o código está sem identação…

Eu mudaria o seguinte:

  1. Retire o construtor que não aceita parâmetro nenhum. Se você precisa que a conexão seja passada externamente, não precisará desse construtor.

  2. No método leitura, não crie uma nova conexão. Ao invés disso, use o atributo conexão que a sua própria classe possui. Para isso, basta apagar a linha com o new. (Que erro dá quando você faz isso?)

Ou então, receba a conexão como parâmetro, como abaixo (acho essa segunda opção pior):

public void leitura(Socket conexao, String l) { try { PrintStream saida = new PrintStream(conexao.getOutputStream()); String linha; linha = l; } catch (IOException e) { // caso ocorra alguma exceção de E/S, mostre qual foi. System.out.println("IOException: " + e); } }

  1. A variável done não deveria ser static.

  2. Dê preferência a implementar Runnable ao invés de criar uma subclasse de thread. É sempre bom desacoplar o mecanismo de execução da thread (a classe Thread ou um ExecutorsService) do seu comportamento (implementação da interface Runnable). Além disso, criar um filho de thread retira a possibilidade de você criar uma superclasse no futuro.

  3. No seu construtor, verifique se a conexão passada como parâmetro não é nula. Se for, lance uma IllegalArgumentException ou NullPointerException. É muito bom que as conexões sejam válidas no início de sua execução. Você pode verificar o mesmo para conexões já fechadas.

  4. A variável conexao vai ser usada por várias threads? Então ela deve estar num bloco sincronizado ou ser declarada como volatile:
    private volatile Socket conexao;
    Isso vale para todas as variáveis que são acessadas por várias threads simultaneamente.

Criado 10 de abril de 2007
Ultima resposta 10 de abr. de 2007
Respostas 5
Participantes 3