Ajuda em chat com Socket

7 respostas
W

Tenho um projeto que o professor pediu para fazer um chat em modo console mesmo, nada gráfico.
O problema está quando vou pedir para o servidor listar os usuários conectados a mesma sala que estou. Ele me envia todos usuarios conectados independente da sala, mas na verdade tem que ser somente a sala que estou. Não sei se deram para entender, vou postar o código para poderem ver.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ThreadServidor extends Thread {

    private Socket connectionSocket;
    private static ArrayList<Usuario> listaUsuarios;
    //lista que armazena nome de clientes
    private static List<String> listaNomes = new ArrayList<String>();
    //lista que armezena nome das salas
    private static List<String> listaSalas = new ArrayList<String>();

    public ThreadServidor(Socket socket) {
        this.connectionSocket = socket;
    }

    public void run() {
        DateFormat dateFormat = DateFormat.getDateTimeInstance();
        try {

            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); //Buffer do cliente
            PrintWriter outToClient = new PrintWriter(connectionSocket.getOutputStream(), true); //Envia para cliente

            outToClient.println("----BEM VINDO AO CHAT----");

            String nomeUser = "";
            nomeUser = inFromClient.readLine();
            while ((addUsuario(nomeUser)) || (nomeUser.equals("")) || (nomeUser.contains(" "))) {
                if ((nomeUser.equals("")) || (nomeUser.contains(" "))) {
                    outToClient.println("## ERRO ## NOME INVALIDO.");
                } else if ((addUsuario(nomeUser))) {
                    outToClient.println("## ERRO ## JA EXISTE UM USUARIO COM ESTE NOME.");
                }
                nomeUser = inFromClient.readLine();
            }
            Usuario user = new Usuario(nomeUser);
            outToClient.println("confirma-nome");
            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " ** conectou ao chat. ");

            String opcao = "";
            while (!opcao.equals("4")) {
                opcao = inFromClient.readLine();
                if (opcao.equals("1")) { //cria sala
                    String nomeSala = inFromClient.readLine();
                    while (addSala(nomeSala)) {
                        outToClient.println("## ERRO ## JA EXISTE UMA SALA COM ESTE NOME.");
                        nomeSala = inFromClient.readLine();
                    }
                    Sala sala = new Sala(nomeSala);
                    user.setSala(nomeSala);
                    listaUsuarios = new ArrayList<Usuario>();
                    listaUsuarios.add(user);
                    user.setOut(outToClient);
                    outToClient.println("confirma-sala");
                    System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " ** Criou a Sala " + user.getSala());
                    printAll("** " + user.getNome(), " ** entrou ", "no chat", user.getSala());
                    //Informa os usuário conectados assim que criar a sala
                    outToClient.println("Usuários Conectados: " + listaNomes.toString() + " na Sala: " + user.getSala());
                    String msg = "";
                    while (!msg.equals("/ex")) {
                        printAll(user.getNome(), " [MODERADOR] >> ", msg, user.getSala());//envia para todo mundo
                        msg = inFromClient.readLine();
                        if (msg.contains("/lu")) {
                            //outToClient.println("Usuários Conectados: " + listaNomes.toString());
                            listarUsuarios(outToClient, msg);
                            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " **" + " pediu listagem de usuários da Sala " + user.getSala());
                        }
                        if (msg.contains("/ls")) {
                            // outToClient.println("Salas Disponiveis >>> " + listaSalas.toString());
                            listarSalas(outToClient);
                            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " **" + " solicitou a lista de Salas");
                        }
                        if (msg.contains("/help")) {
                            help(outToClient);
                        }                        
                        if (msg.equals("exit")) {
                            printAll("** " + user.getNome(), " ** saiu ", "da sala: " + user.getSala(), user.getSala());
                        }
                        if (msg.equals("/ex")) {
                            printAll("** " + user.getNome(), " ** saiu ", "da sala: " + user.getSala(), user.getSala());
                            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " ** Desconectou do Chat");
                            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " ** Fechou a Sala " + user.getSala());
                            removeNome(user.getNome());
                            removeUsuario(user);
                            //remove o nome da sala da lista de Salas quando o é o criador da Sala
                            listaSalas.remove(nomeSala);
                            //printa para todos que o criador da sala esta fechando a sala
                            printAll("O Criador " + user.getNome(), " esta fechando ", " a Sala", user.getSala());
                            user.setSala(null);
                            connectionSocket.close();
                        }

                    }

                }//fim if

                if (opcao.equals("2")) {  //entra numa sala ja existente
                    String nomeSala = inFromClient.readLine();
                    String msg = "";
                    if (verificaSala(nomeSala)) {
                        outToClient.println("confirma-sala");
                        user.setSala(nomeSala.toUpperCase());
                        user.setOut(outToClient);
                        listaUsuarios.add(user);
                        printAll("** " + user.getNome(), " ** entrou ", "no chat", user.getSala());
                        //Informa os usuário conectado na sala assim que entar
                        outToClient.println("Usuários Conectados: " + listaNomes.toString() + " na Sala: " + user.getSala());
                        while (!msg.equals("/ex")) {
                            printAll(user.getNome(), " >> ", msg, user.getSala());//envia para todo mundo
                            msg = inFromClient.readLine();
                            if (msg.contains("/lu")) {
                                //outToClient.println("Usuários Conectados: " + listaNomes.toString());
                                listarUsuarios(outToClient, msg);
                                System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " **" + " pediu listagem de usuários da Sala " + user.getSala());
                            }
                            if (msg.contains("/ls")) {
                                //outToClient.println("Salas Disponiveis >>> " + listaSalas.toString());
                                listarSalas(outToClient);
                                System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " **" + " solicitou a lista de Salas");
                            }
                            if (msg.contains("/help")) {
                                help(outToClient);
                            }                            
                            if (msg.equals("exit")) {
                                printAll("** " + user.getNome(), " ** saiu ", "da sala: " + user.getSala(), user.getSala());

                            }
                            if (msg.equals("/ex")) {
                                printAll("** " + user.getNome(), " ** saiu ", "da sala: " + user.getSala(), user.getSala());
                                System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " ** Desconectou do Chat");
                                removeNome(user.getNome());
                                removeUsuario(user);
                                connectionSocket.close();
                            }
                        }
                    } else {
                        outToClient.println("## ERRO ## NAO EXISTE SALA COM ESTE NOME");
                    }
                }

                if (opcao.equals("3")) {//Listar Salas
                    listarSalas(outToClient);
                    String msg = "";
                    while (!msg.equals("/ex")) {
                        printAll(user.getNome(), " >> ", msg, user.getSala());//envia para todo mundo
                        msg = inFromClient.readLine();
                        if (msg.contains("/lu")) {
                            outToClient.println("Usuários Conectados: " + listaNomes.toString());
                            //listarUsuarios(outToClient, msg);
                            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " **" + " pediu listagem de usuários da Sala " + user.getSala());
                        }
                        if (msg.contains("/ls")) {
                            //outToClient.println("Salas Disponiveis >>> " + listaSalas.toString());
                            listarSalas(outToClient);
                            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " **" + " solicitou a lista de Salas");
                        }
                        if (msg.contains("/help")) {
                            help(outToClient);
                        }                        
                        if (msg.equals("exit")) {
                            printAll("** " + user.getNome(), " ** saiu ", "da sala: " + user.getSala(), user.getSala());
                        }
                        if (msg.equals("/ex")) {
                            printAll("** " + user.getNome(), " ** saiu ", "da sala: " + user.getSala(), user.getSala());
                            System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " ** Desconectou do Chat");
                            removeNome(user.getNome());
                            removeUsuario(user);
                            user.setSala(null);
                        }
                    }
                }
                if (opcao.equals("4")) { //sair do chat                    
                    removeNome(user.getNome()); //remove da lista de nomes
                    removeUsuario(user); //remove o ususario da lista de usuario
                    System.out.println("[" + dateFormat.format(new Date()) + "]" + "** " + user.getNome() + " ** Desconectou-se do chat");
                    printAll(user.getNome(), " desconectou-se ", "do chat", user.getNome());
                    user.setSala(null);
                    user = null;
                    connectionSocket.close();
                }
            }//fim while
        } catch (Exception e) {
            //System.out.println("FALHA NO SISTEMA: " + e);
        }
    }    

    public boolean addUsuario(String nome) {
        for (String l : listaNomes) {
            if (l.equalsIgnoreCase(nome)) {
                return true;
            }
        }
        listaNomes.add(nome);
        return false;
    }

    public boolean addSala(String sala) {
        for (String s : listaSalas) {
            if (s.equals(sala)) {
                return true;
            }
        }
        listaSalas.add(sala);
        return false;
    }

    public boolean verificaSala(String sala) {
        for (String s : listaSalas) {
            if (s.equalsIgnoreCase(sala)) {
                return true;
            }
        }
        return false;
    }

    public static void removeUsuario(Usuario user) {
        for (int i = 0; i < listaUsuarios.size(); i++) {
            if (listaUsuarios.get(i).equals(user)) {
                listaUsuarios.remove(user);
            }
        }
    }

    public static void removeNome(String nome) {
        for (int i = 0; i < listaNomes.size(); i++) {
            if (listaNomes.get(i).equals(nome)) {
                listaNomes.remove(nome);
            }
        }
    }

    public void printAll(String rem, String tipo, String msg, String sala) {
        for (Usuario u : listaUsuarios) {
            if (u.getSala().equalsIgnoreCase(sala)) {
                String conteudo = rem + tipo + msg;
                u.getOut().println(conteudo);
            }
        }
    }

    public static void listarSalas(PrintWriter outToClient) {
        String salas = "Salas Disponiveis >>> ";
        for (String s : listaSalas) {
            salas += "[" + s + "] ";
        }
        outToClient.println(salas);
    }

    public static void listarUsuarios(PrintWriter outToClient, String sala) {

        String usuario = "Usuarios Conectados >>> ";
        for (String u : listaNomes) {
            if (u.equals(sala)); {
                usuario += "[" + u + "] ";
            }
        }
        outToClient.println(usuario);
    }

       

    public static void help(PrintWriter outToClient) {
        outToClient.println("\t<<< MENU AJUDA >>>");
        outToClient.println("----------------------------------------");
        outToClient.println("| PARA LISTAR USUÁRIOS, DIGITE: | /lu  |");
        outToClient.println("|--------------------------------------|");
        outToClient.println("| PARA LISTAR SALAS,    DIGITE: | /ls  |");
        outToClient.println("|--------------------------------------|");        
        outToClient.println("| PARA SAIR DA SALA,    DIGITE: | exit |");
        outToClient.println("|--------------------------------------|");
        outToClient.println("| PARA ENCERRAR O CHAT, DIGITE: | /ex  |");
        outToClient.println("----------------------------------------");
    }
}

