Introdução às Redes de Computadores/Troca de mensagens instantâneas

Projeto PCH

editar

PCH (Protocolo de Comunicação Híbrido)

Descrição:

editar

O objetivo é implementar um protocolo que permite a troca de mensagens de forma híbrida, ou seja, cliente-servidor e peer-to-peer (P2P). Cliente-servidor, uma vez que todos os usuários, quando conectados, são gravados pelo servidor em uma lista, permitindo verificar a qualquer momentos quais "amigos" estão conectados. P2P pois a comunicação entre usuários se dará de forma direta, ou seja, ocorre sem necessidade de passar por um servidor intermediário, causando assim um menor uso de recursos do servidor, lembrando que caso um cliente não consiga conexão direta com outro por algum problema como firewall, o sistema consegue fazer a comunicação via servidor normalmente

Arquitetura:

editar

Híbrida (cliente-servidor/peer-to-peer)

Funcionalidades:

editar

Funcionalidades que merecem destaque são trocas de mensagens de forma hibrida cliente - cliente, e cliente - servidor - cliente

Referencial teórico:

editar

DEITEL, H. M.; DEITEL, M. J. Java: Como Programar. Bookman 3ª ed. 2002.

KUROSE,J. F.; ROSS,K. W. Redes de Computadores e a Internet - Uma abordagem top-down, 3ª Edição

TANENBAUM, A. S. Redes de Computadores; 4ª edição

http://www.sumersoft.com/publicacoes/SocketsEmJAVA.pdf

Código-fonte:

editar

Toda a implementação, utilizando orientação a objetos em linguagem Java, está distribuída por cinco pacotes principais (data, main, engine, server e configuracoes), cujo conteúdo de suas classes será inserido nas seções seguintes.

Package br.com.ufg.data

editar

No pacote br.com.ufg.data, duas classes são implementadas: "MensagemProtocol" e "Usuario". Na primeira delas, é implementada toda a base para o correto funcionamento do protocolo PCH. A classe "Usuario", por sua vez, é responsável pela autenticação do usuário, determinando e armazenando seu nome, data e hora de logon, além do endereço IP.

MensagemProtocol.java
editar
 package br.com.ufg.data;
 import java.io.Serializable;
 import java.util.Date;
 /**
  * @version 1.0.0
  * @since   October,10 2008
  * @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
  */
 public class MensagemProtocol implements Serializable{
       /**  
        * variaveis private da classe
        */
       private static final long serialVersionUID = -6752677915267361032L;
       public static final int TIPO_LOGON = 1;
       public static final int TIPO_LOGOFF = 2;
       public static final int TIPO_ENVIA_MSG_PRIVADA = 3;
       public static final int TIPO_ENVIA_MSG_TODOS = 4;
       public static final int TIPO_ENVIA_ARQUIVO = 5;
       public static final int TIPO_REENCAMINHA_MSG_PRIVADA = 6;
       public static final int TIPO_BUSCA_LISTA = 7;
       public static final int TIPO_ERRO = 8;
       public static final int TIPO_LOGON_OK = 9;
       public static final int TIPO_ENVIA_USUARIO = 10;
       public static final int TIPO_CONFIRMA_CONEXAO = 11;
       public static final int TIPO_CONFIRMACAO_FEITA = 12;
       public static final int TIPO_MUDA_NOME = 13;
       public static final int TIPO_LOGOFF_CONCEDIDO = 14;
       private Date data;
       private int tipo;
       private String ip;
       private int porta;
       private String ipRemetente;
       private String parametro1;
       private String parametro2;
       private String parametro3;
       /**
        * Construtor do Bean Pedido
        */
       public MensagemProtocol(){
               data = new Date();
               tipo = -1;
               parametro1 = "";
               parametro2 = "";
               parametro3 = "";
       }
       //SETS AND GETS
       public Date getData() {
       	return data;
       }
       public void setData(Date data) {
        	this.data = data;
       }
       public int getTipo() {
         	return tipo;
       }
       public void setTipo(int tipo) {
         	this.tipo = tipo;
       }
       public String getIp() {
           return ip;
       }
       public void setIp(String ip) {
           this.ip = ip;
       }
       public String getParametro1() {
           return parametro1;
       }
       public void setParametro1(String parametro1) {
           this.parametro1 = parametro1;
       }
       public String getParametro2() {
           return parametro2;
       }
       public void setParametro2(String parametro2) {
           this.parametro2 = parametro2;
       }
       public String getParametro3() {
           return parametro3;
       }
       public void setParametro3(String parametro3) {
           this.parametro3 = parametro3;
       }
       public String getIpRemetente() {
           return ipRemetente;
       }
       public void setIpRemetente(String ipRemetente) {
           this.ipRemetente = ipRemetente;
       }
       public int getPorta() {
           return porta;
       }
       public void setPorta(int porta) {
           this.porta = porta;
       }
 }
Usuario.java
editar
 package br.com.ufg.data;
import java.io.Serializable;
 import java.util.Date;
 /**
* @version 1.0.0
* @since   October,10 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class Usuario implements Serializable{
   
   /**  
    * variaveis private da classe
    */
   private static final long serialVersionUID = 3207484636343112605L;
   
   public String ip;
   public int porta;
   
   public String nomeExibicao;
   public Date dataLogon;
   /**  
    * Construtor
    */
   public Usuario(){
       
   }
   
   //SETS AND GETS
   public String getIp() {
       return ip;
   }
   public void setIp(String ip) {
       this.ip = ip;
   }
   public String getNomeExibicao() {
       return nomeExibicao;
   }
   public void setNomeExibicao(String nomeExibicao) {
       this.nomeExibicao = nomeExibicao;
   }
   public Date getDataLogon() {
       return dataLogon;
   }
   public void setDataLogon(Date dataLogon) {
       this.dataLogon = dataLogon;
   }
   
 }

Package br.com.ufg.engine

editar

O pacote br.com.ufg.engine apresenta duas classes: ClientEngine e ServerEngine. Essas duas classes implementam todos os tratamentos a serem dados, tanto do lado cliente quanto do lado servidor. Na primeira delas, é implementado o tratamento a ser dado, do lado cliente, para a conexão e desconexão do usuário, envio e reenvio de mensagens e arquivos, captura de endereço IP, controle de erros e busca de usuários na lista de autenticados. A classe ServerEngine trata de todas as particularidades do lado servidor, tais como autenticação de usuário, inserção em uma lista de usuários logados, confirmação de envio e recebimento de mensagens e arquivos, etc.


