Chat com thread no modelo produtor/consumidor

1 resposta
N

Olá pessoal estou construindo um pequeno chat utilizando threads no modelo produtor/consumidor para capturar as mensagens vindas dos clientes, basicamente a thread produtora recebe a mensagem insere em uma fila e uma thread consumidora pega essa mensagem e manda para todos os outros clientes. Minha grande dificuldade é colocar mais de um cliente para rodar, olhei vários exemplos de sockets multithreads mas não consegui por o meu projeto pra rodar da mesma forma, pelo que eu ví posso utilizar uma unica porta e várias conexões por ela, me corrijam se eu estiver errado, outra ideia seria tornar meu servidor também uma thread o que não achei muito prático pois dai não poderei utilizar a mesma porta, isso complica o código dos clientes.

Se puderem a partir do código que eu estou postando aqui junto, me dar uma dica de como fazer, ou se alguém já passou por algum problema semelhante ou viu isso em outro tópico (procurei bastante no fórum antes de perguntar).

package novoservidor;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {

    ServerSocket server;
    Fila fila;
    int porta;

    public Servidor(Fila fila, int porta) throws IOException {

        this.fila = fila;
        this.porta = porta;
    }

    public void Executar() {

        try {

            server = new ServerSocket(porta);
            Socket conexao = server.accept();
            Produtora p = new Produtora(fila, conexao);
            Consumidora c = new Consumidora(fila, conexao);
            Thread T1 = new Thread(p);
            Thread T2 = new Thread(c);

            while (true) {

                T1.start();
                T2.start();

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1 Resposta

N

Dei uma mexida no código pra ver se tenho algum sucesso.

package novoservidor;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Servidor {

    ServerSocket server;
    Fila fila;
    int porta;
    ArrayList<Thread> produtoras = new ArrayList<Thread>();
    ArrayList<Thread> consumidoras = new ArrayList<Thread>();
    ArrayList<Socket> conexoes = new ArrayList<Socket>();

    public Servidor(Fila fila, int porta) throws IOException {

        this.fila = fila;
        this.porta = porta;
    }

    public void Executar(Socket conexao) {

        try {


            Produtora p = new Produtora(fila, conexao);
            Consumidora c = new Consumidora(fila, conexao);
            Thread T1 = new Thread(p);
            produtoras.add(T1);
            Thread T2 = new Thread(c);
            consumidoras.add(T2);
                    

            while (true) {

                T1.start();
                T2.start();

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void accConexao() throws IOException {
        server = new ServerSocket(porta);
        Socket conexao = server.accept();
        conexoes.add(conexao);
        Executar(conexao);
    }
}

Ai na classe main eu coloquei um loop infinito pra chamar o método accConexao(), o que eu notei é que posso conectar os dois clientes numa boa, o primeiro que entra recebe de volta as mensagem tudo certo, mas o segundo se conecta, a janela pra inserir a mensagem aparece, eu digito alguma coisa e a janela some, o programa fica rodando e a mensagem não é retornada a ele, o primeiro cliente conectado continua enviando e recebendo mensagem sem problemas. Vou continuar tentando ver onde está o problema, mas quem puder ter uma idéia e puder ajudar será bem vindo.

package novoservidor;

import java.io.IOException;

public class Main {

    public static void main(String[] args) throws IOException {
        Fila fila = new Fila(30);
        Servidor server = new Servidor(fila, 1234);
        while (true) {
            server.accConexao();
        }

    }
}
Criado 13 de agosto de 2009
Ultima resposta 13 de ago. de 2009
Respostas 1
Participantes 1