7 Respostas

Frantic_Avenger

Removido

W

////

Frantic_Avenger

Lendo o código e descobrindo a causa de sua dúvida envio uma mensagem avisando.

W

Olha só posso te enviar o código das classes completo por email se voce quiser, assim fica melhor pra vc depurar e ver.

Frantic_Avenger

wnevony:
Olha só posso te enviar o código das classes completo por email se voce quiser, assim fica melhor pra vc depurar e ver.

Você pode clicar em Attachments abaixo da área onde se digita o texto e subir os arquivos para o fórum, assim todos podem ver. Estou no trabalho no momento, o que me impede de tentar achar algum erro neste momento.
Assim que possível verifico o código.
Flw.

Z

Esta faltando a ligação entre sala e usuários.

Ao invés de duas listas, use um map que para cada sala, guarde uma lista de usuários:

Map<String, List<String> chat = ...; chat.put(sala, usuarios);

o resto é com vocês.

Abraço

W

Zuvirandu, obrigado por responder.

Fiz conforme voce disse e criei um metodo para listar usuarios que estajam conectados na mesma sala, mas o que acontece é que quando solicito o metodo ele apenas mostra a sala e usuario de quem pediu e nao todos os usuarios. Segue o código de como eu fiz.

public static void ListaUser(PrintWriter outToClient,Usuario user, Sala sala){
    
    Map<String, String> chat = new HashMap<String, String>();
    chat.put(Sala.getNomeSala(), user.getNome());
    outToClient.println(chat);
    }

PS: Aqui não aceitou colocar no codigo da maneira que voce colocou; Map<String, List chat = …;

Criado 21 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 7
Participantes 3