ClientEngine.java
editar
 package br.com.ufg.engine;
 import java.text.SimpleDateFormat;
 import java.util.List;
 import br.com.ufg.data.MensagemProtocol;
 import br.com.ufg.data.Usuario;
 import br.com.ufg.main.InterfaceClienteCliente;
 import br.com.ufg.server.ClientService;
 import configuracoes.CONFIG;
 import java.util.Date;
 import javax.swing.DefaultListModel;
 import javax.swing.JButton;
 import javax.swing.JTextArea;
 /**
* @version 1.0.0
* @since   October,15 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class ClientEngine implements Runnable{
   /**  
    * variaveis private da classe
    */
   private List<Usuario> listaUsuarios;    
       private Usuario usuario;
   
   private List<MensagemProtocol> msgProtocol;
       private List<MensagemProtocol> bufferEnvio;
   
   private JButton butao;
   private JTextArea minhaAreaTexto;
   private JTextArea meuCampoTexto;
       
       private List<InterfaceClienteCliente> listaInterfacesAbertas;
       
       private DefaultListModel lista;
       
       private ClientService cs;
       
   /**  
    * Construtor
    */
   public ClientEngine(ClientService cs,List<MensagemProtocol> msg,List<MensagemProtocol> buffer,JButton button,JTextArea minhaAreaTexto,JTextArea texto,List<Usuario> listaUsuarios,DefaultListModel lista,List<InterfaceClienteCliente> listaInterfacesAbertas){
       
       this.butao = button;
       this.minhaAreaTexto = minhaAreaTexto;
       this.meuCampoTexto = texto;
       this.msgProtocol = msg;
               this.listaUsuarios = listaUsuarios;
               this.lista = lista;
               this.bufferEnvio = buffer;
               this.cs = cs;
               
               this.listaInterfacesAbertas = listaInterfacesAbertas;
       
   }
   
   /**  
    * Run
    */
   public void run(){
       //roda indefinidamente
       while(true){
           
           //sincorniza o buffer
           synchronized (msgProtocol) {
               
               if(msgProtocol.size()==0){
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }
               }else{
                   
                   Processa(msgProtocol.get(0));
                   msgProtocol.remove(0);
                   
               }
           }
       }
   }
   
   /**  
    * Processa
    * 
    * @param MensagemProtocol msg
    */
   public void Processa(MensagemProtocol msg){
       
           System.out.println("PROCESSANDO PROTOCOLO CLIENTE - "+msg.getTipo()+" - "+msg.getIpRemetente());
           
           InterfaceClienteCliente inter = null;
           
           SimpleDateFormat sl = new SimpleDateFormat();
           sl.applyPattern("HH:mm");
           String dataFormatada = sl.format(msg.getData());
           
           Usuario user;
           
       switch (msg.getTipo()) {
       case 1: 
           
           //NAO RESPONDE A ESSE TIPO DE MENSAGEM
           
           break;
       case 2: 
           
           //
                       // REMOVER USUARIO LOGADO
                       //
                       
                       Usuario userRemover = null;
                   
                       //roda a lista buscando entre os usuarios qual se deslogou
                       for(Usuario usertemp : listaUsuarios){
                           
                           //se achar
                           if(msg.getParametro1().equals(usertemp.getIp())){
                               userRemover = usertemp;
                           }
                           
                       }
                       
                       // se achou
                       if(userRemover != null){
                           
                           //remove
                           listaUsuarios.remove(userRemover);
                           lista.removeElement(userRemover.getNomeExibicao());
   
                       }    
           
           break;
       case 3: 
   
                       //
                       // Recebeu uma Mensagem Privada
                       //
                   
                       //analisa se existe a interface aberta
                       for(InterfaceClienteCliente it : listaInterfacesAbertas){
                           
                           if(it.getEle().getIp().equals(msg.getIpRemetente())){
                               inter = it;
                           }
                           
                       }
                       
                       if(inter==null){
                           
                           user = null;
                   
                           for(Usuario usertemp : listaUsuarios){
                               if(usertemp.getIp().equals(msg.getIpRemetente())){
                                   user = usertemp;
                               }
                           }
                           
                           if(user!=null){
                           
                               inter = new InterfaceClienteCliente(this.cs, user);
                               listaInterfacesAbertas.add(inter);
                               inter.setVisible(true);
                               inter.setModoServidor(false);
                               inter.getChatField().append(msg.getParametro1()+" \n");
                               
                           }    
                           
                       }else{
                           
                           inter.setVisible(true);
                           inter.setModoServidor(false);
                           inter.getChatField().append(msg.getParametro1()+" \n");
                           
                       }
                       
                       
   
           break;
       case 4: 
           
                       //
                       // RECENDO MENSAGEM GERAL
                       //
                   
                       minhaAreaTexto.append(dataFormatada+": "+msg.getParametro2()+" : "+msg.getParametro1()+" \n");   
           
           break;
       case 5: 
           
           //
                       // TIPO ENVIA DE ARQUIVO NAO SUPORTADO AINDA
                       //
           
           break;
       case 6: 
   
                       //
                       // Recebeu uma Mensagem Privada Encaminhada do servidor
                       //
                   
                       //analisa se existe a interface aberta
                       for(InterfaceClienteCliente it : listaInterfacesAbertas){
                           
                           if(it.getEle().getIp().equals(msg.getParametro2())){
                               inter = it;
                           }
                           
                       }
                       
                       if(inter!=null){
                           
                           user = null;
                   
                           for(Usuario usertemp : listaUsuarios){
                               if(usertemp.getIp().equals(msg.getParametro2())){
                                   user = usertemp;
                               }
                           }
                           
                           if(user!=null){
                           
                               inter = new InterfaceClienteCliente(this.cs, user);
                               listaInterfacesAbertas.add(inter);
                               inter.setVisible(true);
                           
                               inter.setModoServidor(true);
                               inter.getChatField().append(msg.getParametro1()+" \n");
                           }    
                           
                           
                       }else{
                           
                           inter.setVisible(true);
                           inter.setModoServidor(true);
                           inter.getChatField().append(msg.getParametro1()+" \n");
                           
                       }
                       
                       
                       
   
           break;    
       case 7: 
           
           
           
           break;
       case 8: 
   
   
   
           break;    
       case 9: 
           
           //CONFIRMA QUE HOUVE UM ACEITE NO LOGON
           
           minhaAreaTexto.append(dataFormatada+" : Você esta Logado como "+msg.getParametro1()+" \n");
           butao.setEnabled(true);
           meuCampoTexto.setEditable(true);
           meuCampoTexto.setEnabled(true);
           
                       user = new Usuario();
                       user.setDataLogon(msg.getData());
                       user.setNomeExibicao(msg.getParametro1());
                       user.setIp(msg.getParametro2());
                       
                       usuario = user;
                       
                       listaUsuarios.add(user);
                       lista.addElement(user.getNomeExibicao());
                       
           break;    
       
       case 10: 
                       //
                       // RECEBIMENTO DE USUARIO PARA LISTA
                       //
                   
                       user = new Usuario();
                   
                       user.setDataLogon(new Date(Long.parseLong(msg.getParametro3())));
                       user.setIp(msg.getParametro1());
                       user.setNomeExibicao(msg.getParametro2());
                       
                       if(usuario.getIp().equals(user.getIp()) && usuario.getNomeExibicao().equals(user.getNomeExibicao())){
                       }else{
                           listaUsuarios.add(user);
                           lista.addElement(user.getNomeExibicao());
                       }
                   
           break;    
               case 11: 
                   
                       //
                       // Envia uma Tentativa de Comunicacao direta com outro cliente
                       //
                   
                       MensagemProtocol mp = new MensagemProtocol();
                       
                       mp = new MensagemProtocol();
                       mp.setIp(msg.getIpRemetente());
                       mp.setData(new Date());
                       mp.setTipo(MensagemProtocol.TIPO_CONFIRMACAO_FEITA);
                       if(msg.getIpRemetente().equals(CONFIG.IP_SERVIDOR)){
                           mp.setPorta(CONFIG.PORTA_SERVIDOR);
                       }else{
                           mp.setPorta(CONFIG.PORTA_CLIENTE);
                       }
                       bufferEnvio.add(mp);
                   
                       break;    
               
               case 12: 
                   
                       //
                       // Recebeu uma confirmacao que existe uma conexao direta com o cliente
                       //
                   
                       inter = null;
                   
                       //analisa se existe a interface aberta
                       for(InterfaceClienteCliente it : listaInterfacesAbertas){
                           
                           if(it.getEle().getIp().equals(msg.getIpRemetente())){
                               inter = it;
                           }
                           
                       }
                       
                       if(inter!=null){
                           
                           inter.setModoServidor(false);
                           
                       }
                   
                       break;    
               
               case 13:         
                       
                       //
                       // Muda Nome Usuario
                       //
                   
                       Usuario userAlterar = null;
                   
                       //roda a lista buscando entre os usuarios qual se deslogou
                       for(Usuario usertemp : listaUsuarios){
                           
                           //se achar
                           if(msg.getParametro2().equals(usertemp.getIp())){
                               userAlterar = usertemp;
                           }
                           
                       }
                       
                       // se achou
                       if(userAlterar != null){
                           
                           minhaAreaTexto.append(dataFormatada+" - "+msg.getIpRemetente()+": O Usuario "+userAlterar.getNomeExibicao()+" Alterou o Nome para "+msg.getParametro1()+" \n");
                           
                           //remove
                           listaUsuarios.remove(userAlterar);
                           lista.removeElement(userAlterar.getNomeExibicao());
                           
                           userAlterar.setNomeExibicao(msg.getParametro1());
                           
                           listaUsuarios.add(userAlterar);
                           lista.addElement(userAlterar.getNomeExibicao());
                           
                       }
                       
                       break;    
                       
               case 14:         
                       
                       //
                       // LOGOFF CONCEDIDO
                       //
                   
                       System.exit(0);
                   
                       break;
                       
       default:
           break;
       }
       
   }
   
 }
