Requisitanto arquivo do Servidor

Boa tarde amigos do forum.
Estou fazendo um programinha de cliente e servidor via socket, aonde quando execulto o servidor, o servidor fica esperando uma conexão, quando execulto o cliente, o cliente se conecta ao servido e eles ficam conversando entre si, ou seja troca de mensagem, so q agora estou querendo fazer com que o cliente requesite um arquivo do servidor. Supomos que o cliente digite no JTextField " /listfile ", aparecerá na JTextArea do cliente a lista de arquivos ou um arquivo pre-definido no servidor. Aonde o cliente depois de visualizado os arquivos, possa abrir em TXT ou ate mesmo fazer o download desse arquivo. Como fazer isso ? Vou postar aqui os codigos do servidor e do cliente para q vcs possam olhar e analizar !

====== Servidor =======

//esse programa configura um servidor q irá receber uma conexão com um cliente apenas

//pacotes que iremos usar
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
//pacote para criar uma interface grafica
import javax.swing.*;

public class Servidor extends JFrame {
    
    private JTextField campoTexto;//aonde vc digita o texto
    private JTextArea areaTexto;//aonde aparecerá o texto
    private ObjectOutputStream saida;//saida de bits
    private ObjectInputStream entrada;//entrada de bits
    private ServerSocket servidor;//variavel para criar o servidor
    private Socket conexao;//variavel para a conexao com socket
    private int cont = 1;// contador
    
    //configurando uma GUI
    public Servidor()
    {
        super("=== Servidor ===");
        
        Container gui_servidor = getContentPane();
        
        //cria um enterfield e registra listener
        campoTexto = new JTextField();
        campoTexto.setEnabled(false);
        
        campoTexto.addActionListener(new ActionListener() 
        {

            //envia mensagem para o cliente
            public void actionPerformed(ActionEvent e) 
            {
                enviaDados(e.getActionCommand());
            }
        });//fim da chamada para addActionListener
        
        gui_servidor.add(campoTexto, BorderLayout.NORTH);
        
        //cria a area de display
        areaTexto = new JTextArea();
        gui_servidor.add(new JScrollPane(areaTexto),BorderLayout.CENTER);
        
        setSize(600, 600);
        setVisible(true);
    }
    
    //configura e executa o servidor
    public void runServidor()
    {
        //configura o servidor para receber conexões;
        //processa conexões
        try
        {
            //etapa 1: cria um serverSocket
            servidor = new ServerSocket(5000,100);
            while(true)
            {
                //etapa 2: espera uma conexão
                esperaConexao();
                //etapa 3: obtém fluxos de entrada e de saída
                getStreams();
                //etapa 4: Processa a conexão
                processaConexao();
                //etapa 5: fecha a conexão
                fechaConexao();
                
                ++cont;
            }
        }
        //processa EOFException quando o cliente fecha a conexão
        catch (EOFException eofex)
        {
            System.out.println("Conexão terminada com o Cliente");
        }
        //processa problemas com E/S
        catch (IOException ioex)
        {
            ioex.printStackTrace();
        }
    }
    //espera que a conexão chegue, depois exibe informações sobre a conexão
    private void esperaConexao() throws IOException
    {
     areaTexto.setText("Esperando Conexâo\n");
     //permite que o servidor aceite uma conexão
     conexao = servidor.accept();
     areaTexto.append("Conexão "+ cont + " recebida de: " + conexao.getInetAddress().getHostName());
    }
    //obtém fluxos para enviar e receber dados
    private void getStreams() throws IOException
    {
         //configura o fluxo de saida para objetos
        saida = new ObjectOutputStream(conexao.getOutputStream());
        areaTexto.append("\nE/S Streams\n");
        
    }
    //processa a conexão com o cliente
    private void processaConexao() throws IOException
    {
        //envia mensagem de conexão bem-sucedida para o cliente
        String mensagem = "Servidor>>>> Conexão com Sucesso";
        saida.writeObject(mensagem);
        saida.flush();
        
        //habilita campoTexto para que o usuario do servidor
        //possa enviar mensagens
        campoTexto.setEnabled(true);
        //processa mensagens enviadas a partir do cliente
        do
        {
            //lê a mensagem e a exibe
            try
            {
                mensagem = (String) entrada.readObject();
                areaTexto.append("\n" + mensagem);
                areaTexto.setCaretPosition(areaTexto.getText().length());
            }
            //captura problemas ocorridos durante a leitura do cliente
            catch (ClassNotFoundException classNotFEx)
            {
                areaTexto.append("\nTipo de objeto recebido desconhecido");
            }
        }
        while( !mensagem.equals("Cliente>>>> Terminado"));
    }
    //fecha fluxos e soquetes
    private void fechaConexao() throws IOException
    {
        areaTexto.append("\nConexão terminada com o Cliente");
        campoTexto.setEnabled(false);
        saida.close();
        entrada.close();
        conexao.close();
    }
    //envia mensagem para o cliente
    private void enviaDados( String mensagem )
    {
        //envia objeto para o cliente
        try
        {
            saida.writeObject("Servidor>>>>" + mensagem);
            saida.flush();
            areaTexto.append("\nServidor>>>>" + mensagem);
        }
        //processa problemas ocorridos durante o envio do objeto
        catch (IOException ioex)
        {
            areaTexto.append("\nEscrevendo o erro do objeto");
        }
    }
    //executa o aplicativo
    public static void main (String args[])
    {
        Servidor app = new Servidor();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        app.runServidor();
    }
}// fim da classe Servidor

