Thread + socket = Connection refused

Galera,

Peguei alguns exemplos aqui mesmo do uso de thread + socket, estou tentando fazer com que o cliente fique em loop aguardando as informações do servidor. Neste caso, o servidor irá passar a cada instante um novo valor, e o cliente imprime.

Abaixo, parte dos códigos que estou utilizando.

A minha idéia seria “dizer” para as threads clientes ficarem aguardando que o servidor as informe que existe algo (um String) para elas, caso exista, que seja impresso na tela.

Mas estou tendo dificuldade, alguem poderia dar uma luz no que estou errando no código abaixo ? Serio o caso de utilizar wait e notifyAll ? Caso positivo, como tenho conhecimento das threads clientes para liberá-las ?

Obrigado !

[code]public class Servidor implements Runnable
{
ServerSocket ss;

 public Servidor(int porta) throws Exception{        	
    	ss = new ServerSocket(porta);  
    	ss.setReuseAddress(true);
    	new Thread(this).start(); 
    	System.out.println("Servidor ouvindo na porta:" + porta);     
}   

 public synchronized void run(){
      try{   
           while(true){            	   
        	   ArrayList<ServidorAcao> listaTrataCliente = new ArrayList<ServidorAcao>();
        	   ServidorAcao serverAcao = new ServidorAcao(ss.accept()); 
        	   serverAcao.start();            	   
        	   listaTrataCliente.add(serverAcao);
               System.out.println("Servidor - cliente atendido");                   
           }     
      } [/code]

[code]class ServidorAcao extends Thread{
private Socket client;

public ServidorAcao(Socket s){   
	client = s;   
}   

public synchronized void run(){   
	try{ 
		while(true){
			ObjectOutputStream oo = new ObjectOutputStream(client.getOutputStream());
			oo.writeObject("numero 1");
			oo.writeObject("numero 2");				
			client.close(); 
		}
	}catch(Exception e){   
		e.printStackTrace();   
		System.exit(1);   
	}   
}

}
[/code]

[code]public class SimulaCliente extends Thread
{
private String server;
private int porta;
public static void main(String[] args){
try{
LeArquivoINI la = new LeArquivoINI(“C:/temp/configuracoes.ini”);
String server = la.getIdentificador(“servidor”);
int porta = 10000;
int numeroDeClientes = 2;

		for(int i=0; i < numeroDeClientes; i++){
			new SimulaCliente(server, porta).start();
			Thread.sleep(2000);
		}

	}catch(Exception e){
		e.printStackTrace();   
	}   
}  

public synchronized void run(){
	
	try{  
		
		while (true){
			Socket s = new Socket(server, porta);
			ObjectInputStream oi = new ObjectInputStream(s.getInputStream());
			System.out.println(this.getName() + " - " + oi.readObject());
			Thread.sleep(1000);
			System.out.println(this.getName() + " - " + oi.readObject());
			Thread.sleep(1000);
			s.close();
		}
		
	}catch(Exception e){   
		e.printStackTrace();   
	}
	//s.close();
}   

[/code]