ServerEngine.java
editar
 package br.com.ufg.engine;
 import java.text.SimpleDateFormat;
 import java.util.List;
 import javax.swing.JTextArea;
 import br.com.ufg.data.MensagemProtocol;
 import br.com.ufg.data.Usuario;
 import configuracoes.CONFIG;
 import java.util.Date;
 import javax.swing.DefaultListModel;
 /**
* @version 1.0.0
* @since   October,15 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class ServerEngine implements Runnable{
   /**  
    * variaveis private da classe
    */
   private List<Usuario> listaUsuarios;
   
   private List<MensagemProtocol> msgProtocol;
   private List<MensagemProtocol> bufferdeEnvio;
   
   private JTextArea minhaAreaTexto;
       private DefaultListModel lista;
       
   /**  
    * Construtor
    */
   public ServerEngine(List<MensagemProtocol> recebimento, List<MensagemProtocol> envio,JTextArea minhaAreaTexto,List<Usuario> listaUsuarios,DefaultListModel lista){
       
       this.msgProtocol = recebimento;
       this.bufferdeEnvio = envio;
       
       this.minhaAreaTexto = minhaAreaTexto;
               this.listaUsuarios = listaUsuarios;
               this.lista = lista;
               
   }
   
   /**  
    * Run
    */
   public void run(){
       //roda indefinidamente
       while(true){
           
           //sincorniza o buffer
           synchronized (msgProtocol) {
               
               if(msgProtocol.size()==0){
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }
               }else{
                   
                   Processa(msgProtocol.get(0));
                   msgProtocol.remove(0);
                   
               }
           }
       }
   }
   
   /**  
    * Processa
    * 
    * @param MensagemProtocol msg
    */
   public void Processa(MensagemProtocol msg){
       
               System.out.println("PROCESSANDO PROTOCOLO SERVIDOR - "+msg.getTipo()+" - "+msg.getIpRemetente());
           
               //organiza a data
               SimpleDateFormat sl = new SimpleDateFormat();
               sl.applyPattern("HH:mm");
               String dataFormatada = sl.format(msg.getData()) + "-" + msg.getIp();
               
       switch (msg.getTipo()) {
       
       //pedido de logon
       case 1: 
           
           try{
           minhaAreaTexto.append(dataFormatada+" - "+msg.getIpRemetente()+": O Usuario "+msg.getParametro1()+" Acabou de se logar \n");
                       
                       Usuario user = new Usuario();
                       user.setIp(msg.getIpRemetente());
                       user.setNomeExibicao(msg.getParametro1());
                       user.setDataLogon(msg.getData());
                       Logon(user);
                       
           //mensagem de retorno
           MensagemProtocol mp = new MensagemProtocol();
   
           mp.setIp(msg.getIpRemetente());
                       mp.setTipo(MensagemProtocol.TIPO_LOGON_OK);
                       mp.setData(new Date());
                       mp.setPorta(CONFIG.PORTA_CLIENTE);
                       mp.setParametro1(msg.getParametro1());
                       mp.setParametro2(msg.getIpRemetente());
                       System.out.println("ENVIANDO SERVIDOR1 - "+mp.getTipo()+" - "+mp.getIp());
           bufferdeEnvio.add(mp);
                       
                       for(Usuario usertemp : listaUsuarios){
                           
                           MensagemProtocol mp3 = new MensagemProtocol();
   
                           mp3.setIp(usertemp.getIp());
                           mp3.setTipo(MensagemProtocol.TIPO_ENVIA_USUARIO);
                           mp3.setData(new Date());
                           mp3.setPorta(CONFIG.PORTA_CLIENTE);
                           mp3.setParametro1(user.getIp());
                           mp3.setParametro2(user.getNomeExibicao());
                           mp3.setParametro3(user.getDataLogon().getTime()+"");
                           
                           
                           if(usertemp!=user){
                               System.out.println("ENVIANDO SERVIDOR2 - "+mp3.getTipo()+" - "+mp3.getIp());
                               bufferdeEnvio.add(mp3);
                           }
                           
                       }
                       
                       //ENVIANDO A LISTA DE USUARIO AO NOVO USUARIO LOGADO
                       for(Usuario usertemp : listaUsuarios){
                        
                           MensagemProtocol mp2 = new MensagemProtocol();
                           
                           mp2.setIp(msg.getIpRemetente());
                           mp2.setTipo(MensagemProtocol.TIPO_ENVIA_USUARIO);
                           mp2.setPorta(CONFIG.PORTA_CLIENTE);
                           mp2.setData(new Date());
                           mp2.setParametro1(usertemp.getIp());
                           mp2.setParametro2(usertemp.getNomeExibicao());
                           mp2.setParametro3(usertemp.getDataLogon().getTime()+"");
                           
                           if(!usertemp.getNomeExibicao().equals(user.getNomeExibicao())){
                               System.out.println("ENVIANDO SERVIDOR3 - "+mp2.getTipo()+" - "+mp2.getIp());
                               bufferdeEnvio.add(mp2);
                           }  
                           
                       }
  
           }catch (Exception e) {
               minhaAreaTexto.append("Erro Durante o Processamento de um Pacote Tipo 1");
           }    
           break;
       case 2: 
           
           //
                       // REMOVER USUARIO LOGADO
                       //
                   
                       Usuario userRemover = null;
                   
                       //roda a lista buscando entre os usuarios qual se deslogou
                       for(Usuario usertemp : listaUsuarios){
                           
                           //se achar
                           if(msg.getIpRemetente().equals(usertemp.getIp())){
                               userRemover = usertemp;
                           }
                           
                       }
                       
                       // se achou
                       if(userRemover != null){
                           
                           MensagemProtocol mp2 = new MensagemProtocol();
                           mp2.setIp(userRemover.getIp());
                           mp2.setTipo(MensagemProtocol.TIPO_LOGOFF_CONCEDIDO);
                           mp2.setPorta(CONFIG.PORTA_CLIENTE);
                           mp2.setData(new Date());
                           
                           System.out.println("ENVIANDO SERVIDOR10 - "+mp2.getTipo()+" - "+mp2.getIp());
                           bufferdeEnvio.add(mp2);
                           
                           minhaAreaTexto.append(dataFormatada+" - "+msg.getIpRemetente()+": O Usuario "+userRemover.getNomeExibicao()+" Acabou de se Deslogar \n");
                           
                           //remove
                           listaUsuarios.remove(userRemover);
                           lista.removeElement(userRemover.getNomeExibicao());
                           
                           //envia para os outros usuarios que foi removido
                           for(Usuario usertemp : listaUsuarios){
                           
                               MensagemProtocol mp = new MensagemProtocol();
                               mp.setIp(usertemp.getIp());
                               mp.setTipo(MensagemProtocol.TIPO_LOGOFF);
                               mp.setPorta(CONFIG.PORTA_CLIENTE);
                               mp.setData(new Date());
                               mp.setIpRemetente(userRemover.getIp());
                               mp.setParametro1(userRemover.getNomeExibicao());
                               System.out.println("ENVIANDO SERVIDOR5 - "+mp.getTipo()+" - "+mp.getIp());
                               bufferdeEnvio.add(mp);
                           }
                           
                       }
           
           break;
       case 3: 
   
                       for(Usuario usertemp : listaUsuarios){
                           
                           if(usertemp.getIp().equals(msg.getParametro2())){
                               
                               MensagemProtocol mp = new MensagemProtocol();
   
                               mp.setIp(usertemp.getIp());
                               mp.setTipo(MensagemProtocol.TIPO_REENCAMINHA_MSG_PRIVADA);
                               mp.setData(new Date());
                               mp.setIpRemetente(usertemp.getIp());
                               mp.setPorta(CONFIG.PORTA_CLIENTE);
                               mp.setParametro1(msg.getParametro1());
                               System.out.println("ENVIANDO SERVIDOR7 - "+mp.getTipo()+" - "+mp.getIp());
                               bufferdeEnvio.add(mp);
                               
                           }
                           
                       }
   
           break;
       case 4: 
                       for(Usuario usertemp : listaUsuarios){
                           
                           MensagemProtocol mp = new MensagemProtocol();
   
                           mp.setIp(usertemp.getIp());
                           mp.setTipo(MensagemProtocol.TIPO_ENVIA_MSG_TODOS);
                           mp.setData(new Date());
                           mp.setIpRemetente(usertemp.getIp());
                           mp.setPorta(CONFIG.PORTA_CLIENTE);
                           mp.setParametro1(msg.getParametro1());
                           mp.setParametro2(msg.getParametro2());
                           
                           System.out.println("ENVIANDO SERVIDOR4 - "+mp.getTipo()+" - "+mp.getIp());
                           bufferdeEnvio.add(mp);
                           
                       }
           
           break;
       case 5: 
           
           
           
           break;
       case 6: 
   
                       
   
           break;    
       case 7: 
           
                       //NENHUM TRATAMENTO AINDA
           
           break;
       case 8: 
   
   
   
           break;    
       case 9: 
           
           //SERVIDOR NAO RESPONDE ESSE TIPO DE MENSAGEM
           
           break;    
       
       case 10: 
   
                       //SERVIDOR NAO RESPONDE ESSE TIPO DE MENSAGEM
   
           break;    
                       
               case 11: 
   
                       //SERVIDOR NAO RESPONDE ESSE TIPO DE MENSAGEM
   
           break;    
                       
               case 12: 
   
                       //SERVIDOR NAO RESPONDE ESSE TIPO DE MENSAGEM
   
           break;    
                       
               case 13: 
   
                       //
                       // Muda Nome Usuario
                       //
                   
                       Usuario userAlterar = null;
                   
                       //roda a lista buscando entre os usuarios qual se deslogou
                       for(Usuario usertemp : listaUsuarios){
                           
                           //se achar
                           if(msg.getIp().equals(usertemp.getIp())){
                               userAlterar = usertemp;
                           }
                           
                       }
                       
                       // se achou
                       if(userAlterar != null){
                           
                           minhaAreaTexto.append(dataFormatada+" - "+msg.getIpRemetente()+": O Usuario "+userAlterar.getNomeExibicao()+" Alterou o Nome para "+msg.getParametro1()+" \n");
                           
                           //remove
                           listaUsuarios.remove(userAlterar);
                           lista.removeElement(userAlterar.getNomeExibicao());
                           
                           userAlterar.setNomeExibicao(msg.getParametro1());
                           
                           listaUsuarios.add(userAlterar);
                           lista.addElement(userAlterar.getNomeExibicao());
                           
                           //envia para os outros usuarios que foi removido
                           for(Usuario usertemp : listaUsuarios){
                           
                               MensagemProtocol mp = new MensagemProtocol();
                               mp.setIp(usertemp.getIp());
                               mp.setTipo(MensagemProtocol.TIPO_MUDA_NOME);
                               mp.setPorta(CONFIG.PORTA_CLIENTE);
                               mp.setData(new Date());
                               mp.setParametro1(userAlterar.getNomeExibicao());
                               mp.setParametro2(userAlterar.getIp());
                               System.out.println("ENVIANDO SERVIDOR6 - "+mp.getTipo()+" - "+mp.getIp());
                               bufferdeEnvio.add(mp);
                           }
                           
                       }
   
           break;    
       default:
           break;
       }
       
   }
   
   /**  
    * Logon
    * 
    * @param Usuario user
    */
   public void Logon(Usuario user){
           
       listaUsuarios.add(user);
               lista.addElement(user.getNomeExibicao());
   }
   
       /**  
    * listaUsuariosLogados
    * 
    */
   public void listaUsuariosLogados(){
           
               int i = 1;
               System.out.println("---------------------------");
       for(Usuario user : listaUsuarios){
                   
                   
                   System.out.println("Usuario "+i+user.getIp()+user.getNomeExibicao()+user.getDataLogon());
                   i++;
               }
       System.out.println("---------------------------");
   }
       
 }

