Criando um chat... Apanhando de Sockets

Boa noite galera.

Sou iniciante em JAVA, venho estudando constantemente e consequentemente, tendo dúvidas constantemente… rsrs
No trabalho me pediram pra criar um chat para ser usado a principio internamente, pra comunicação entre os departamentos já que ficamos todos divididos entre 1º, 2º,3º,7º,9º,12º,15º,16º e 17º andar, comecei a estudar sockets… Estou criando um chat, porém, essa comunicação não está saindo…
Tenho o livro do Deitel, sinceramente achei muito confuso a forma como é ensinado a usar sockets no livro dele, JAVA como programar 6º edição, procurei outras fontes e venho chegando a algumas conclusões equivocadas…

O que ocorre é que o Servidor sequer está abrindo, as mensagens estão dando erro, no Cliente as mensagens estão saindo e aparecendo no JTextArea de lá, porém, não estão chegando ao servidor, conforme o erro relatado anteriormente…

Não é nada profissional é bem amador mesmo…

Vou postar aqui o que programei até aqui e se possível, me ajudem…
Declarei algumas coisas que serão usadas mais adiante, assim que eu aprender bem a parte de sockets… Portando, podem desconsiderar a parte do java.sql.*; que eu vou aplicar mais pra frente pra gravar as conversas num banco de dados… Uma exigência da empresa…

Segue o código:

Cliente:

import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
class Cliente extends JFrame implements AdjustmentListener , ActionListener , ListSelectionListener{

	JLabel lblNomeChat, lblUsuario, lblConversa, lblMensagem, lblMensagemPre;
	JTextArea taConversa, taMensagem;
	JScrollBar scroll1, scroll2;
	JButton btEnviar, btSalvar, btLimpar, btFechar;
	JList lista;
	DefaultListModel listModel;
	
	Date data = new Date();
	
	Socket socket = null;  
	PrintStream ps = null; 
	
	Cliente(){
		super("Atendimento personalizado");
		setBounds(50,50,800,600);
		setResizable(false);
		getContentPane().setLayout(null);
		
		lblNomeChat = new JLabel("Chat");
		lblNomeChat.setBounds(5,5,200,30);
		lblNomeChat.setFont(new Font("Comic Sams",Font.BOLD,22));
		getContentPane().add(lblNomeChat);
		
		lblUsuario = new JLabel("Usuário");
		lblUsuario.setBounds(600,5,200,30);
		lblUsuario.setFont(new Font("Comic Sams",Font.BOLD,14));
		getContentPane().add(lblUsuario);
		
		lblConversa = new JLabel("Conversa: ");
		lblConversa.setBounds(5,30,200,30);
		lblConversa.setFont(new Font("Comic Sams",Font.BOLD,12));
		taConversa = new JTextArea(); 
		taConversa.setBounds(5,55,550,350);
		taConversa.setFont(new Font("Comic Sams",Font.BOLD,12));
		taConversa.setEnabled(false);
		getContentPane().add(lblConversa);
		getContentPane().add(taConversa);
				
		lblMensagem = new JLabel("Mensagem: ");
		lblMensagem.setBounds(5,410,200,30);
		lblMensagem.setFont(new Font("Comic Sams",Font.BOLD,12));
		taMensagem = new JTextArea();
		taMensagem.setBounds(5,440,550,120);
		getContentPane().add(lblMensagem);
		getContentPane().add(taMensagem);
		
		lblMensagemPre = new JLabel("Mensagens Pré-Definidas");
		lblMensagemPre.setToolTipText("Selecione um item na lista e em seguida clique em Enviar Mensagem");
		lblMensagemPre.setBounds(570,30,200,20);
		listModel = new DefaultListModel();
		listModel.addElement("Bom dia - Apresentação");
		listModel.addElement("Boa tarde - Apresentação");
		listModel.addElement("Boa noite - Apresentação");
		listModel.addElement("                        ");
		listModel.addElement("Bom dia - Encerramento");
		listModel.addElement("Boa tarde - Encerramento");
		listModel.addElement("Boa noite - Encerramento");
		lista = new JList(listModel);
		lista.addListSelectionListener(this);
		lista.setBounds(570,55,200,350);
		lista.setModel(listModel);
		getContentPane().add(lblMensagemPre);
		getContentPane().add(lista);
				
		btEnviar = new JButton("Enviar Mensagem"); btEnviar.addActionListener(this);
		btEnviar.setBounds(570,440,200,20);
		btEnviar.setToolTipText("Pressione aqui para enviar a sua mensagem.");
		btEnviar.setMnemonic(KeyEvent.VK_E);
		getContentPane().add(btEnviar);
		
		btLimpar = new JButton("Limpar Mensagem"); btLimpar.addActionListener(this);
		btLimpar.setBounds(570,470,200,20);
		btLimpar.setToolTipText("Pressione aqui para limpar o campo de mensagens do seu chat");
		btLimpar.setMnemonic(KeyEvent.VK_L);
		getContentPane().add(btLimpar);
		
		btSalvar = new JButton("Salvar Conversa"); btSalvar.addActionListener(this);
		btSalvar.setBounds(570,500,200,20);
		btSalvar.setToolTipText("Pressione aqui para salvar a conversa.");
		btSalvar.setMnemonic(KeyEvent.VK_F);
		getContentPane().add(btSalvar);
		
		btFechar = new JButton("Fechar"); btFechar.addActionListener(this);
		btFechar.setBounds(570,530,200,20);
		btFechar.setToolTipText("Pressione aqui para fechar a aplicação.");
		btFechar.setMnemonic(KeyEvent.VK_F);
		getContentPane().add(btFechar);
			
	}
	
