Cliente manda mensagens, Servidor não

Reparem nessas duas classes java.
O cliente manda mensagens para o servidor. O JList da GUI do servidor é preenchido conforme chegam mensagens, mas o JList da GUI do cliente não é alterado quando o servidor manda mensagens.
Alguém tem alguma dica para consertar, sem alterar muito a lógica das classes?

Classe ServidorEco:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class ServidorEco implements ActionListener {
    
   private JFrame janela = new JFrame("Servidor");
   private JLabel servidorLabel = new JLabel("Mensagem para o cliente:");
   private JLabel clienteLabel = new JLabel("Mensagem do cliente:");
   private JTextField servidorText = new JTextField("Digite sua mensagem para o cliente", 30);
   private DefaultListModel defaultListModel = new DefaultListModel();
   private JList clienteList = new JList();
   private JScrollPane scroll = new JScrollPane(clienteList);
   private JPanel panel = new JPanel();
   private JButton servidorButton = new JButton("Enviar");
   private ServerSocket serverSocket = null;
   private Socket socket;
   private BufferedReader entrada = null;
   private PrintStream saida = null;
   private String linha;
   private BufferedReader teclado = null;
    
   /** Creates a new instance of ServidorEco */
   public ServidorEco() {
   
      janela.setLayout(new FlowLayout()); 
      janela.setSize(640, 240);
      janela.setResizable(false);
      janela.add(servidorLabel);
      janela.add(servidorText);
      janela.add(servidorButton);
      panel.add(clienteLabel);
      panel.add(scroll);
      janela.add(panel);
      janela.setVisible(true);
      janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      servidorButton.addActionListener(this);
      
      try {
         serverSocket = new ServerSocket(4256);    
         while(true) {
    	    System.out.print("Esperando alguém se conectar...");
            socket = serverSocket.accept();
            System.out.println("Conectou!");
            entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            saida = new PrintStream(socket.getOutputStream());
            linha = entrada.readLine();
               while(linha != null && ! linha.trim().equals("")) {
                  saida.println("Eco: " + linha);
                  linha = entrada.readLine();
                  //
                  defaultListModel.addElement(linha);
                  clienteList.setModel(defaultListModel);
                  //
               }
               socket.close();
         }
      }
      catch(IOException ioe) {
         System.out.println(ioe);
      }
   
   }
    
   
   public void actionPerformed(ActionEvent ae) {
       
      if(ae.getSource() == servidorButton && ! servidorText.getText().trim().equals(""))
         saida.println(servidorText.getText());
            
   }

   public static void main(String[] args) {
      ServidorEco se = new ServidorEco();    
   }

}

Classe ClienteEco:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class ClienteEco implements ActionListener {
    
   private JFrame janela = new JFrame("Cliente");
   private JLabel clienteLabel = new JLabel("Mensagem para o servidor:");
   private JLabel servidorLabel = new JLabel("Mensagem do servidor:");
   private JTextField clienteText = new JTextField("Digite sua mensagem para o servidor", 30);
   private DefaultListModel defaultListModel = new DefaultListModel();
   private JList servidorList = new JList();
   private JScrollPane scroll = new JScrollPane(servidorList);
   private JPanel panel = new JPanel();
   private JButton clienteButton = new JButton("Enviar");
   private Socket socket = null;
   private BufferedReader entrada = null;
   private PrintStream saida = null;
   private String linha;
   private BufferedReader teclado = null;
    
   /** Creates a new instance of ClienteEco */
   public ClienteEco() {
   
      janela.setLayout(new FlowLayout()); 
      janela.setSize(640, 240);
      janela.setResizable(false);
      janela.add(clienteLabel);
      janela.add(clienteText);
      janela.add(clienteButton);
      panel.add(servidorLabel);
      panel.add(scroll);
      janela.add(panel);
      janela.setVisible(true);
      janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      clienteButton.addActionListener(this);
   
      try {
         socket = new Socket("127.0.0.1", 4256);
         entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
         saida = new PrintStream(socket.getOutputStream());
         teclado = new BufferedReader(new InputStreamReader(System.in));
         
         while(true) {
            System.out.print("> ");
            linha = teclado.readLine();
            saida.println(linha);
            linha = entrada.readLine();
            // 
            defaultListModel.addElement(linha);
            servidorList.setModel(defaultListModel);
            //
            if(linha == null) {
               System.out.println("Conexão encerrada!");
               break;
            }
            System.out.println(linha);
         }
      }
      catch(IOException ioe) {
         System.out.println(ioe);
      }
   
   }
   
   public void actionPerformed(ActionEvent ae) {
       
      if(ae.getSource() == clienteButton && ! clienteText.getText().trim().equals(""))
         saida.println(clienteText.getText());
   
   }
   
   public static void main(String[] args) {
      ClienteEco ce = new ClienteEco();    
   }
   
}

Faz um tempinho que não uso socket e swing eu raramente uso, mas vou tentar ajudar.

Entendendo seu programa, você tem o servidor rodando no 127.0.0.1:4256 aí cria um cliente que se conecta. O cliente lê o que você digita manda pro servidor e logo em seguida recebe a resposta do servidor né?

Só que olhando ali no código pelo que vi no servidor, você cria o objeto saida, depois instância ele com o saida = new PrintStream(socket.getOutputStream()); e aí que tenho uma dúvida, para você enviar algo pro cliente você não deveria ter feito saida.println(linha); como fez no cliente?[/code]

o que acontece exatamente quando vc manda?

Cara isso me parece problema de Thread, vc tem um while(true) em cada uma das suas classes isso faz com que o seu codigo pare quando encontrar um while(true) pois e um loop infinito, jogue o seu servidor e cliente dentro de threads

class Servidor implements Runnable{
public void run(){
while(true){
//codigo;
}
}

class Cliente implements Runnable{
public void run(){
while(true){
//codigo
}
}

class Principal{
public static void main(String args[]){
Thread t = new Thread(new Servidor(),"Servidor");
t.start();
Thread t1 = new Thread(new Cliente(), "Cliente");
t1.start();
}
}

Obrigado, mas até agora, ninguém ajudou…