Package br.com.ufg.server

editar
ClientService.java
editar
 package br.com.ufg.server;
 import java.util.ArrayList;
 import java.util.List;
 import br.com.ufg.data.MensagemProtocol;
 import br.com.ufg.data.Usuario;
 import br.com.ufg.engine.ClientEngine;
 import br.com.ufg.main.InterfaceClienteCliente;
 import configuracoes.CONFIG;
 import javax.swing.DefaultListModel;
 import javax.swing.JButton;
 import javax.swing.JTextArea;
 /**
* @version 1.0.0
* @since   October,15 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class ClientService {
   /**  
    * variaveis private da classe
    */
   private Sender sender;
   private Listener listener;
       
       private List<Conexao> listaConexao;
   
   private ClientEngine cEngine;
   
   private JButton butao;
   private JTextArea minhaAreaTexto;
   private JTextArea meuCampoTexto;
   
   private List<MensagemProtocol> bufferMensagensRecebidas;
   private List<MensagemProtocol> bufferMensagensaEnviar;
       
       private List<InterfaceClienteCliente> listaInterfacesAbertas;
       
       private List<Usuario> listaUsuarios;
       private DefaultListModel lista;
   
   /**  
    * Construtor
    */
   public ClientService(JButton button, JTextArea minhaAreaTexto,JTextArea texto,List<Usuario> listaUsuarios,DefaultListModel lista,List<InterfaceClienteCliente> listaInterfacesAbertas){
       
               listaConexao = new ArrayList<Conexao>();
           
       //instanciando varivaivei locais
       bufferMensagensaEnviar = new ArrayList<MensagemProtocol>();
       bufferMensagensRecebidas = new ArrayList<MensagemProtocol>();
       
       this.butao = button;
       this.meuCampoTexto = texto;
       this.minhaAreaTexto = minhaAreaTexto;
               
               this.listaInterfacesAbertas = listaInterfacesAbertas;
               
               this.listaUsuarios = listaUsuarios;
               this.lista = lista;
       
   }
   
   /**  
    * startSystem
    */
   public void startSystem(){
       
       //porta do servidor
               cEngine = new ClientEngine(this,bufferMensagensRecebidas,bufferMensagensaEnviar,butao,minhaAreaTexto,meuCampoTexto,listaUsuarios,lista,listaInterfacesAbertas);
               Thread t2 = new Thread(cEngine);
               t2.start();
               sender = new Sender(CONFIG.PORTA_SERVIDOR,bufferMensagensaEnviar,listaConexao,bufferMensagensRecebidas);
               Thread t3 = new Thread(sender);
               t3.start();
               
               //porta do servidor
       listener = new Listener(CONFIG.PORTA_CLIENTE,bufferMensagensRecebidas,listaConexao);
       Thread t1 = new Thread(listener);
               t1.start();
       
   }
   //SETS AND GETS
   public List<MensagemProtocol> getBufferMensagensaEnviar() {
       return bufferMensagensaEnviar;
   }
   public void setBufferMensagensaEnviar(
               List<MensagemProtocol> bufferMensagensaEnviar) {
       this.bufferMensagensaEnviar = bufferMensagensaEnviar;
   }
   
 }
Conexao.java
editar
 package br.com.ufg.server;
 import br.com.ufg.data.MensagemProtocol;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 /**
* @version 1.0.0
* @since   May,02 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class Conexao implements Runnable{
   
       private String ip;
       private String ipLocal;
       private boolean ativa;
   
       private DataInputStream in;
       private DataOutputStream out;
       
       private List<MensagemProtocol> lista;
       
       public Conexao(String ip,String local,DataInputStream in, DataOutputStream out, List<MensagemProtocol> lista){
           
           this.ipLocal = local;
           this.ip = ip;
           this.lista = lista;
           this.in = in;
           this.out = out;
           
       }
   
       /**
        * Funcao que roda a thread.
        * 
        */
       public void run(){
           
            setAtiva(true);
           
            try {
           
               while(true){
                       MensagemProtocol msg = new MensagemProtocol();
                       msg.setIp(readString(getIn()));
                       msg.setIpRemetente(readString(getIn()));
                       msg.setTipo(readInt(getIn()));
                       msg.setData(new Date(getIn().readLong()));
                       msg.setParametro1(readString(getIn()));
                       msg.setParametro2(readString(getIn()));
                       msg.setParametro3(readString(getIn()));
                       lista.add(msg);
                   }
               
               } catch (IOException e) {
                       System.out.println("Conexão Fechada");
                       setAtiva(false);
               } catch (Exception e) {
                       System.out.println("PORTA J� ESTA USADA");
                       setAtiva(false);
               }
               setAtiva(false);
               
       }
       
       private int readInt(DataInputStream in){
           
               int ch1=0;
               int ch2=0;
               int ch3=0;
               int ch4=0;
           
           try{
           
               ch1 = in.read();
               ch2 = in.read();
               ch3 = in.read();
               ch4 = in.read();
               
           }catch(Exception e){
               System.out.println("Erro Na Leitura");
           }
           
           return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));            
           
       }
       private char readChar(DataInputStream in){
           
           int ch1=0;
           int ch2=0;
           
           try{
           
               ch1 = in.read();
               ch2 = in.read();
               
           }catch(Exception e){
               System.out.println("Erro Na Leitura");
           }
           return (char)((ch1 << 8) + (ch2 << 0));
           
       }
       private String readString(DataInputStream in) {
           
           int b = readInt(in);
           String temp="";
           for(int a=0;a<b;a++){
               temp+=this.readChar(in);
           }
           
           return temp;
       }
       //SETS AND GETS
       public String getIp() {
           return ip;
       }
       public void setIp(String ip) {
           this.ip = ip;
       }
       public DataInputStream getIn() {
           return in;
       }
       public void setIn(DataInputStream in) {
           this.in = in;
       }
       public DataOutputStream getOut() {
           return out;
       }
       public void setOut(DataOutputStream out) {
           this.out = out;
       }
       public String getIpLocal() {
           return ipLocal;
       }
       public void setIpLocal(String ipLocal) {
           this.ipLocal = ipLocal;
       }
       public boolean isAtiva() {
           return ativa;
       }
       public void setAtiva(boolean ativa) {
           this.ativa = ativa;
       }
   
 }