	public void adjustmentValueChanged(AdjustmentEvent e) {
		
		
	}

	public void actionPerformed(ActionEvent e) {
		
		
		if (e.getSource()==btEnviar){
			if (taMensagem.getText().equals("")||taMensagem.getText().equals(" ")){
				JOptionPane.showMessageDialog(null, "Por favor, preencha o campo de mensagem" +
						"\n com pelo menos um caracter. Obrigado!");
			}
			else{
				taConversa.setText( taConversa.getText() 
					+ lblUsuario.getText()+ "\n" 
					+ data + "\n"
					+ taMensagem.getText()+ "\n");
			taMensagem.setText("");
			
			try{
				String recebeConversa = taConversa.getText() 
				+ lblUsuario.getText()+ "\n" 
				+ data + "\n"
				+ taMensagem.getText()+ "\n";
				
				ps = new PrintStream(socket.getOutputStream());
				ps.println(recebeConversa); 
			}
				
			catch(IOException e1) {
					
				}
			}
						
		}
		
		if(e.getSource()==btLimpar){
			taMensagem.setText("");
		}
		
		if(e.getSource()==btSalvar){
			if(taMensagem.getText().equals("")){
				JOptionPane.showMessageDialog(null, "Nada foi escrito no dialogo.");
			}
			if(taConversa.getText().equals("")){
				JOptionPane.showMessageDialog(null, "Não foi possível realizar a gravação." +
						"\nMotivo: Não existe dialogo a ser gravado.");
			}
			else{
			  PrintWriter out;
			  try {
			  out = new PrintWriter(lblUsuario.getText()+".txt");		
			  out.println("Conteúdo da conversa de: "+lblUsuario.getText());
			  out.println("Conversa gravada às: "+ data);
			  out.println("-------------------------------------------- ");
			  out.println(taConversa.getText());
			  out.println("-------------------------------------------- ");
			  out.println("Fim da conversa!");
	          out.close();
	          JOptionPane.showMessageDialog(null, "Conversa gravada com sucesso!");
			} 
			catch (FileNotFoundException e1) {
				
				e1.printStackTrace();
			}
		}
		
	}
		
		if(e.getSource()==btFechar){
			System.exit(0);
		}
	}
	
	public void valueChanged(ListSelectionEvent e) {
		
	}

	public static void main(String[] args) {
		JFrame janela = new Cliente();
		janela.setDefaultCloseOperation(EXIT_ON_CLOSE);
		janela.setVisible(true);
	}



}

Servidor:

import java.io.*;
import java.net.*;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
public class Servidor extends JFrame{

	JTextArea taConversa;
	
	ServerSocket servidor = null; 
	Socket socket = null; 
	
	BufferedReader papo;
	
