Chat com Socket

bom eu tenho que fazer um chat que tem um servidor e nele se conecta carios clientes ,conectar so um cliente eu consigo , o problema e excecutar mais do que um ei sei que tem que usar um Runnable so não consigui descobrir onde
meu codigo

import java.io.*; 
import java.net.*;
public class Cliente {
    
    Socket smtpSocket = null;  
    DataOutputStream saida = null; 
    DataInputStream entrada = null;

    public Cliente() {
    }
    
    protected void conecta(){
        try{ 
        ConexaoCliente r =new ConexaoCliente();
        Thread t = new Thread(r);
        t.start();
        Thread.sleep(2000);
           smtpSocket = new Socket("localhost", 25); 
           saida = new DataOutputStream(smtpSocket.getOutputStream()); 
           entrada = new DataInputStream(smtpSocket.getInputStream()); 
        } 
        catch (UnknownHostException e){ 
            System.err.println("Nao Consegui Conectar com o Host"); 
          }  
        catch (IOException e){ 
            System.err.println("A Transacao de I/O Falhou"); 
        } 
        catch(InterruptedException e){
        	System.err.println("gghhgg"); 
        }
        if (smtpSocket != null && saida != null && entrada != null){ 
            try{ 
                saida.writeBytes("Oi Servidor\n");  
                saida.writeBytes("Tudo bem contigo\n"); 
                saida.writeBytes("QUIT"); 
                String respostaLinha;  
                while ((respostaLinha = entrada.readLine()) != null){ 
                    System.out.println("Recebi do Servidor: " + respostaLinha); 
                    if (respostaLinha.indexOf("Ok") != -1){ 
                       break; 
                    } 
                } 
                saida.close(); 
                entrada.close(); 
                smtpSocket.close();  
           } 
           catch (UnknownHostException e){ 
               System.err.println("Tentando Desconectar com Host Desconhecido: " + e); 
           } 
           catch (IOException e){ 
               System.err.println("IOException: " + e); 
           } 
       } 
    }
}
import java.io.*; 
import java.net.*;
public class Servidor {
    
    static ServerSocket echoServer = null; 
    String linha; 
    DataInputStream entrada; 
    PrintStream saida; 
    Socket clientSocket = null; 
    
    public Servidor() {
    }
    
    protected static ServerSocket abriPorta(){
    	if(echoServer!=null){
    		return echoServer;
    	}
        try{ 
            return echoServer = new ServerSocket(25); 
        } 
        catch (IOException e){ 
            System.out.println(e); 
            return null;
        }  
        }
        protected void conversa(){
        

        try{ 
            clientSocket = echoServer.accept(); 
            entrada = new DataInputStream(clientSocket.getInputStream()); 
            saida = new PrintStream(clientSocket.getOutputStream()); 
            while (true){ 
                linha = entrada.readLine(); 
                if (linha.equalsIgnoreCase("QUIT")){ 
                    linha = "OK"; 
                    saida.println(linha);        
                    break; 
                } 
            System.out.println("Recebi isto do Cliente: " + linha); 
            linha = linha.concat(" - Comigo tudo Bem"); 
            saida.println(linha);  
            } 
            saida.close(); 
            entrada.close(); 
            echoServer.close(); 
            clientSocket.close(); 
        }  
        catch (IOException e){ 
            System.out.println(e.getMessage()); 
        } 
    }
}

agradeço desde ja

class NomeDaSuaClasse implements Runnable{

[code]
public void run(){

//Aqui vai tudo o que vc quer fazer dentro da thread, provavelmente um while(true)

}

}[/code]

Cada cliente terá que ser tratado em uma thread separada. Portanto, o que irá dentro do Runnable será esse trecho aqui:

entrada = new DataInputStream(clientSocket.getInputStream()); saida = new PrintStream(clientSocket.getOutputStream()); while (true){ linha = entrada.readLine(); if (linha.equalsIgnoreCase("QUIT")){ linha = "OK"; saida.println(linha); break; } System.out.println("Recebi isto do Cliente: " + linha); linha = linha.concat(" - Comigo tudo Bem"); saida.println(linha); } saida.close(); entrada.close(); echoServer.close(); clientSocket.close();

valeu amigo mais eu não sei exatamente o que eu tenho que colocar ai por que quando o segungo cliente se conecta eu não consigo fazer ele achar o servidor

Exatamente pq vc não esta tratando cada cliente como uma Thread, pois quando vc usa um servidor que aguarda uma conexao e não joga cada cliente em uma thread ele para de escutar assim que o 1º se conecta

eu consigui fazer vaioos clientes se conectar no servidor agora surgio outro problema, eu tenho um frame para cada cliente, esse frame é igual a um de um chat com um JtextArea para mostra as mensagens , e outro parao cliente digitar a mensagem , mas o que fazer para o Thread desse cliente ficar esperndo ele digitar alguma coisa?