Viene de Atender a varios clientes con hilos: chat en java
Para el cliente he aplicado una especie de patrón modelo-vista-controlador, aunque a mi manera (nunca he entendido del todo cómo se aplica estrictamente este patrón).
El modelo se supone que son los datos que maneja el cliente. En este caso, el modelo sería la conversación. Como lo único que pretendemos es que se vea y no hay que modificarla y no es necesario ni siquiera guardarla, pues no he puesto nada que se parezca a un modelo.
La vista es la ventana que lo presenta todo. Eso sí lo he hecho y lo he hecho de tal forma que el PanelCliente no sabe nada de nadie más. No ve ni necesita al socket para nada. El panel únicamente admite suscriptores (nuevamente un patrón observador que ya nos ofrece java) para enterarse de cuándo se pulsa el botón "enviar" o la tecla "enter" en el campo de texto. También tiene métodos para obtener qué ha escrito el usuario y para añadir una nueva línea en el textArea. Haciendo esto así, el panel es bastante genérico y, de hecho, se parece mucho al del mini-navegador. Con poco esfuerzo, podría hacerse una única clase para ambos.
En cuanto al controlador es la clase ControlCliente. Esta es la que conoce el socket y la que se suscribe a la pulsación de "enviar" en el PanelCliente. Todo lo que llega por el socket lo añade al PanelCliente y cada vez que se pulsa "enviar" en el PanelCliente, le pide el texto escrito por el usuario y lo envía por el socket.
Basta de rollos y vamos a lo que te interesa, el código del ejemplo. Te lo puedes bajar de chat.zip. Vete a un directorio cualquiera y lo desempaquetas. Allí mismo lo compilas y lo ejecutas. Los comandos serían más o menos estos.
Por supuesto, deberías arrancar varios clientes para ver cómo funciona. Además, el código está puesto a pelo que se busquen en local, así que debes arrancar el servidor y los clientes en el mismo ordenador.
El código es el que se ha ido comentado aquí, pero algo más liado, porque está completo y necesita montones de try-catch. Además, he puesto algún synchronized, aunque habría que revisarlo bien.