	Servidor()  {
		super("Servidor");
		setResizable(false);
		setBounds(5,5,800,600);
		getContentPane().setLayout(null);
		
		taConversa = new JTextArea();
		taConversa.setBounds(5,30,780,500);
		taConversa.setEditable(false);
		getContentPane().add(taConversa);
		
		try{
		servidor = new ServerSocket(7000);
		socket = servidor.accept(); 
		papo = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
		taConversa.setText(taConversa.getText() + papo.readLine());
		socket.close(); 
		servidor.close(); 
		}
		catch (IOException e){
			
		}
	}
	
	public static void main(String args[]) throws IOException{
		JFrame srv = new Servidor();
		srv.setVisible(true);
		srv.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
}

Aguardo a ajuda de vocês, bom final de semana e bom carnaval a todos…

A sua classe Cliente apenas declara , porém em momento algum um objeto lhe é atribuído.

Provavelmente você está recebendo uma mensagem NullPointerException na linha 128, pois está tentando utilizar sendo que está como null (declarado, mas sem nenhuma atribuição de valor).

O uso de sockets no Cliente parte da premissa que você precisa indicar nele o IP e a porta que o servidor está aguardando a conexão.

Dê uma olhada em:
http://www2.unoeste.br/~chico/comunicacao_socket/index.htm

cmarquesumu
Grato pelo exemplo, estou vendo ele com calma, porém, existe alguns erros, eu modifiquei o código, veja se estou partindo pro lado certo…

[code]
import java.io.;
import java.net.
;
import javax.swing.;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.sql.
;
import java.awt.;
import java.awt.event.
;
import java.util.Date;
class Cliente extends JFrame implements AdjustmentListener , ActionListener , ListSelectionListener{

 JLabel lblNomeChat, lblUsuario, lblConversa, lblMensagem, lblMensagemPre;  
 JTextArea taConversa, taMensagem;  
 JScrollBar scroll1, scroll2;  
 JButton btEnviar, btSalvar, btLimpar, btFechar;  
 JList lista;  
 DefaultListModel listModel;  
   
 Date data = new Date();  
   
 Socket socket = new Socket("localhost",7000);    
 PrintStream ps = new PrintStream(socket.getOutputStream());    
   
 Cliente(){  
     super("Atendimento personalizado");  
     setBounds(50,50,800,600);  
     setResizable(false);  
     getContentPane().setLayout(null);  
       
     lblNomeChat = new JLabel("Chat");  
     lblNomeChat.setBounds(5,5,200,30);  
     lblNomeChat.setFont(new Font("Comic Sams",Font.BOLD,22));  
     getContentPane().add(lblNomeChat);  
       
     lblUsuario = new JLabel("Usuário");  
     lblUsuario.setBounds(600,5,200,30);  
     lblUsuario.setFont(new Font("Comic Sams",Font.BOLD,14));  
     getContentPane().add(lblUsuario);  
       
     lblConversa = new JLabel("Conversa: ");  
     lblConversa.setBounds(5,30,200,30);  
     lblConversa.setFont(new Font("Comic Sams",Font.BOLD,12));  
     taConversa = new JTextArea();   
     taConversa.setBounds(5,55,550,350);  
     taConversa.setFont(new Font("Comic Sams",Font.BOLD,12));  
     taConversa.setEnabled(false);  
     getContentPane().add(lblConversa);  
     getContentPane().add(taConversa);  
               
     lblMensagem = new JLabel("Mensagem: ");  
     lblMensagem.setBounds(5,410,200,30);  
     lblMensagem.setFont(new Font("Comic Sams",Font.BOLD,12));  
     taMensagem = new JTextArea();  
     taMensagem.setBounds(5,440,550,120);  
     getContentPane().add(lblMensagem);  
     getContentPane().add(taMensagem);  
       
     lblMensagemPre = new JLabel("Mensagens Pré-Definidas");  
     lblMensagemPre.setToolTipText("Selecione um item na lista e em seguida clique em Enviar Mensagem");  
     lblMensagemPre.setBounds(570,30,200,20);  
     listModel = new DefaultListModel();  
     listModel.addElement("Bom dia - Apresentação");  
     listModel.addElement("Boa tarde - Apresentação");  
     listModel.addElement("Boa noite - Apresentação");  
     listModel.addElement("                        ");  
     listModel.addElement("Bom dia - Encerramento");  
     listModel.addElement("Boa tarde - Encerramento");  
     listModel.addElement("Boa noite - Encerramento");  
     lista = new JList(listModel);  
     lista.addListSelectionListener(this);  
     lista.setBounds(570,55,200,350);  
     lista.setModel(listModel);  
     getContentPane().add(lblMensagemPre);  
     getContentPane().add(lista);  
               
     btEnviar = new JButton("Enviar Mensagem"); btEnviar.addActionListener(this);  
     btEnviar.setBounds(570,440,200,20);  
     btEnviar.setToolTipText("Pressione aqui para enviar a sua mensagem.");  
     btEnviar.setMnemonic(KeyEvent.VK_E);  
     getContentPane().add(btEnviar);  
       
     btLimpar = new JButton("Limpar Mensagem"); btLimpar.addActionListener(this);  
     btLimpar.setBounds(570,470,200,20);  
     btLimpar.setToolTipText("Pressione aqui para limpar o campo de mensagens do seu chat");  
     btLimpar.setMnemonic(KeyEvent.VK_L);  
     getContentPane().add(btLimpar);  
       
     btSalvar = new JButton("Salvar Conversa"); btSalvar.addActionListener(this);  
     btSalvar.setBounds(570,500,200,20);  
     btSalvar.setToolTipText("Pressione aqui para salvar a conversa.");  
     btSalvar.setMnemonic(KeyEvent.VK_F);  
     getContentPane().add(btSalvar);  
       
     btFechar = new JButton("Fechar"); btFechar.addActionListener(this);  
     btFechar.setBounds(570,530,200,20);  
     btFechar.setToolTipText("Pressione aqui para fechar a aplicação.");  
     btFechar.setMnemonic(KeyEvent.VK_F);  
     getContentPane().add(btFechar);  
           
 }  
   
