Jonas Backer,
Não entendi o for que você colocou no método armazena:
for(int i=0;(LISTA_DE_NOMES.size()>=5);i++){
Isso é para testar se a lista tem 5 elementos ou mais? Nesse caso não basta um if?
Se a questão é limitar a lista a no máximo 5 nomes, e não permitir incluir o nome se ele já existe, acredito que a forma abaixo resolva:
public void armazena(String newName) throws Exception {
if(LISTA_DE_NOMES.size()>=5){
throw new Exception("O numero de nomes da lista ja chegou ao maximo");
}else if(LISTA_DE_NOMES.contains(newName)){
throw new Exception("Este nome ja existe! Conecte novamente com outro Nome.");
}else{
//adiciona na lista
LISTA_DE_NOMES.add(newName);
}
}
E dentro do método run() da classe ServidorSocket ficaria assim:
public void run()
{
try {
// .......
this.nomeCliente = entrada.readLine();
try{
armazena(this.nomeCliente);
CLIENTES.add(saida);
//mostra o nome do cliente conectado ao servidor
System.out.println(this.nomeCliente + " : Conectado ao Servidor!");
}catch(Exception e){
saida.println(e.getMessage());
//fecha a conexao com este cliente
this.conexao.close();
return;
}
// ........
Dessa forma, se a lista estiver cheia ou o nome já existir, será lançada a Exception. A Exception será tratada no catch da seguinte forma: a mensagem de erro será colocada na saída e e a conexão (Socket) será fechada.
Você pode também criar classes de Exception personalizadas para as diferentes condições que podem ocorrer, e lançar exceções das classes personalizadas. Teriam vários catch, um para cada classe de Exception.
Fiquei em dúvida quanto ao synchronized.
Se alguém souber favor responder à dúvida: no exemplo do Jonas os métodos armazena e remove, dentro da classe ServidorSocket, devem ser synchronized? Ou só se os métodos armazena e remove estivessem em uma classe separada, compartilhada pelos threads?
Explicando melhor a classe separada que estou pensando: poderia haver uma classe separada para encapsular a lista de nomes, chamada por exemplo de ListaNomes. ListaNomes teria os métodos armazena e remove. Os novos Threads iriam receber o mesmo objeto da classe ListaNomes e iriam chamar armazena e remove nesse objeto. Os métodos armazena e remove de ListaNomes teriam que ser synchronized para evitar problemas de concorrência quando fossem chamados ao mesmo tempo por threads diferentes.