Escolar Documentos
Profissional Documentos
Cultura Documentos
com/2011/02/04/chat-multiusuario-com-socket/
1 de 3
11/11/2011 07:59
http://mballem.wordpress.com/2011/02/04/chat-multiusuario-com-socket/
048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 } }
System.out.println("ServidorSocket rodando na porta 5555"); // Loop principal. while (true) { // aguarda algum cliente se conectar. // A execuo do servidor fica bloqueada na chamada do mtodo accept da // classe ServerSocket at que algum cliente se conecte ao servidor. // O prprio mtodo desbloqueia e retorna com um objeto da classe Socket Socket conexao = server.accept(); // cria uma nova thread para tratar essa conexo Thread t = new ServidorSocket(conexao); t.start(); // voltando ao loop, esperando mais algum se conectar. } } catch (IOException e) { // caso ocorra alguma excesso de E/S, mostre qual foi. System.out.println("IOException: " + e);
// execuo da thread public void run() { try { // objetos que permitem controlar fluxo de comunicao que vem do cliente BufferedReader entrada = new BufferedReader(new InputStreamReader(this.conexao.getInputStream())); PrintStream saida = new PrintStream(this.conexao.getOutputStream()); // recebe o nome do cliente this.nomeCliente = entrada.readLine(); //chamada ao metodo que testa nomes iguais if (armazena(this.nomeCliente)){ saida.println("Este nome ja existe! Conecte novamente com outro Nome."); CLIENTES.add(saida); //fecha a conexao com este cliente this.conexao.close(); return; } else { //mostra o nome do cliente conectado ao servidor System.out.println(this.nomeCliente + " : Conectado ao Servidor!"); } //igual a null encerra a execuo if (this.nomeCliente == null) { return; } //adiciona os dados de saida do cliente no objeto CLIENTES CLIENTES.add(saida); //recebe a mensagem do cliente String msg = entrada.readLine(); // Verificar se linha null (conexo encerrada) // Se no for nula, mostra a troca de mensagens entre os CLIENTES while (msg != null && !(msg.trim().equals(""))) { // reenvia a linha para todos os CLIENTES conectados sendToAll(saida, " escreveu: ", msg);
2 de 3
11/11/2011 07:59
http://mballem.wordpress.com/2011/02/04/chat-multiusuario-com-socket/
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 } } } } } } }
// espera por uma nova linha. msg = entrada.readLine(); //se cliente enviar linha em branco, mostra a saida no servidor System.out.println(this.nomeCliente + " saiu do bate-papo!"); //se cliente enviar linha em branco, servidor envia mensagem de saida do chat aos CLIENTES conectados sendToAll(saida, " saiu", " do bate-papo!"); //remove nome da lista remove(this.nomeCliente); //exclui atributos setados ao cliente CLIENTES.remove(saida); //fecha a conexao com este cliente this.conexao.close(); } catch (IOException e) { // Caso ocorra alguma excesso de E/S, mostre qual foi. System.out.println("Falha na Conexao... .. ."+" IOException: " + e);
// enviar uma mensagem para todos, menos para o prprio public void sendToAll(PrintStream saida, String acao, String msg) throws IOException { Enumeration e = CLIENTES.elements(); while (e.hasMoreElements()) { // obtm o fluxo de sada de um dos CLIENTES PrintStream chat = (PrintStream) e.nextElement(); // envia para todos, menos para o prprio usurio if (chat != saida) { chat.println(this.nomeCliente + acao + msg);
3 de 3
11/11/2011 07:59