====== Cliente ======

//esse programa configura um cliente q irá receber uma conexão com um servidor apenas

//pacotes que iremos usar
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
//pacote para criar uma interface grafica
import javax.swing.*;

public class Cliente extends JFrame
{
    private JTextField campoTexto;
    private JTextArea areaTexto;
    private JButton diretorios;
    private ObjectOutputStream saida;
    private ObjectInputStream entrada;
    private String mensagem = "";
    private String batePapo;
    private Socket cliente;
    
    //inicializa bate-papo e configura a GUI
    public Cliente( String host )
    {
        super( "Cliente" );
        
        //configura o servidor ao qual o cliente se conecta
        batePapo = host;
        
        Container gui_cliente = getContentPane();
        
        //cria campoTexto e registra ouvinte
        campoTexto = new JTextField();
        campoTexto.setEnabled( false );
        
        campoTexto.addActionListener(
                new ActionListener() 
        {

            //envia mensagem para ao servidor
            public void actionPerformed(ActionEvent e) 
            {
                enviaDados( e.getActionCommand() );
            }
        });//fim da chamada para addActionListener
        gui_cliente.add( campoTexto, BorderLayout.NORTH );
        
        //cria area de display
        areaTexto = new JTextArea();
        gui_cliente.add( new JScrollPane(areaTexto), BorderLayout.CENTER);
        
        setSize(300,300);
        setVisible(true);
        
        //cria o botao de diretorio
        diretorios = new JButton("Requerer Arquivo do Servidor");
        diretorios.setEnabled(false);
        setSize(300, 300);
        gui_cliente.add(new JScrollPane(diretorios), BorderLayout.SOUTH);
        setSize(300, 300);
        setVisible(true);
    }
    //conecta-se ao servidor e processa as mensagens do servidor
    public void runCliente()
    {
        //conecta ao servidor, obtém fluxos, processa a conexão
        try
        {
            //etapa 1: cria um socket para fazer a conexão
            conectaServidor();
            //etapa 2: obtém os fluxos de entrada e de saida
            getStreams();
            //etapa 3: processa a conexão
            processaConexao();
            //etapa 4: fecha a conexão
            fechaConexao();
        }
        //servidor fechou a conexão
        catch ( EOFException eofException )
        {
            System.out.println( "Conexão terminada com o Servidor" );
        }
        //processa problemas na comunicação com o servidor
        catch ( IOException ioException )
        {
            ioException.printStackTrace();
        }
    }
    //obtém fluxos para enviar e receber dados
    private void getStreams () throws IOException
    {
        //configura fluxo de saida para objetos
        saida = new ObjectOutputStream( cliente.getOutputStream() );
        //descarrega o buffer de saida para enviar informações de cabeçalho
        saida.flush();
        //configura o fluxo de entrada para objetos
        entrada = new ObjectInputStream( cliente.getInputStream() );
        areaTexto.append( "\nE/S Streams\n" );
    }
    //conecta-se ao servidor
    private void conectaServidor () throws IOException
    {
        areaTexto.setText( "Tentando Conectar\n" );
        //cria socket para fazer a conexão ao servidor
        cliente = new Socket( InetAddress.getByName(batePapo), 5000 );
        //exibe informações sobre a conexão
        areaTexto.append( "Conectado de : " + cliente.getInetAddress().getHostName() );
    }
    //processa a conexão com o servidor
    private void processaConexao () throws IOException
    {
        //habilita campoTexto para que o cliente possa enviar mensagens
        campoTexto.setEnabled( true );
        //habilita o botao de diretorio para que o cliente possa enviar mensagens
        diretorios.setEnabled( true );
        //processa mensagens enviadas do servidor
        do
        {
            //lê mensagem e a exibe
            try
            {
                mensagem = ( String ) entrada.readObject();
                areaTexto.append( "\n" + mensagem );
                areaTexto.setCaretPosition( areaTexto.getText().length() );
            }
            //captura problemas na leitura do servidor
            catch(ClassNotFoundException classNotFoundException)
            {
                areaTexto.append("\nTipo de objeto recebido desconhecido");
            }
        }
        while( !mensagem.equals( "Servidor>>>> Terminado" ) );
    }
    //fecha fluxos e soquete
    private void fechaConexao () throws IOException
    {
        areaTexto.append( "\nConexão fechada" );
        saida.close();
        entrada.close();
        cliente.close();
    }
    //envia mensagem para o servidor
    private void enviaDados( String mensagem )
    {
       //envia objeto para o servidor
        try
        {
            saida.writeObject( "Cliente>>>>" + mensagem );
            saida.flush();
            areaTexto.append( "\nCliente>>>>" + mensagem );
        }
        //processa problemas no envio do objeto
        catch ( IOException ioException )
        {
            areaTexto.append( "\nEscrevendo o erro do objeto" );
        }
    }
    //executa o aplicativo
    public static void main ( String args[] )
    {
        Cliente app;
        
        if( args.length == 0 )
            app = new Cliente( "localhost" );
        else
            app = new Cliente( args[0] );
        
        app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        
        app.runCliente();
    }
}//fim da classe Cliente

