Você está na página 1de 3

http://mballem.wordpress.

com/2011/02/04/chat-multiusuario-com-socket/

view source print?


001 import java.io.BufferedReader; 002 import java.io.IOException; 003 import java.io.InputStreamReader; 004 import java.io.PrintStream; 005 import java.net.ServerSocket; 006 import java.net.Socket; 007 import java.util.ArrayList; 008 import java.util.Enumeration; 009 import java.util.List; 010 import java.util.Vector; 011 public class ServidorSocket extends Thread { 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 } public static void main(String args[]) { // instancia o vetor de CLIENTES conectados CLIENTES = new Vector(); try { // cria um socket que fica escutando a porta 5555. ServerSocket server = new ServerSocket(5555); } } //remove da lista os CLIENTES que j deixaram o chat public void remove(String oldName) { for (int i=0; i< LISTA_DE_NOMES.size(); i++){ if(LISTA_DE_NOMES.get(i).equals(oldName)) LISTA_DE_NOMES.remove(oldName); } //adiciona na lista apenas se no existir LISTA_DE_NOMES.add(newName); return false; } //testa se nomes so iguais, se for retorna true public boolean armazena(String newName){ // System.out.println(LISTA_DE_NOMES); for (int i=0; i< LISTA_DE_NOMES.size(); i++){ if(LISTA_DE_NOMES.get(i).equals(newName)) return true; // Parte que controla as conexes por meio de threads. private static Vector CLIENTES; // socket deste cliente private Socket conexao; // nome deste cliente private String nomeCliente; // lista que armazena nome de CLIENTES private static List LISTA_DE_NOMES = new ArrayList(); // construtor que recebe o socket deste cliente public ServidorSocket(Socket socket) { this.conexao = 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

Você também pode gostar