La clase Hilo
Código Java:
Ver originalimport 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 originalimport 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;
}
}
}
}