Listener.java
editar
 package br.com.ufg.server;
 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.List;
 import br.com.ufg.data.MensagemProtocol;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 /**
* @version 1.0.0
* @since   May,02 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class Listener implements Runnable{
   /**
        * variaveis private
        */
   protected ServerSocket welcomeSocket;
       
       protected List<Conexao> listaConexoes;
   
   protected List<MensagemProtocol> lista;
   /**  
    * Construtor
    */
   public Listener(int port,List<MensagemProtocol> lista,List<Conexao> listaConexoes){
       
               this.listaConexoes = listaConexoes;
           
       this.lista = lista;
       
       try{
                   welcomeSocket = new ServerSocket(port);
       }catch (Exception e) {
                   System.out.print("Erro Inicializar Socket");
       }
       
   }
   
   /**
        * Funcao que roda a thread.
        * 
        */
       public void run(){
           
           //instancia variaveis necessarias
           Socket connectionSocket;
           DataInputStream in;
           DataOutputStream out;
               try {
                   while(true){
                   
                       connectionSocket = welcomeSocket.accept();
                       in = new DataInputStream(connectionSocket.getInputStream());
                       out = new DataOutputStream(connectionSocket.getOutputStream());
                       
                       String ipRemoto = connectionSocket.getInetAddress().getHostAddress();
                       String ipLocal = connectionSocket.getLocalAddress().getHostAddress();
                       
                       newConection(ipRemoto,ipLocal,in,out,lista);
                       
                   }
               } catch (IOException e) {
                       e.printStackTrace();
               } catch (Exception e) {
                       System.out.println("PORTA J� ESTA USADA");
               }
       }    
       
       /**
        * Funcao que adiciona uma nova Conexao
        */
       private void newConection(String ip,String local,DataInputStream in, DataOutputStream out, List<MensagemProtocol> lista){
           
               Conexao con = new Conexao(ip,local,in, out, lista);
       Thread t1 = new Thread(con);
               t1.start();
           
               listaConexoes.add(con);
               
       } 
 }
Sender.java
editar
 package br.com.ufg.server;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.net.Socket;
 import java.net.UnknownHostException;
 import java.util.List;
 import br.com.ufg.data.MensagemProtocol;
 import java.io.DataInputStream;
 import java.util.ArrayList;
 /**
* @version 1.0.0
* @since   October,15 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class Sender implements Runnable{
   /**
        * variaveis private
        */
   private Socket clientSocket;
   
   private List<Conexao> listaConexao;
       
   private List<MensagemProtocol> msgProtocol;
       private List<MensagemProtocol> msgRecebimento;
   
       private DataOutputStream dataStream;
       
   private int port;
   
   
   /**  
    * Construtor
    */
   public Sender(int port, List<MensagemProtocol> msg,List<Conexao> listaConexoes, List<MensagemProtocol> msgRec){
   
       this.port = port;
       this.msgProtocol = msg;
       this.listaConexao = listaConexoes;
               this.msgRecebimento = msgRec;
               
   }
   
   /**  
    * run
    */
   public void run(){
       
       //roda indefinidamente
       while(true){
           
           //sincorniza o buffer
           synchronized (msgProtocol) {
               
               if(msgProtocol.size()==0){
                   try {
                       Thread.sleep(100);
                   } catch (InterruptedException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }
               }else{
                   
                   Envia(msgProtocol.get(0));
                   msgProtocol.remove(0);
                   
               }
           }
       }
       
   }
   
       /**
        * Funcao que roda a thread.
        * 
        */
       public void Envia(MensagemProtocol msg){
       
           String ipSender = "";
           String ip = msg.getIp();
           port = msg.getPorta();
           
           List<Conexao> paraRemover = new ArrayList<Conexao>();
           
           boolean existe=false;
           for(Conexao con : listaConexao){
               
               if(con.getIp().equals(ip)){
                   
                   if(con.isAtiva()){
                   
                       existe = true;
                       dataStream = con.getOut();
                       ipSender = con.getIpLocal();
                           
                   }else{
                       
                       paraRemover.add(con);
                       
                   }        
               }
           }
           
           for(Conexao con : paraRemover){
               
               System.out.println("Removendo Conexao Inativa = "+con.getIp());
               listaConexao.remove(con);
               
           }
           
           Conexao con = null;
           if(!existe){
               
               try{
               
                   con = connect(ip);
                   dataStream = con.getOut();
                   ipSender = con.getIpLocal();
                   listaConexao.add(con);
                   Thread t1 = new Thread(con);
                   t1.start();
                   
               }catch(Exception e){
                   
                   System.out.println("Erro de Envio para o Ip: "+ip+" Tipo Mensagem: "+msg.getTipo());
                   
               }
               
                   
           }
           
               try {
                       dataStream.writeInt(ip.length());
                       dataStream.flush();
                       
                       dataStream.writeChars(ip);
                       dataStream.flush();
                       
                       dataStream.writeInt(ipSender.length());
                       dataStream.flush();
                       
                       dataStream.writeChars(ipSender);
                       dataStream.flush();
                       
                       dataStream.writeInt(msg.getTipo());
                       dataStream.flush();
                       
                       dataStream.writeLong(msg.getData().getTime());
                       dataStream.flush();
                       
                       dataStream.writeInt(msg.getParametro1().length());
                       dataStream.flush();
                       
                       dataStream.writeChars(msg.getParametro1());
                       dataStream.flush();
                       
                       dataStream.writeInt(msg.getParametro2().length());
                       dataStream.flush();
                       
                       dataStream.writeChars(msg.getParametro2());
                       dataStream.flush();
                       
                       dataStream.writeInt(msg.getParametro3().length());
                       dataStream.flush();
                       
                       dataStream.writeChars(msg.getParametro3());
                       dataStream.flush();
                       
                       
       } catch (IOException e) {
           e.printStackTrace();
       }
       
           }    
           /**
            * connect
            * 
            * @return Conexao
            */
           public Conexao connect(String ip){
               Conexao con = null;
               
               try {
                           clientSocket = new Socket(ip,port);
                           DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
                           DataInputStream in = new DataInputStream(clientSocket.getInputStream());
                               
                           String ipLocal = clientSocket.getLocalAddress().getHostAddress();
                           
                           con = new Conexao(ip,ipLocal,in, out, msgRecebimento);
                   } catch (UnknownHostException e) {
                           e.printStackTrace();
                   } catch (IOException e) {
                           e.printStackTrace();
                   }
               return con;
               
           }
   
           
   
 }