Boa tarde!!!
Ola, põe no servidor algo do tipo:

mensagem = (String) entrada.readObject(); if(mensagem.equals("/listfile"){ File f = new File("c:\\"); String files = f.listFile(); // não lembro o que listFile() retorna... rsrs descupa saida.writeObject(files); /* mas ou menos isso... tenta implementar algo ai se não acender a lampada... posta ai que eu tento faze algo mas elaborado*/ }else{ areaTexto.append("\n" + mensagem); areaTexto.setCaretPosition(areaTexto.getText().length()); }

ah e não esquece de usar no cliente

saida.writeObject("/listFile");

sempe que quiser ver a list dos arquivos…

Squall vlw pela ajudar cara!
Bom o codigo ficou assim no servidor, naum sei se esta funcionando pq naum fiz o cliente, pq naum estou tendo noção de como fazer, se naum for pedir muito seria possivel vc pegar esse codigo e compilar para vc ver como esta ficando !

codigo do Servidor

//esse programa configura um servidor q irá receber uma conexão com um cliente apenas

//pacotes que iremos usar
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
//pacote para criar uma interface grafica
import javax.swing.*;

public class Servidor extends JFrame 
{
   //private String caminho [] = { "c:\\windows\\" };
   private JTextField campoTexto; // insere a mensagem do usuário
   private JTextArea areaTexto; // exibe informações para o usuário
   //private  JList listarArquivos; // exibe informações dos arquivos para usuario
   private ObjectOutputStream saida; // gera fluxo de saída para o cliente
   private ObjectInputStream entrada; // gera fluxo de entrada a partir do cliente
   private ServerSocket servidor; // socket de servidor     
   private Socket conexao; // conexão com o cliente
   private int cont = 1; // contador do número de conexões

   // configura a GUI
   public Servidor()
   {
      super( "==== Servidor ====" );

      campoTexto = new JTextField(); // cria campoTexto
      campoTexto.setEditable( false );
      campoTexto.addActionListener(
         new ActionListener() 
         {
            // envia a mensagem ao cliente
            public void actionPerformed( ActionEvent event )
            {
               enviaDados( event.getActionCommand() );
               campoTexto.setText( "" );
            } // fim do método actionPerformed
         } // fim da classe interna anônima
      ); // fim da chamada para addActionListener

      add( campoTexto, BorderLayout.NORTH );

      areaTexto = new JTextArea(); // cria areaTexto
      add( new JScrollPane( areaTexto ), BorderLayout.CENTER );

      setSize( 300, 300 ); // configura o tamanho da janela
      setVisible( true ); // mostra a janela
      
      //listarArquivos = new JList();
      //listarArquivos.setVisibleRowCount(5);
      //aqui não permite seleções multiplas
      //listarArquivos.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
      //add( new JScrollPane( listarArquivos ), BorderLayout.SOUTH );
      //configura o tratamento de eventos
      //listarArquivos.addListSelectionListener(
             // new ListSelectionListener() {

              //  public void valueChanged(ListSelectionEvent e) {
                //throw new UnsupportedOperationException("Not supported yet.");
                    
               // }
              //}
     // );
      
     // setSize(300, 150);
     // setVisible(true);
   } // fim do construtor Servidor

   // configura e executa o servidor
   public void runServidor()
   {
      try // configura o servidor para receber conexões; processa as conexões
      {
         servidor = new ServerSocket( 5000, 100 ); // cria ServerSocket

         while ( true ) 
         {
            try 
            {
               esperaConexao(); // espera uma conexão
               getStreams(); // obtém fluxos de entrada e saída
               requisita();//Criei esse objeto requista aqui
               processaConexao(); // processa a conexão
            } // fim do try
            catch ( EOFException eofException ) 
            {
               displayMessage( "\nConexão terminado com o Servidor" );
            } // fim do catch
            finally 
            {
               fechaConexao(); // fecha a conexão
               cont++;
            } // fim de finally
         } // fim do while
      } // fim do try
      catch ( IOException ioException ) 
      {
         ioException.printStackTrace();
      } // fim do catch
   } // fim do método runServer
   private void esperaConexao() throws IOException
   {
      displayMessage( "Esperando por Conexão\n" );
      conexao = servidor.accept(); // permite que servidor aceite a conexão
      displayMessage( "Conexão " + cont + " recebida de : " +
         conexao.getInetAddress().getHostName());
   } // fim do método esperaConexao

   // obtém fluxos para enviar e receber dados
   private void getStreams() throws IOException
   {
      // configura o fluxo de saída para objetos
      saida = new ObjectOutputStream( conexao.getOutputStream() );
      saida.flush(); // esvazia buffer de saída enviar as informações de cabeçalho

      // configura o fluxo de entrada para objetos
      entrada = new ObjectInputStream( conexao.getInputStream() );

      displayMessage( "\nE/S Streams\n" );
   } // fim do método getStreams

   // processa a conexão com o cliente
   //aqui eu  fiz o metodo 
   private void requisita() throws IOException
   {
      //configura a requisição do arquivo
      String comando = "Requisitando arquivo";
      enviaDados(comando);
      try
          {
            comando = (String) entrada.readObject();
            if(comando.equals("/list"))
            {
                File f = new File("c:\\");
                File[] files = f.listFiles();
                saida.writeObject(files);
               // mas ou menos isso... tenta implementar algo ai se não acender a lampada... posta ai que eu tento faze algo mas elaborado
            }
            else
            {
                areaTexto.append("\n" + comando);
                areaTexto.setCaretPosition(areaTexto.getText().length());
            }
          }
          catch ( ClassNotFoundException classNotFoundException )
          {
             displayMessage( "\nTipo de requisição recebido desconhecido" ); 
          } 
   }// fim do do requista
   private void processaConexao() throws IOException
   {
      String mensagem = "Conexão realizada com Sucesso";
      enviaDados( mensagem ); // envia uma mensagem de conexão bem-sucedida

      // ativa campoTexto de modo que usuário do servidor possa enviar mensagens
      setTextFieldEditable( true );

      do // processa as mensagens enviadas pelo cliente
      { 
         try // lê e exibe a mensagem
         {
            mensagem = ( String ) entrada.readObject(); // lê uma nova mensagem
            displayMessage( "\n" + mensagem ); // exibe a mensagem
         } // fim do try
         catch ( ClassNotFoundException classNotFoundException ) 
         {
            displayMessage( "\nTipo de objeto recebido desconhecido" );
         } // fim do catch

      } while ( !mensagem.equals( "CLIENTE>>> TERMINADO" ) );
   } // fim do método processaConexão

   // fecha os fluxos e o socket
   private void fechaConexao() 
   {
      displayMessage( "\nConexão terminada com o Cliente\n" );
      setTextFieldEditable( false ); // desativa campoTexto

      try 
      {
         saida.close(); // fecha o fluxo de saída
         entrada.close(); // fecha o fluxo de entrada  
         conexao.close(); // fecha o socket   
      } // fim do try
      catch ( IOException ioException ) 
      {
         ioException.printStackTrace();
      } // fim do catch
   } // fim do método fechaConexão

   // envia a mensagem ao cliente
   private void enviaDados( String mensagem )
   {
      try // envia o objeto ao cliente
      {
         saida.writeObject( "SERVER>>> " + mensagem );
         saida.flush(); // esvazia a saída para o cliente    
         displayMessage( "\nSERVER>>> " + mensagem );
      } // fim do try
      catch ( IOException ioException ) 
      {
         areaTexto.append( "\nEscrevendo o erro do Objeto" );
      } // fim do catch
   } // fim do método enviaDados

   // manipula a areaTexto na thread de despacho de eventos
   private void displayMessage( final String messageToDisplay )
   {
      SwingUtilities.invokeLater(
         new Runnable() 
         {
            public void run() // atualiza a areaTexto 
            {
               areaTexto.append( messageToDisplay ); // acrescenta a mensagem
            } // fim do método run
         } // fim da classe interna anônima
      ); // fim da chamada para SwingUtilities.invokeLater
   } // fim do método displayMessage

   // manipula o campoTexto na thread de despacho de eventos
   private void setTextFieldEditable( final boolean editable )
   {
      SwingUtilities.invokeLater(
         new Runnable()
         {
            public void run() // configura a editabilidade do enterField
            {
               campoTexto.setEditable( editable );
            } // fim do método run
         }  // fim da classe inner
      ); // fim da chamada para SwingUtilities.invokeLater
   } // fim do método setTextFieldEditable
   
   public static void main( String args[] )
   {
      Servidor app = new Servidor(); // cria o servidor
      app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      app.runServidor(); // executa o aplicativo servidor
   } // fim de main
} // fim da classe Servidor

Agora o Cliente com aquela linha de comando q vc postou ! criei o objeto e fez o metado so q naum consigo conectar no servidor nem para torcar mensagens !

//esse programa configura um cliente q irá receber uma conexão com um servidor apenas

//pacotes que iremos usar
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
//pacote para criar uma interface grafica
import javax.swing.*;

public class Cliente extends JFrame 
{
   private JTextField campoTexto; // insere informações fornecidas pelo usuário
   private JTextArea areaTexto; // exibe informações para o usuário
   private ObjectOutputStream saida; // gera o fluxo de saída para o servidor
   private ObjectInputStream entrada; // gera o fluxo de entrada a partir do servidor
   private String mensagem = ""; // mensagem do servidor
   private String batePapo; // servidor de host para esse aplicativo
   private Socket cliente; // socket para comunicação com o servidor

   // inicializa chatServer e configura a GUI
   public Cliente( String host )
   {
      super( "==== Cliente ====" );

      batePapo = host; // configura o servidor ao qual esse cliente se conecta

      campoTexto = new JTextField(); // cria enterField
      campoTexto.setEditable( false );
      campoTexto.addActionListener(
         new ActionListener() 
         {
            // envia mensagem ao servidor
            public void actionPerformed( ActionEvent event )
            {
               enviaDados( event.getActionCommand() );
               campoTexto.setText( "" );
            } // fim do método actionPerformed
         } // fim da classe interna anônima
      ); // fim da chamada para addActionListener

      add( campoTexto, BorderLayout.NORTH );

      areaTexto = new JTextArea(); // cria displayArea
      add( new JScrollPane( areaTexto ), BorderLayout.CENTER );

      setSize( 300, 150 ); // configura o tamanho da janela
      setVisible( true ); // mostra a janela
   } // fim do construtor Cliente

   // conecta-se ao servidor e processa as mensagens a partir do servidor
   public void runCliente() 
   {
      try // conecta-se ao servidor, obtém fluxos, processa a conexão
      {
         conectaServidor(); // cria um Socket para fazer a conexão
         getStreams(); // obtém os fluxos de entrada e saída
         requista();
         processaConexao(); // processa a conexão
      } // fim do try
      catch ( EOFException eofException ) 
      {
         displayMessage( "\nConexão terminado com o Servidor" );
      } // fim do catch
      catch ( IOException ioException ) 
      {
         ioException.printStackTrace();
      } // fim do catch
      finally 
      {
         fechaConexao(); // fecha a conexão
      } // fim de finally
   } // fim do método runCliente

   // conecta-se ao servidor
   private void conectaServidor() throws IOException
   {      
      displayMessage( "Tentando Conectar\n" );

      // cria Socket fazer a conexão ao servidor
      cliente = new Socket( InetAddress.getByName( batePapo ), 5000 );

      // exibe informações sobre a conexão
      displayMessage( "Conectado de : " + 
         cliente.getInetAddress().getHostName() );
   } // fim do método conectaServidor

   // obtém fluxos para enviar e receber dados
   private void getStreams() throws IOException
   {
      // configura o fluxo de saída para objetos
      saida = new ObjectOutputStream( cliente.getOutputStream() );     
      saida.flush(); // esvazia buffer de saída enviar as informações de cabeçalho

      // configura o fluxo de entrada para objetos
      entrada = new ObjectInputStream( cliente.getInputStream() );

      displayMessage( "\nE/S Streams\n" );
   } // fim do método getStreams
   private void requista() throws IOException
   {
   
       saida.writeObject("/list");
       
   }//processa a conexão com o servidor
   private void processaConexao() throws IOException
   {
      // ativa campoTexto de modo que o usuário cliente possa enviar mensagens
      setTextFieldEditable( true );

      do // processa as mensagens enviadas do servidor
      { 
         try // lê e exibe a mensagem
         {
            mensagem = ( String ) entrada.readObject(); // lê uma nova mensagem
            displayMessage( "\n" + mensagem ); // exibe a mensagem
         } // fim do try
         catch ( ClassNotFoundException classNotFoundException ) 
         {
            displayMessage( "\nTipo de Objeto recebido desconhecido" );
         } // fim do catch

      } while ( !mensagem.equals( "SERVIDOR>>> TERMINADO" ) );
   } // fim do método processaConexao

   // fecha os fluxos e o socket
   private void fechaConexao() 
   {
      displayMessage( "\nConexão fechada" );
      setTextFieldEditable( false ); // desativa campoTexto

      try 
      {
         saida.close(); // fecha o fluxo de saída
         entrada.close(); // fecha o fluxo de entrada
         cliente.close(); // fecha o socket   
      } // fim do try
      catch ( IOException ioException ) 
      {
         ioException.printStackTrace();
      } // fim do catch
   } // fim do método fechaConexao

   // envia mensagem ao servidor
   private void enviaDados( String mensagem )
   {
      try // envia o objeto ao servidor
      {
         saida.writeObject( "CLIENTE>>> " + mensagem );
         saida.flush(); // esvazia os dados para saída      
         displayMessage( "\nCLIENTE>>> " + mensagem );
      } // fim do try
      catch ( IOException ioException )
      {
         areaTexto.append( "\nEscrevendo o erro do Objeto" );
      } // fim do catch
   } // fim do método enviaDados

   // manipula a areaTexto na thread de despacho de eventos
   private void displayMessage( final String messageToDisplay )
   {
      SwingUtilities.invokeLater(
         new Runnable()
         {
            public void run() // atualiza a areaTexto 
            {
               areaTexto.append( messageToDisplay );
            } // fim do método run
         }  // fim da classe interna anônima
      ); // fim da chamada para SwingUtilities.invokeLater
   } // fim do método displayMessage

   // manipula o campoTexto na thread de despacho de eventos
   private void setTextFieldEditable( final boolean editable )
   {
      SwingUtilities.invokeLater(
         new Runnable() 
         {
            public void run() // configura a editabilidade do campoTexto
            {
               campoTexto.setEditable( editable );
            } // fim do método run
         } // fim da classe interna anônima
      ); // fim da chamada para SwingUtilities.invokeLater
   } // fim do método setTextFieldEditable
   public static void main( String args[] )
   {
      Cliente app; // declara o aplicativo cliente

      // se não houver nenhum argumento de linha de comando
      if ( args.length == 0 )
         app = new Cliente( "127.0.0.1" ); // conecta-se ao host local
      else
         app = new Cliente( args[ 0 ] ); // utiliza argumentos para se conectar   

      app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      app.runCliente(); // executa o aplicativo cliente
   } // fim de main
} // fim da classe Cliente

Ola!
O motivo de não connectar com o servidor, é porque você não fez a chamada ao metodo

runCliente();

O código esta correto!
T+