 public void adjustmentValueChanged(AdjustmentEvent e) {  
       
       
 }  

 public void actionPerformed(ActionEvent e) {  
       
       
     if (e.getSource()==btEnviar){  
         if (taMensagem.getText().equals("")||taMensagem.getText().equals(" ")){  
             JOptionPane.showMessageDialog(null, "Por favor, preencha o campo de mensagem" +  
                     "\n com pelo menos um caracter. Obrigado!");  
         }  
         else{  
             taConversa.setText( taConversa.getText()   
                 + lblUsuario.getText()+ "\n"   
                 + data + "\n"  
                 + taMensagem.getText()+ "\n");  
         taMensagem.setText("");  
           
         String recebeConversa = taConversa.getText()   
		 + lblUsuario.getText()+ "\n"   
		 + data + "\n"  
		 + taMensagem.getText()+ "\n";  
		   
		 
		 taConversa.setText(recebeConversa);  
         }  
                       
     }  
       
     if(e.getSource()==btLimpar){  
         taMensagem.setText("");  
     }  
       
     if(e.getSource()==btSalvar){  
         if(taMensagem.getText().equals("")){  
             JOptionPane.showMessageDialog(null, "Nada foi escrito no dialogo.");  
         }  
         if(taConversa.getText().equals("")){  
             JOptionPane.showMessageDialog(null, "Não foi possível realizar a gravação." +  
                     "\nMotivo: Não existe dialogo a ser gravado.");  
         }  
         else{  
           PrintWriter out;  
           try {  
           out = new PrintWriter(lblUsuario.getText()+".txt");         
           out.println("Conteúdo da conversa de: "+lblUsuario.getText());  
           out.println("Conversa gravada às: "+ data);  
           out.println("-------------------------------------------- ");  
           out.println(taConversa.getText());  
           out.println("-------------------------------------------- ");  
           out.println("Fim da conversa!");  
           out.close();  
           JOptionPane.showMessageDialog(null, "Conversa gravada com sucesso!");  
         }   
         catch (FileNotFoundException e1) {  
               
             e1.printStackTrace();  
         }  
     }  
       
 }  
       
     if(e.getSource()==btFechar){  
         System.exit(0);  
     }  
 }  
   
 public void valueChanged(ListSelectionEvent e) {  
       
 }  