ServerService.java
editar
 package br.com.ufg.server;
 import java.util.ArrayList;
 import java.util.List;
 import javax.swing.JTextArea;
 import br.com.ufg.data.MensagemProtocol;
 import br.com.ufg.data.Usuario;
 import br.com.ufg.engine.ServerEngine;
 import configuracoes.CONFIG;
 import javax.swing.DefaultListModel;
 /**
* @version 1.0.0
* @since   October,15 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class ServerService {
   /**  
    * variaveis private da classe
    */
   private Listener listener;
       private Sender sender;
       
       private List<Conexao> listaConexoes;
   private ServerEngine sEngine;
   
   private JTextArea minhaAreaTexto;
   
   private List<MensagemProtocol> bufferMensagensRecebidas;
   private List<MensagemProtocol> bufferMensagensaEnviar;
       
       private List<Usuario> listaUsuarios;
       private DefaultListModel lista;
   
   /**  
    * Construtor
    */
   public ServerService(JTextArea minhaAreaTexto,List<Usuario> listaUsuarios,DefaultListModel lista){
           
               listaConexoes = new ArrayList<Conexao>();
           
       //instanciando variveis locais
       bufferMensagensRecebidas = new ArrayList<MensagemProtocol>();
       
       bufferMensagensaEnviar = new ArrayList<MensagemProtocol>();
       
       this.minhaAreaTexto = minhaAreaTexto;
               this.listaUsuarios = listaUsuarios;
               this.lista = lista;
       
   }
   
   /**   
    * startSystem
    * 
    */
   public void startSystem(){
       
       //porta do servidor
       listener = new Listener(CONFIG.PORTA_SERVIDOR,bufferMensagensRecebidas,listaConexoes);
       Thread t1 = new Thread(listener);
               t1.start();
               
               //porta do servidor
       sender = new Sender(CONFIG.PORTA_SERVIDOR,bufferMensagensaEnviar,listaConexoes,bufferMensagensRecebidas);
       Thread t3 = new Thread(sender);
               t3.start();
               sEngine = new ServerEngine(bufferMensagensRecebidas,bufferMensagensaEnviar,minhaAreaTexto,listaUsuarios,lista);
               Thread t2 = new Thread(sEngine);
               t2.start();
       
   }
   
 }

Package br.com.ufg.main

editar

No pacote br.com.ufg.main é que estão implementadas as classes encarregadas da interface gráfica de nossa aplicação.


InterfaceClienteCliente.java
editar
 package br.com.ufg.main;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
 import javax.swing.JTextField;
 import javax.swing.Timer;
 import configuracoes.CONFIG;
 import br.com.ufg.data.MensagemProtocol;
 import br.com.ufg.data.Usuario;
 import br.com.ufg.server.ClientService;
 import java.io.File;
 import javax.swing.JFileChooser;
 import javax.swing.JOptionPane;
 /**
* @version 1.0.0
* @since   May,02 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class InterfaceClienteCliente extends JFrame{
   /**
    * Variaveis Private
    */
   private static final long serialVersionUID = -6220322252463644994L;
   private JPanel panel1, panel2;
   private JButton sendMessage, eraseMessage, sendFile;
   private GridBagLayout layout;
   private GridBagConstraints gbc;
       
       private boolean modoServidor;
   
   private JTextArea sendField, chatField;
   private JScrollPane scrollChat, scrollSend, scrollPanel;
   private JTextField timer, userName;
   
       private ClientService cs;
   
       private Usuario ele;
   
       /**
        * Contrutor
        */
   public InterfaceClienteCliente(final ClientService cs,final Usuario ele){
       super(ele.getNomeExibicao());
       
               this.ele = ele;
               this.modoServidor = true;
               
               this.cs = cs;
               
       panel1 = new JPanel();
       panel2 = new JPanel();
       
       sendMessage = new JButton("Enviar mensagem");
       sendFile = new JButton("Enviar arquivo");
       eraseMessage = new JButton("Apagar");
       
       sendField = new JTextArea(5,40);
       chatField = new JTextArea(30,40);
       
       layout = new GridBagLayout();
       gbc = new GridBagConstraints();
       
       scrollChat = new JScrollPane(getChatField());
       scrollSend = new JScrollPane(sendField);
       
       timer = new JTextField(new SimpleDateFormat("hh:mm:ss").format(new Date()),5);
       userName = new JTextField(10);
       timer.setEditable(false);
       timer.setEnabled(false);
       userName.setEditable(false);
       userName.setEnabled(false);
       
       panel2.setLayout(layout);
       gbc.insets = new Insets(3,3,3,3);
       gbc.anchor = GridBagConstraints.LINE_START;
       gbc.fill  = GridBagConstraints.NONE;
       gbc.gridx = 0;
       gbc.gridy = 0;
       panel2.add(new JLabel("Horario: "),gbc);
       gbc.gridx++;
       panel2.add(timer,gbc);
       
               
       panel1.setLayout(layout);
       gbc.insets = new Insets(3,3,3,3);
       gbc.gridx = 0;
       gbc.gridy = 0;
       gbc.fill = GridBagConstraints.BOTH;
       gbc.anchor = GridBagConstraints.CENTER;
       gbc.gridwidth = 2;
       gbc.gridheight = 10;
       panel1.add(scrollChat,gbc);
       gbc.gridwidth = 1;
       gbc.gridheight = 3;
       gbc.gridy = 10;
       panel1.add(scrollSend,gbc);
       gbc.gridheight = 1;
       gbc.gridx = 1;
       panel1.add(sendMessage,gbc);
       gbc.gridy = 11;
       panel1.add(sendFile,gbc);
       gbc.gridy = 12;
       panel1.add(eraseMessage,gbc);
       gbc.gridy = 13;
       gbc.gridx = 0;
       gbc.gridwidth = 2;
       gbc.gridheight = 1;
       gbc.anchor = GridBagConstraints.EAST;
       panel1.add(panel2,gbc);
       
       Timer t = new Timer(1000,
                   new ActionListener() {  
           public void actionPerformed(ActionEvent e) {  
               InterfaceClienteCliente.this.timer.setText(new SimpleDateFormat("hh:mm:ss").format(new Date()));
           }  
                   }  
       ); 
       t.start(); 
       sendFile.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                               
                               File f = arquivoAEnviar();
                               MensagemProtocol mp = new MensagemProtocol();
                           
                               mp.setIp(CONFIG.IP_SERVIDOR);
                               mp.setPorta(CONFIG.PORTA_SERVIDOR);
                               mp.setTipo(MensagemProtocol.TIPO_ENVIA_ARQUIVO);
                               mp.setData(new Date());
                               mp.setParametro1(sendField.getText());
                               mp.setParametro2(userName.getText());
                               cs.getBufferMensagensaEnviar().add(mp);
                       }
                   }
               );
       
       sendMessage.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                           if(!sendField.getText().equalsIgnoreCase("")){
                                   
                                   if(modoServidor){
                                       
                                       MensagemProtocol mp = new MensagemProtocol();
                                       mp.setIp(CONFIG.IP_SERVIDOR);
                                       mp.setPorta(CONFIG.PORTA_SERVIDOR);
                                       mp.setTipo(MensagemProtocol.TIPO_ENVIA_MSG_PRIVADA);
                                       mp.setData(new Date());
                                       mp.setParametro1(sendField.getText());
                                       mp.setParametro2(ele.getIp());
                                       cs.getBufferMensagensaEnviar().add(mp);
                                       
                                   }else{
                                       
                                       MensagemProtocol mp = new MensagemProtocol();
                                       mp.setIp(ele.getIp());
                                       mp.setPorta(CONFIG.PORTA_CLIENTE);
                                       mp.setTipo(MensagemProtocol.TIPO_ENVIA_MSG_PRIVADA);
                                       mp.setData(new Date());
                                       mp.setParametro1(sendField.getText());
                                       cs.getBufferMensagensaEnviar().add(mp);
                                       
                                   }
                               
                                       
                                       
                                   sendField.setText("");
                           }
                       }
                   }
               );
               eraseMessage.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                               //acao
                               sendField.setText("");
                       }
                   }
               );
       
       
       scrollPanel = new JScrollPane(panel1);
       
       this.setContentPane(scrollPanel);
       this.setVisible(true);
       this.setSize(620,700);
       this.setResizable(false);
       
   }
       
       File arquivoAEnviar(){
           JFileChooser fc = new JFileChooser();
           File f;
           fc.setMultiSelectionEnabled(false);
           int returnVal = fc.showOpenDialog(fc);
           boolean flag = false;
           while(!flag){
               System.out.println("entrou no laco");
               try{
                       if(returnVal == JFileChooser.CANCEL_OPTION){
                           JOptionPane.showMessageDialog(null, "Envio cancelado.",
                                   "Mensagem",JOptionPane.WARNING_MESSAGE);
                           flag = true;
                       }
                   else{
                           f = fc.getSelectedFile();
                   if (isFile(f) && returnVal == JFileChooser.APPROVE_OPTION)
                       flag = true;
                       else{
                       returnVal = fc.showOpenDialog(fc);
                       flag = false;
                       }
                   }
               }
               catch(Exception e){
                   flag = false;
               }
           }
           if(returnVal == JFileChooser.CANCEL_OPTION){
              f = null; 
           }
           else{
               f = fc.getSelectedFile();
           }
           return f;
       }
       
       boolean isFile(File f){
           try{
               f.exists();
               return true;
           }
           catch(Exception e){
               return false;
           }
       }
       public JTextArea getChatField() {
           return chatField;
       }
       public void setChatField(JTextArea chatField) {
           this.chatField = chatField;
       }
       public Usuario getEle() {
           return ele;
       }
       public void setEle(Usuario ele) {
           this.ele = ele;
       }
       public boolean isModoServidor() {
           return modoServidor;
       }
       public void setModoServidor(boolean modoServidor) {
           this.modoServidor = modoServidor;
       }
   
 }
