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("----------------------------------------");
}
}