 public static void main(String[] args) {  
     JFrame janela = new Cliente();  
     janela.setDefaultCloseOperation(EXIT_ON_CLOSE);  
     janela.setVisible(true);  
 }  

} [/code]

Os erros ocorrem especificamente nestas linhas…

 Socket socket = new Socket("localhost",7000);    
 PrintStream ps = new PrintStream(socket.getOutputStream()); 

Não sei mais o que faço… Eu sigo os pass-a-passo, mas sempre dá erro…

Acho que antes de pensar em interface gráfica, vc deveria tentar fazer o socket funcionar em modo console mesmo. Depois disso, que estiver ok, dai parte para a interface gráfica.
Tenho um exemplo de um multi-usuário aqui: http://mballem.wordpress.com/2011/02/04/chat-multiusuario-com-socket/

Aqui tem um exemplo de chat usando sockets no console extremamente simples, que montei para meus alunos:

Tem outro exemplo usando UDP, bem mais complexo.

Fala galera, estou lendo os documentos passados e acho que agora sim estou no caminho certo, algumas coisas estavam meio confusas…

Referente ao cliente, não está mais apresentando erro, agora estou com problema no Servidor…
Quando executo, ele vai direto para o IOException…

Segue o código:

import java.io.*;  
import java.net.*;  
     
import javax.swing.*;  
import javax.swing.event.ListSelectionEvent;  
import javax.swing.event.ListSelectionListener;  
     
import java.sql.*;  
import java.awt.*;  
import java.awt.event.*;  
import java.util.ArrayList;
import java.util.Date;  
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
   public class Servidor extends JFrame{  
     
       JTextArea taConversa;  
         
       ServerSocket serv = null;
       Socket s = null;
       BufferedReader entrada = null;
	    
       Servidor()  {  
           super("Servidor");  
           setResizable(false);  
           setBounds(5,5,800,600);  
           getContentPane().setLayout(null);  
           
           taConversa = new JTextArea();  
           taConversa.setBounds(5,30,780,500);  
           taConversa.setEditable(false);  
           getContentPane().add(taConversa);  
             
       try {
		serv = new ServerSocket(6589);
	    s = serv.accept();
        entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
        taConversa.setText(taConversa.getText() + "\n" + entrada.readLine() + "\n");
       } catch (IOException e) {
    	   JOptionPane.showMessageDialog(null, "Houve um erro de comunicação.");
      	 try {
				s.close();
				serv.close();
			} catch (IOException e1) {
				
				e1.printStackTrace();
			}
   	} 
 } 
    
       public static void main(String args[]) throws IOException{  
           JFrame srv = new Servidor();  
           srv.setVisible(true);  
           srv.setDefaultCloseOperation(EXIT_ON_CLOSE);  
       } 
                   
  }  

O Eclipse dá uma valorizada no código… Mas o engraçado é que não apresenta erro algum na linha de comando e sinceramente não faço a mínima idéia de onde pode estar o erro…

Bom galera, continuo na minha luta com esses sockets, eu postei no código anterior que ia direto pro IOException, nem abria a página, fiz uma pequena modificação e agora não está mais dando erro, mas a janela não aparece…

Vou postar só a parte que eu modifiquei…