InterfaceClienteServidor.java
editar
 package br.com.ufg.main;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
 import javax.swing.JTextField;
 import javax.swing.Timer;
 import configuracoes.CONFIG;
 import br.com.ufg.data.MensagemProtocol;
 import br.com.ufg.data.Usuario;
 import br.com.ufg.server.ClientService;
 import java.awt.Point;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.util.ArrayList;
 import java.util.List;
 import javax.swing.DefaultListModel;
 import javax.swing.JPopupMenu;
 /**
* @version 1.0.0
* @since   May,02 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class InterfaceClienteServidor extends JFrame{
   /**
    * Variaveis Private
    */
   private static final long serialVersionUID = -6220322252463644994L;
   private JPanel panel1, panel2;
   private JButton sendMessage, eraseMessage;
   private GridBagLayout layout;
   private GridBagConstraints gbc;
   
   private JTextArea sendField, chatField;
       
       private JPopupMenu popup;
       private JMenuItem item1popup;
   private DefaultListModel usersOn;
       private JList listauser;
       private List<Usuario> usuariosLogados;
   private JMenu menu;
   private JMenuBar menuBar;
   private JMenuItem mudarNome, conectar, sair;
   private JScrollPane scrollChat, scrollSend, scrollUsers, scrollPanel;
   private JTextField timer, userName;
   
       private int usuarioSelecionado;
       
       private List<InterfaceClienteCliente> listaInterfacesAbertas;
       
       private ClientService cs;
   
   MensagemProtocol mp;
   
   
       /**
        * Contrutor
        */
   public InterfaceClienteServidor(String nameWindow){
               
               super(nameWindow);
       
               usuariosLogados = new ArrayList<Usuario>();
               listaInterfacesAbertas = new ArrayList<InterfaceClienteCliente>();
               
               
       panel1 = new JPanel();
       panel2 = new JPanel();
       
       sendMessage = new JButton("Enviar");
       eraseMessage = new JButton("Apagar");
       
       sendField = new JTextArea(5,40);
       chatField = new JTextArea(30,40);
       chatField.setEditable(false);
       
       layout = new GridBagLayout();
       gbc = new GridBagConstraints();
       
       scrollChat = new JScrollPane(chatField);
       scrollSend = new JScrollPane(sendField);
       
       //
               // menuBar
               //
               
               menuBar = new JMenuBar();
       menu = new JMenu("Chat");
       mudarNome = new JMenuItem("Mudar nome");
       conectar = new JMenuItem("Conectar");
       sair = new JMenuItem("Sair");
       
       menu.setMnemonic('c');
       mudarNome.setMnemonic('m');
       conectar.setMnemonic('n');
       sair.setMnemonic('s');
       
       menu.add(mudarNome);
       menu.add(conectar);
       menu.add(sair);
       menuBar.add(menu);
               
               //
               // fim do menuBar
               //
               
               //
               // Popup do JList
               //
               
               popup = new JPopupMenu();
               
               item1popup = new JMenuItem("Abrir Chat Privado");
                       
               item1popup.addActionListener(new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                           
                           Usuario user = usuariosLogados.get(usuarioSelecionado);
                           
                           if(user.getNomeExibicao().equals(userName)){
                           
                               InterfaceClienteCliente it = null;
                               
                               for(InterfaceClienteCliente inter : listaInterfacesAbertas){
                                   
                                   if(inter.getEle().getIp().equals(user.getIp())){
                                      
                                       it = inter;
                                       
                                   }
                                   
                                   if(inter.isVisible()){}
                                   
                               }
                               
                               if(it==null){
                                   
                                   it = new InterfaceClienteCliente(cs,usuariosLogados.get(usuarioSelecionado));
                                   listaInterfacesAbertas.add(it);
                                   it.setDefaultCloseOperation(HIDE_ON_CLOSE);
                                   
                               }else{
                                   
                                   it.setVisible(true);
                                   
                               }
                               
                               mp = new MensagemProtocol();
                               mp.setIp(user.getIp());
                               mp.setData(new Date());
                               mp.setTipo(MensagemProtocol.TIPO_CONFIRMA_CONEXAO);
                               mp.setPorta(CONFIG.PORTA_CLIENTE);
                               cs.getBufferMensagensaEnviar().add(mp);
                               
                           }else{
                               
                               chatField.append("Você não pode abrir uma janela de comunicao com você mesmo \n");
                               
                           }    
                           
                           popup.setVisible(false);
                           
                       }
                   });
               
               popup.add(item1popup);
               
               MouseListener mouse = new MouseAdapter() {  
                   @Override
                   public void mouseClicked(MouseEvent event) {  
                       int index = listauser.locationToIndex(event.getPoint());  
                       if(event.getButton()==3){
                           Point xLocation = listauser.getLocationOnScreen();
                           
                           xLocation.x += event.getX();
                           xLocation.y += event.getY();
                           
                           popup.setLocation(xLocation);
                           popup.setVisible(true);
                           popup.requestFocus();
                           usuarioSelecionado = index;
                           
                       }
                         
                   }  
               };
               
               usersOn = new DefaultListModel();
               listauser = new JList(usersOn);
               
               listauser.addMouseListener(mouse);
               
               scrollUsers = new JScrollPane(listauser);
               scrollUsers.setSize(50, 30);
               
               //
               // Fim do Popup do JList
               //
               
       timer = new JTextField(new SimpleDateFormat("hh:mm:ss").format(new Date()),5);
       userName = new JTextField(10);
       timer.setEditable(false);
       timer.setEnabled(false);
       userName.setEditable(false);
       userName.setEnabled(false);
       
       panel2.setLayout(layout);
       gbc.insets = new Insets(3,3,3,3);
       gbc.anchor = GridBagConstraints.LINE_START;
       gbc.fill  = GridBagConstraints.NONE;
       gbc.gridx = 0;
       gbc.gridy = 0;
       panel2.add(new JLabel("Nome de usuario: "), gbc);
       gbc.gridx++;
       panel2.add(userName,gbc);
       gbc.gridx--;
       gbc.gridy++;
       panel2.add(new JLabel("Horario: "),gbc);
       gbc.gridx++;
       panel2.add(timer,gbc);
       
               
       panel1.setLayout(layout);
       gbc.insets = new Insets(3,3,3,3);
       gbc.anchor = GridBagConstraints.LINE_START;
       gbc.fill  = GridBagConstraints.NONE;
       gbc.gridx = 0;
       gbc.gridy = 0;
       gbc.gridwidth = 2;
       gbc.fill = GridBagConstraints.HORIZONTAL;
       panel1.add(menuBar,gbc);
       gbc.gridwidth = 1;
       gbc.fill = GridBagConstraints.NONE;
       gbc.anchor = GridBagConstraints.CENTER;
       gbc.gridheight = 10;
       gbc.gridy = 1;
       panel1.add(scrollChat,gbc);
       gbc.gridheight = 2;
       gbc.gridy = 11;
       panel1.add(scrollSend,gbc);
       gbc.fill = GridBagConstraints.HORIZONTAL;
       gbc.gridheight = 1;
       gbc.gridx = 1;
       panel1.add(sendMessage,gbc);
       gbc.gridy = 12;
       panel1.add(eraseMessage,gbc);
       gbc.gridx = 1;
       gbc.gridy = 1;
       panel1.add(new JLabel("Usuarios OnLine"),gbc);
       gbc.gridheight = 9;
       gbc.gridy = 2;
       gbc.fill  = GridBagConstraints.BOTH;
       panel1.add(scrollUsers,gbc);
       gbc.gridy = 13;
       gbc.gridx = 0;
       gbc.gridwidth = 2;
       gbc.gridheight =1;
       gbc.anchor = GridBagConstraints.EAST;
       panel1.add(panel2,gbc);
       
       cs = new ClientService(sendMessage, chatField, sendField,usuariosLogados,usersOn,listaInterfacesAbertas);
       
       sendMessage.setEnabled(false);
       mudarNome.setEnabled(false);
       eraseMessage.setEnabled(false);
       
       conectar.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                           mp = new MensagemProtocol();
                           
                           mp.setData(new Date());
                           mp.setIp(CONFIG.IP_SERVIDOR);
                           mp.setParametro1(userName.getText());
                           mp.setPorta(CONFIG.PORTA_SERVIDOR);
                           mp.setTipo(MensagemProtocol.TIPO_LOGON);
                           cs.getBufferMensagensaEnviar().add(mp);
                           sendMessage.setEnabled(true);
                           mudarNome.setEnabled(true);
                           eraseMessage.setEnabled(true);
                           conectar.setEnabled(false);
                           
                       }
                   }
               );
       sair.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                           
                           mp = new MensagemProtocol();
                           
                           mp.setData(new Date());
                           mp.setIp(CONFIG.IP_SERVIDOR);
                           mp.setParametro1(userName.getText());
                           mp.setPorta(CONFIG.PORTA_SERVIDOR);
                           mp.setTipo(MensagemProtocol.TIPO_LOGOFF);
                           
                           cs.getBufferMensagensaEnviar().add(mp);
                           
                       }
                   }
               );                
       sendMessage.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                           if(!sendField.getText().equalsIgnoreCase("")){
                               mp = new MensagemProtocol();
                               mp.setIp(CONFIG.IP_SERVIDOR);
                               mp.setPorta(CONFIG.PORTA_SERVIDOR);
                               mp.setTipo(MensagemProtocol.TIPO_ENVIA_MSG_TODOS);
                               mp.setData(new Date());
                               mp.setParametro1(sendField.getText());
                               mp.setParametro2(userName.getText());
                               cs.getBufferMensagensaEnviar().add(mp);
                               sendField.setText("");
                           }
                       }
                   }
               );
       
       eraseMessage.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                               sendField.setText("");
                       }
                   }
               );
       
       mudarNome.addActionListener(
                   new ActionListener(){
                       public void actionPerformed(ActionEvent e){
                               JTextField novoValor = new JTextField();
                               un(InterfaceClienteServidor.this, novoValor);
                               
                               mp = new MensagemProtocol();
                               
                               mp.setIp(CONFIG.IP_SERVIDOR);
                               mp.setPorta(CONFIG.PORTA_SERVIDOR);
                               mp.setTipo(MensagemProtocol.TIPO_MUDA_NOME);
                               mp.setData(new Date());
                               mp.setParametro1(novoValor.getText());
                               cs.getBufferMensagensaEnviar().add(mp);
                               
                       }
                   }
               
               );
               
       
       scrollPanel = new JScrollPane(panel1);
       
               //
               // Tratamento de Eventos do Mouse no Frame
               //
               
               MouseListener mouseFrame = new MouseAdapter() {  
                   @Override
                   public void mouseClicked(MouseEvent event) {  
                       
                       popup.setVisible(false); 
                         
                   }  
               };
               
               this.addMouseListener(mouseFrame);
               
               //
               // Fim do Tratamento de Eventos do Mouse no Frame
               //
               
               //
               // Timer do Relogio
               //
               
               Timer t = new Timer(1000,
                   new ActionListener() {  
           public void actionPerformed(ActionEvent e) {  
                           InterfaceClienteServidor.this.timer.setText(new SimpleDateFormat("hh:mm:ss").format(new Date()));
           }  
                   }  
       ); 
       t.start(); 
               
               //
               // Fim do Timer do Relogio
               //
               
       this.add(scrollPanel);
       this.setVisible(true);
       this.setSize(730,720);
       this.setResizable(false);
       
       cs.startSystem();
   }
   
   void un (JFrame frame, JTextField field){
           String nome = "";
           while(nome.equalsIgnoreCase("")){
               try{
                   nome = JOptionPane.showInputDialog("Entre com um nome de usuario");
                   if(!nome.equalsIgnoreCase("")){
                           frame.setEnabled(true);
                           field.setText(nome);
                   }
               }
               catch (Exception e) {
                       nome = "";
               }
           }
   }
   
   public static void main(String []args){
       InterfaceClienteServidor app = new InterfaceClienteServidor("Usuario");
       app.setDefaultCloseOperation(EXIT_ON_CLOSE);
       app.setEnabled(false);
       app.un(app, app.userName);
       
   }
 }
