Theads via socket

3 respostas
cledson2011

Pessoal , como posso fazer uma Thread que atualize uma interface . Pois estou fazendo um jogo de damas , que faz uma jogada e envia a jogada pela rede, então o outro lado pega a jogada e altera a matriz de posiçoes. E deveria fazer a atualização com as novas posições. Fiz um botão para dar um repaint quando clicado na tela e a interface atualiza perfeitamente, mas gostaria de fazer uma thread para atualizar automaticamente sem ter que clicar em um botão. Alguem poderia me dar um exemplo de como devo fazer?

3 Respostas

cledson2011
R

Pelo que li e entendi, sua aplicação já se comunica perfeitamente via socket né? Então o q falta é atualizar a tela. Não sou profissional, acho q uma resposta do Sr. Vinigodoy, que é meu guru do java, seria melhor, mas vamo tentar.
Vc deve ter um DataInputStream e um DataOutputStream para a comunicação das aplicações, então esses caras serão os que vc tem usar para atualizar a tela do game.
Serei bem generalista, aí vc vê o q serve pra vc.

class atualiza extends Thread{

Socket socket = null;  //será o socket que faz a comunicação. AH, não esqucer que vc terá que mandar esse socket pra thread

DataInputStream in = null; // será de onde vc receberá os dados

DataOutputStream out = null; // será por onde vc enviará os dados

Tabuleiro tabuleiro = null;
public atualiza(socket s, Tabuleiro T) throws IOException{ // Não sei como são suas entidades então coloquei essa pra exemplo.

socket = s;

in = new DataInputStream(s.getInputStream());

out = new DataOutputStream(s.getOutputStream());

tabuleiro = T;

this.start();  //Nesse ponto vc faz a thread começar a “funcionar”, porém a plataforma que uso(netbeans), sempre mostra um warning por fazer uma thread

//começar a funcionar de dentro do seu contrutor, espero que alguem com mais experiência que eu veja isso e possa explicar melhor.
} //Aqui nós terminamos o contrutor da thread e abaixo nós temos uma função auxiliar da thread que irá esperar até que uma jogada venha da outra aplicação

public byte[] getRequest(){

int a = 0;

do {

try {

a = in.available(); // Nesse trecho esse laço vai ficar executando até receber uma mensagem(pacote de bytes)

} catch (IOException ex) {

System.out.println(Erro Interno);//exemplo

}

} while (a <= 0);  //quando chega uma mensagem, ele para e já tem o número de bytes recebidos
byte[] b = new byte[a];   
        try {
            in.read(b);       //Aqui vc  os dados recebidos, que no caso deve ser a jogada do adversário.
        } catch (IOException ex) {
            System.out.println("Erro Interno");//exemplo
        }     
    return b;  // aqui vc tem a jogada retornada.

}
//O próximo passo será dizer o que a thread fará enquanto tiver executando, que no caso será atualizar o tabuleiro.
//Como vc já fez a função pra atualizar, que é o ActionListener desse botão citado, usarei como exemplo somente a chamada da função, vc adapta ela pra sua aplicação.

<a class="mention" href="/u/override">@Override</a>

public void run() {

while (s.isConnected()) {

jogada j = jogada.bytes2jogada(getRequest()); //Essa função vc vai ter q criar se não tiver feito, ela converte um array de bytes pra algo do tipo jogada ou a entidade q vc                                                                               //usa pra isso.

Atualiza_Tabuleiro(T,jogada);  // Essa é a função que vc  tem feita, a do botão citado.

}

}

Pronto, e é isso, espero que tenha ajudado.
Qualquer coisa, se precisar, estamos por aki, o que eu souber(o q não é mto) eu te explico, e o que eu não souber, eu recorro ao Vinigodoy, huahuaha. Vlw, cara, abraço!

cledson2011

Cara, o que vc citou nas ultimas linhas era realmente o que precisava para terminar meu projeto. O que não estava fazendo e vc deu uma luz foi eu dar um getter no socket, então com isso eu podi fazer uma thread e pegar o que estava no socket … ficou assim…

Criei uma Thread na interface que starta quando o jogador clica no botão conectar na rede, e ela faz isto:
 void run(){

while(true){ if (socket.getCanal().isConnected()){ if (socket.getEntrada().hasNext()){ // getSocket() a luz que vc me deu .. (hasNext, pois estou usando Scanner) tabuleiro.setMatriz(socket.processaEntrada()); atualizaTabuleiro(tabuleiro.getMatriz()); } } } }ou seja , ela fica constantemente verificando se tem dados no canal e se tiver seta a matriz(logica), e atualiza a tela conforme a matriz.
No meu caso tenho um metodo na classe conexao que processa a entrada e retorna uma matriz, por enquanto estou usando o Scanner p/ entrada e o PrintStream, acho mais facil de lidar, mais confesso que não sei ainda as consequências disso.
Cara, mais o mais importante é que com sua dica fiz a thread e o meu projeto esta funcionando em rede perfeitamente, e o professor irá ser surpreender pois ele pediu para fazer um projeto de damas simples, sem inteligência artificial, e eu fiz funcionar em redes…
Valeu cara, muito obrigado… :smiley:

Criado 31 de março de 2012
Ultima resposta 31 de mar. de 2012
Respostas 3
Participantes 2