	//Criei essa String pra receber os dados.
        String receber = entrada.readLine();
        //Chamei ela dentro do TextArea que concatenará a conversa...
        taConversa.setText(taConversa.getText() + "\n" + receber + "\n");

Só isso acabou tirando o erro, agora não aparece o JFrame…¬¬

Se puderem me ajudar, um abraço a todos…

Fala galera,
Ainda estou apanhando desse chat…
Bom, consegui fazer a comunicação, agora o Server “responde” ao Cliente…

Vou explicar melhor, quando eu inicio o Servidor, ele não abre o frame de imediato, para tal eu tenho que abrir o Cliente e enviar a mensagem, dai o frame do Servidor aparece.
Quando esse frame aparece, simplesmente ele não recebe a mensagem, dessa forma ele aparece somente o nome do Usuário, mas não concatena o histórico das mensagens…

Segue o código:

Cliente

[code]
import java.io.;
import java.net.
;
import javax.swing.;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.sql.
;
import java.awt.;
import java.awt.event.
;
import java.util.Date;
class Cliente extends JFrame implements AdjustmentListener , ActionListener , ListSelectionListener{

JLabel lblNomeChat, lblUsuario, lblConversa, lblMensagem, lblMensagemPre;  
JTextArea taConversa, taMensagem;  
JScrollBar scroll1, scroll2;  
JButton btEnviar, btSalvar, btLimpar, btFechar;  
JList lista;  
DefaultListModel listModel;  
 
Date data = new Date();  

Socket socket = null;
PrintStream ps = null;
   
     
Cliente(){  
    super("Atendimento personalizado");  
    setBounds(50,50,800,600);  
    setResizable(false);  
    getContentPane().setLayout(null);  
    
    lblNomeChat = new JLabel("Chat");  
    lblNomeChat.setBounds(5,5,200,30);  
    lblNomeChat.setFont(new Font("Comic Sams",Font.BOLD,22));  

    getContentPane().add(lblNomeChat);  
       
    lblUsuario = new JLabel("Usuário");  
    lblUsuario.setBounds(600,5,200,30);  
    lblUsuario.setFont(new Font("Comic Sams",Font.BOLD,14));  
    getContentPane().add(lblUsuario);  
      
    lblConversa = new JLabel("Conversa: ");  
    lblConversa.setBounds(5,30,200,30);  
    lblConversa.setFont(new Font("Comic Sams",Font.BOLD,12));  
    taConversa = new JTextArea();   
    taConversa.setBounds(5,55,550,350);  
    taConversa.setFont(new Font("Comic Sams",Font.BOLD,12));  
    taConversa.setEnabled(false);  
    getContentPane().add(lblConversa);  
    getContentPane().add(taConversa);  
              
    lblMensagem = new JLabel("Mensagem: ");  
    lblMensagem.setBounds(5,410,200,30);  
    lblMensagem.setFont(new Font("Comic Sams",Font.BOLD,12));  
    taMensagem = new JTextArea();  
    taMensagem.setBounds(5,440,550,120);  
    getContentPane().add(lblMensagem);  
    getContentPane().add(taMensagem);  
      
    lblMensagemPre = new JLabel("Mensagens Pré-Definidas");  
    lblMensagemPre.setToolTipText("Selecione um item na lista e em seguida clique em Enviar Mensagem");  
    lblMensagemPre.setBounds(570,30,200,20);  
    listModel = new DefaultListModel();  
    listModel.addElement("Bom dia - Apresentação");  
    listModel.addElement("Boa tarde - Apresentação");  
    listModel.addElement("Boa noite - Apresentação");  
    listModel.addElement("                        ");  
    listModel.addElement("Bom dia - Encerramento");  
    listModel.addElement("Boa tarde - Encerramento");  
    listModel.addElement("Boa noite - Encerramento");  
    lista = new JList(listModel);  
    lista.addListSelectionListener(this);  
    lista.setBounds(570,55,200,350);  
    lista.setModel(listModel);  
    getContentPane().add(lblMensagemPre);  
    getContentPane().add(lista);  
              
    btEnviar = new JButton("Enviar Mensagem"); btEnviar.addActionListener(this);  
    btEnviar.setBounds(570,440,200,20);  
    btEnviar.setToolTipText("Pressione aqui para enviar a sua mensagem.");  
    btEnviar.setMnemonic(KeyEvent.VK_E);  
    getContentPane().add(btEnviar);  
      
    btLimpar = new JButton("Limpar Mensagem"); btLimpar.addActionListener(this);  
    btLimpar.setBounds(570,470,200,20);  
    btLimpar.setToolTipText("Pressione aqui para limpar o campo de mensagens do seu chat");  
    btLimpar.setMnemonic(KeyEvent.VK_L);  
    getContentPane().add(btLimpar);  
      
    btSalvar = new JButton("Salvar Conversa"); btSalvar.addActionListener(this);  
    btSalvar.setBounds(570,500,200,20);  
    btSalvar.setToolTipText("Pressione aqui para salvar a conversa.");  
    btSalvar.setMnemonic(KeyEvent.VK_F);  
    getContentPane().add(btSalvar);  
      
    btFechar = new JButton("Fechar"); btFechar.addActionListener(this);  
    btFechar.setBounds(570,530,200,20);  
    btFechar.setToolTipText("Pressione aqui para fechar a aplicação.");  
    btFechar.setMnemonic(KeyEvent.VK_F);  
    getContentPane().add(btFechar);  
          
 } 
  