ServerInterface.java
editar
 package br.com.ufg.main;
 import br.com.ufg.data.Usuario;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.util.ArrayList;
 import java.util.List;
 import javax.swing.DefaultListModel;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
 import br.com.ufg.server.ServerService;
 /**
* @version 1.0.0
* @since   May,02 2008
* @author  Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
             Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari
*/
 public class ServerInterface extends JFrame {
   
   /**
    * Variaveis Private
    */
   private static final long serialVersionUID = 1L;
   
   private final JTextArea minhaAreaTexto;
       private final JScrollPane scrollMyArea, scrollMyUsers, scrollPanel;
       private final GridBagLayout layout;
       private final GridBagConstraints gbc;
   private JPanel painel;
       
       private DefaultListModel usersOn;
       private JList listauser;
       private List<Usuario> usuariosLogados;
   
   private ServerService ss;
   
   /**
    * Construtor
    */
   public ServerInterface(){
   
       super("Server Interface");
       
               //
               // Lista de Usuarios
               //
               
               usuariosLogados = new ArrayList<Usuario>();
               usersOn = new DefaultListModel();
               listauser = new JList(usersOn);
       scrollMyUsers = new JScrollPane(listauser);
       
               //
               // Fim Lista Usuarios
               //
               
               //
               // Mensagens Recebidas pelo Servidor
               //
               
               JLabel labelDescricao = new JLabel("Mensagens Recebidas pelo Servidor");
               
               minhaAreaTexto = new JTextArea(20, 40);
       minhaAreaTexto.setEditable(false);
               scrollMyArea = new JScrollPane(minhaAreaTexto);
               //
               // Fim Mensagens Recebidas pelo Servidor
               //
       
               layout = new GridBagLayout();
               gbc = new GridBagConstraints();
               
       painel = new JPanel();
               painel.setLayout(layout);
               
               gbc.insets = new Insets(5,5,5,5);
               gbc.gridx = 0;
               gbc.gridy = 0;
               gbc.gridwidth = 2;
               painel.add(labelDescricao,gbc);
               gbc.gridwidth = 1;
               gbc.gridy++;
       painel.add(new JLabel("Log de Informações"),gbc);
               gbc.gridy++;
       gbc.gridheight = 5;
               painel.add(scrollMyArea,gbc);
               gbc.gridx++;
               gbc.gridy--;
               gbc.gridheight = 1;
               painel.add(new JLabel("Usuarios"),gbc);
               gbc.gridheight = 5;
               gbc.gridy++;
               gbc.fill = GridBagConstraints.BOTH;
               painel.add(scrollMyUsers,gbc);
           
               scrollPanel = new JScrollPane(painel);
       
       this.setContentPane(scrollPanel);
       this.setSize(740, 420);
       this.setVisible(true);
               this.setResizable(false);
       
               //
               // Inicia o Servico do Servidor
               //
               
       ss = new ServerService(minhaAreaTexto,usuariosLogados,usersOn);
       ss.startSystem();
               
               //
               // Fim Inicio do Servico do Servidor
               //
       
   }
   
   /**
    * main
    * 
    * @param String[] args
    */
   public static void main(String[] args) {
       
       ServerInterface app = new ServerInterface();
       app.setDefaultCloseOperation(EXIT_ON_CLOSE);
       
   }
 }

Package configuracoes

editar
CONFIG.java
editar
 package configuracoes;
 /**
*
* @author Diego Takashi Sato, Diego Delfino, Eduardo Francisco Barbosa 
          Marcos Vinícius Dias Nunes, Sandro Isao Nakano, Thiago Romano Pigari 
*/
 public class CONFIG {
   public static final String IP_SERVIDOR = "192.168.2.193";
   public static final int PORTA_SERVIDOR = 54321;
   
   public static final int PORTA_CLIENTE = 54322;
   
 }

Projetos semelhantes:

editar

códigos Deitel, chats, batepapo em grupo.

Diagrama de mensagens:

editar

 

Máquina de estados finitos:

editar