Chat básico (resolvido)

2 respostas
java
Wpenach1

Galera… Seguinte… tenho esse código básico de soket de um servidor de chat. O que acontece é que passei a chamada para um botao de iniciar o chat. Como ele fica em while esperando alguem se conectar, ele trava a frame e os botões não funcionam. Tem como iniciar de modo que a jframe continue funcionado normal?

public Serv_Service() {
try {
    serverSocket = new ServerSocket(54321);

    System.out.println("Servidor operando!");

    while (true) {
        socket = serverSocket.accept();

        new Thread(new ListenerSocket(socket)).start();
    }

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

}

Valeu

2 Respostas

lvbarbosa

Isso está acontecendo porque o Swing, como praticamente todos os frameworks de UI, é single-threaded. Quando você clica no botão, o método registrado para lidar com o click é executado na mesma thread que lida com a UI. A thread vai ficar ocupada executando seu código e não vai responder a nenhum outro evento. Por isso que não é uma boa prática fazer coisas “pesadas” nessa thread.

Para não travar, você precisa de uma arquitetura assíncrona. Toda vez que o usuário interagir com a UI e algum trabalho precise ser feito, você joga esse trabalho para outra thread e avisa de alguma forma ao usuário que está trabalhando no que foi pedido (um spinner, por exemplo). Quando o trabalho acaba no background, ele deve avisar a UI que terminou. Isso você consegue fazer passando mensagens entre os objetos.

Tem um tutorial no site da Oracle que dá uma noção de como fazer isso no Swing. Se quiser ir mais a fundo, tem um livro ótimo chamado Java Concurrency in Practice, que cobre quase tudo sobre concorrência em Java.

Wpenach1

Obrigado amigo, vou dar uma lida…

Criado 17 de agosto de 2018
Ultima resposta 20 de ago. de 2018
Respostas 2
Participantes 2