 public void adjustmentValueChanged(AdjustmentEvent e) {  
       
       
 }  

 public void actionPerformed(ActionEvent e) {  
       
       
    if (e.getSource()==btEnviar){  
        if (taMensagem.getText().equals("")||taMensagem.getText().equals(" ")){  
            JOptionPane.showMessageDialog(null, "Por favor, preencha o campo de mensagem" +  
                    "\n com pelo menos um caracter. Obrigado!");  
        }  
        else{  
            
       	 
       	 taConversa.setText( taConversa.getText()   
                + lblUsuario.getText()+ "\n"   
                + data + "\n"  
                + taMensagem.getText()+ "\n\n");  
        taMensagem.setText("");  
       
        try{
        socket = new Socket("localhost", 6589);
        ps = new PrintStream(socket.getOutputStream());
        ps.println(taConversa.getText());
        }
        catch(IOException erro){
       	 JOptionPane.showMessageDialog(null, "Houve um erro de comunicação.");
       	 try {
			socket.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        }
        }  
                      
    }  
      
    if(e.getSource()==btLimpar){  
        taMensagem.setText("");  
    }  
      
    if(e.getSource()==btSalvar){  
        if(taMensagem.getText().equals("")){  
            JOptionPane.showMessageDialog(null, "Nada foi escrito no dialogo.");  
        }  
        if(taConversa.getText().equals("")){  
            JOptionPane.showMessageDialog(null, "Não foi possível realizar a gravação." +  
                    "\nMotivo: Não existe dialogo a ser gravado.");  
        }  
        else{  
          PrintWriter out;  
          try {  
          out = new PrintWriter(lblUsuario.getText()+".txt");         
          out.println("Conteúdo da conversa de: "+lblUsuario.getText());  
          out.println("Conversa gravada às: "+ data);  
          out.println("-------------------------------------------- ");  
          out.println(taConversa.getText());  
          out.println("-------------------------------------------- ");  
          out.println("Fim da conversa!");  
          out.close();  
          JOptionPane.showMessageDialog(null, "Conversa gravada com sucesso!");  
        }   
        catch (FileNotFoundException e1) {  
              
            e1.printStackTrace();  
        }  
    }  
      
}  
      
    if(e.getSource()==btFechar){  
        System.exit(0);  
    }  
}  
  
public void valueChanged(ListSelectionEvent e) {  
      
}  

public static void main(String[] args) {  
    JFrame janela = new Cliente();  
    janela.setDefaultCloseOperation(EXIT_ON_CLOSE);  
    janela.setVisible(true);  
}

}[/code]

Servidor

[code]
import java.io.;
import java.net.
;
import javax.swing.;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.sql.
;
import java.awt.;
import java.awt.event.
;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
public class Servidor extends JFrame{

   JTextArea taConversa;  
     
   ServerSocket serv = null;
   Socket s = null;
   BufferedReader entrada = null;
    
   Servidor()  {  
       super("Servidor");  
       setResizable(false);  
       setBounds(5,5,800,600);  
       getContentPane().setLayout(null);  
       
       taConversa = new JTextArea();  
       taConversa.setBounds(5,30,780,500);  
       taConversa.setEditable(false);  
       getContentPane().add(taConversa);  
         
   try {
	serv = new ServerSocket(6589);
    s = serv.accept();
    entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String receber = entrada.readLine();
    taConversa.setText(taConversa.getText() + "\n" + receber + "\n");
   } catch (IOException e) {
	   JOptionPane.showMessageDialog(null, "Houve um erro de comunicação.");
  	 try {
			s.close();
			serv.close();
		} catch (IOException e1) {
			
			e1.printStackTrace();
		}
} 

}

   public static void main(String args[]) throws IOException{  
       JFrame srv = new Servidor();  
       srv.setVisible(true);  
       srv.setDefaultCloseOperation(EXIT_ON_CLOSE);  
   } 

} [/code]