La clase Hilo
    
Código Java:
Ver original- import java.io.BufferedReader; 
- import java.io.IOException; 
- import java.io.InputStreamReader; 
- import java.io.PrintWriter; 
- import java.net.Socket; 
-   
- public class-  Hilo  extends Thread {
 
-      
-     //Se establece el socket y nick 
-     private Socket-  clientSocket  = null;
 
-      
-     //Se crea el constructor 
-   
-         this.clientSocket = param; 
-   
-     } 
-      
-     //Metodo run necesario por el hilo 
-     public void run(){ 
-   
-         try { 
-              
-             //Aqui el cliente conecta con el servidor 
-             out.println("Conectando con el servidor....."); 
-             out.println("Conectado"); 
-              
-             //Cuando se conecta un cliente el servidor manda un mensaje al resto de clientes 
-             //diciendo quien se ha conectado 
-             this.nick = in.readLine(); 
-             Servidor.comunicar_a_todos("Se ha conectado: " + this.nick, this.nick, 1); 
-   
-             //Se envia el mensaje al resto de clientes 
-             while(true){ 
-   
-                 String-  mensaje  =-  in. readLine();
 
-                  
-                 //Si el mensaje es FIN se envia un mensaje a todos diciendo quien se ha desconectado 
-                 if(mensaje.equals("FIN")){ 
-                     Servidor.comunicar_a_todos("Se ha desconectado: " + this.nick, this.nick, 2); 
-                     out.println("FIN"); 
-                     break; 
-                 } 
-   
-                 Servidor.comunicar_a_todos(mensaje,this.nick, 3); 
-   
-             } 
-   
-             Servidor.eliminar_socket_cliente(this.clientSocket); 
-             clientSocket.close(); 
-   
-   
-             // TODO Auto-generated catch block 
-             e.printStackTrace(); 
-         } 
-   
-     } 
-   
- }//Fin clase. 
Y la clase servidor    
Código Java:
Ver original- import java.io.IOException; 
- import java.io.PrintWriter; 
- import java.net.ServerSocket; 
- import java.net.Socket; 
- import java.util.ArrayList; 
- import java.util.Iterator; 
- import javax.swing.JOptionPane; 
-   
- public class Servidor { 
-   
-     /** 
-      * @param args 
-      */ 
-      
-     //Creo un ArrayList de Sockets (no sabia como hacerlo con un array) 
-     private static ArrayList<Socket> listadoClientes = new ArrayList<Socket>(); 
-   
-     //Creo un ArrayList de usuarios conectados. Este lo he creado para sacar la lista de  
-     //usuarios conectados pero no lo he conseguido al final. Por tanto por aqui hay codigo 
-     //que sobra. 
-     private static ArrayList<String> listadoConectados = new ArrayList<String>(); 
-   
-     private static String-  cadena_usuariosConectados  = "";
 
-   
-     public static void-  main (String[]-  args ) {
 
-         // TODO Auto-generated method stub 
-   
-         //Delcaro el puerto que usa el servidor 
-         try { 
-             //Instancio el serverSocket 
-   
-             while(true){ 
-                 //Lo meto en un bucle infinito para que siempre este escuchando  
-                 //y aceptando peticiones de clientes 
-                 Socket-  cliente  =-  serverSocket. accept();
 
-                 new Hilo(cliente).start(); 
-                 //Cuando se conecta un cliente le añado a la lista 
-                 listadoClientes.add(cliente); 
-   
-             } 
-   
-             // TODO Auto-generated catch block 
-             e.printStackTrace(); 
-         } 
-   
-     } 
-     //Creo este metodo sincronizado para que los mensajes lleguen a la vez a los clientes  
-     public static synchronized void-  comunicar_a_todos (String-  mensaje,  String-  nick,  int-  tipo ){
 
-   
-         //El servidor comunica a todos los clientes conectados los nicks que van conectando 
-         //y los nicks que se van desconectando y los mensajes que escribe cada uno. 
-   
-          
-         //Al ser listadoClientes un arrayList tenemos que recorrerlo con un iterador 
-         Iterator<Socket> itr = listadoClientes.iterator(); 
-          
-         //Definimos un tipo para saber si un cliente se conecta o se desconecta 
-         if(tipo == 1){ 
-              
-                     listadoConectados.add(nick); 
-                 cadena_lista_conectados(); 
-                  
-             
-                  
-         } 
-   
-         if(tipo == 2){ 
-             listadoConectados.remove(nick); 
-             cadena_lista_conectados(); 
-         } 
-   
-         while(itr.hasNext()) { 
-             s = itr.next(); 
-             try { 
-                 if(tipo == 1){ //Se conecta un nuevo cliente 
-                     p.println(mensaje); //Pinta: Se ha conectado: ...               
-                 }else if(tipo == 2){ //Se desconecta un cliente 
-                     p.println(mensaje); //Pinta: Se ha desconectado: ... 
-                 }else{// Intercambio de mensajes 
-                     p.println(nick + ">" + mensaje); 
-                 } 
-                 // TODO Auto-generated catch block 
-                 e.printStackTrace(); 
-             } 
-   
-         } 
-         cadena_usuariosConectados = ""; 
-     } 
-   
-   
-     private static void cadena_lista_conectados(){ 
-         //Transforma el ArrayList de usuarios conectados a cadena para enviar por el socket 
-          
-         for(String-  s :- listadoConectados ){
 
-              
-             cadena_usuariosConectados += s + "\n"; 
-         } 
-   
-     } 
-   
-     public static synchronized void-  eliminar_socket_cliente (Socket-  cliente ){
 
-   
-         Iterator<Socket> itr = listadoClientes.iterator(); 
-   
-         while(itr.hasNext()){ 
-   
-   
-             if(soc.equals(cliente)){ 
-                 itr.remove(); 
-                 break; 
-             } 
-         } 
-     } 
-   
- }