Estou com um problema ao tentar criar um chat com socket.
Tudo estava dando certo até que inclui um HashMap para colocar o nome dos clientes e o OutputStream de cada um.
Mas quando crio cada cliente, é como se fosse criado um hashmap pra cada um,
e por consequencia as mensagens não são enviadas para todos.
Classe Servidor
public class Servidor {
public static void main(String[] args) {
// inicia o servidor
new Servidor(12345).executa();
}
private int porta;
private HashMap<String, PrintStream> mapaClientes;
public Servidor(int porta) {
this.porta = porta;
this.mapaClientes = new HashMap<String, PrintStream>();
}
public void executa() {
try {
ServerSocket servidor = new ServerSocket(this.porta);
System.out.println("Porta " + servidor.getLocalPort() + " aberta!");
while (true) {
// aceita um cliente
Socket cliente = servidor.accept();
// adiciona saida do cliente a lista
PrintStream ps = new PrintStream(cliente.getOutputStream());
// this.clientes.add(ps);
// cria tratador de clientes numa nova thread
TrataCliente tc = new TrataCliente(cliente.getInputStream(),
ps, this);
new Thread(tc).start();
this.mapaClientes.put(tc.getNomeCliente(), ps);
System.out.println(cliente.getLocalPort() + " "
+ cliente.isConnected());
System.out.println(this.mapaClientes.size());
}
} catch (IOException e) {
System.out.println("IOException " + e);
}
}
public void distribuiMensagem(String nome, String msg) {
// envia msg para todo mundo
for (int i = 0; i < this.mapaClientes.size(); i++) {
PrintStream enviar = this.mapaClientes.get(i);
enviar.println(nome + " diz: " + msg);
}
}
}
Classe que trata cada cliente
public class TrataCliente implements Runnable {
private String nomeCliente;
private InputStream entradacliente;
private PrintStream saidaCliente;
private Servidor servidor;
public String getNomeCliente(){
return this.nomeCliente;
}
public TrataCliente(InputStream entradacliente, PrintStream saidaCliente,
Servidor servidor) {
this.entradacliente = entradacliente;
this.servidor = servidor;
this.saidaCliente = saidaCliente;
}
public void run() {
// pega o nome do cliente
this.saidaCliente.println("Digite seu nome: ");
Scanner s = new Scanner(this.entradacliente);
this.nomeCliente = s.nextLine();
// avisa ao cliente e ao servidor que a conexão foi feita
System.out.println(this.nomeCliente + " se conectou!");
this.saidaCliente.println("Bem-vindo " + this.nomeCliente);
// quando chegar uma msg, distribui para todos
while (s.hasNextLine()) {
servidor.distribuiMensagem(this.nomeCliente, s.nextLine());
}
s.close();
System.out.println(this.nomeCliente + " se desconectou!");
}
}
se alguem puder me dar uma luz do que pode estar errado…
Vlw