Foros del Web » Programación para mayores de 30 ;) » Java »

Sockets Multicliente

Estas en el tema de Sockets Multicliente en el foro de Java en Foros del Web. Buenos Dias !!! Tengo este script de un Servidor el cual me gustaria que me ayudaseis a implementar unas cosas.... 1º Necesito que guarde en ...
  #1 (permalink)  
Antiguo 23/09/2014, 03:56
tukymix
Invitado
 
Mensajes: n/a
Puntos:
Sockets Multicliente

Buenos Dias !!!

Tengo este script de un Servidor el cual me gustaria que me ayudaseis a implementar unas cosas....

1º Necesito que guarde en un list todos los clientes que se conecten y cuando se desconecten pues que lo borre de list.
2º Implementar un for o algo el cual recorra todo ese list para mandar a todos los clientes conectados un string.

Alguien podria ayudarme ? Gracias de Antemano

Código Java:
Ver original
  1. import java.io.*;
  2. import java.net.*;
  3.  
  4. public class MultiEchoServer
  5. {
  6.     private static ServerSocket ServidorSocket;
  7.     private static final int Puerto = 1234;
  8.  
  9.     public static void main(String[] args) throws IOException{
  10.         try{ ServidorSocket = new ServerSocket(Puerto); }
  11.         catch (IOException e){
  12.             System.out.println("\nNo se puede establecer conexion con el puerto!");
  13.             System.exit(1);
  14.         }
  15.  
  16.         do{
  17.             //En espera de un nuevo cliente
  18.             Socket cliente = ServidorSocket.accept();
  19.  
  20.             System.out.println("\nNuevo cliente aceptado.\n");
  21.            
  22.             ClienteEscucha escucha = new ClienteEscucha(cliente);
  23.             escucha.start();
  24.            
  25.         }while (true);
  26.     }
  27. }
  28.  
  29. class ClienteEscucha extends Thread{
  30.     private Socket cliente;
  31.     private BufferedReader entrada;
  32.     private PrintWriter salida;
  33.  
  34.     public ClienteEscucha(Socket socket){
  35.         cliente = socket;
  36.  
  37.         try{
  38.             entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
  39.             salida = new PrintWriter(cliente.getOutputStream(),true);
  40.         }
  41.         catch(IOException e){
  42.             e.printStackTrace();
  43.         }
  44.     }
  45.  
  46.     public void run()
  47.     {
  48.         try{
  49.             String recibido;
  50.            
  51.             do{
  52.                
  53.                 recibido = entrada.readLine();
  54.                
  55.                 salida.println("ECHO: " + recibido);
  56.  
  57.             }while (!recibido.equals("QUITAR"));
  58.         }
  59.  
  60.         catch(IOException e){
  61.             e.printStackTrace();
  62.         }
  63.        
  64.         finally{
  65.             try{
  66.                 if (cliente!=null){
  67.                     System.out.println("Cerrando la conexion...");
  68.                     cliente.close();
  69.                 }
  70.             }
  71.             catch(IOException e){
  72.                 e.printStackTrace();
  73.             }
  74.         }
  75.     }
  76. }

Última edición por tukymix; 23/09/2014 a las 10:56
  #2 (permalink)  
Antiguo 23/09/2014, 13:21
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Sockets Multicliente

Buenas,

Lo que pides no tiene sentido, ya que tu código solo permite un cliente conectado al mismo tiempo. ¿Lo has probado?


Un saludo
  #3 (permalink)  
Antiguo 23/09/2014, 16:17
tukymix
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sockets Multicliente

Esque no entiendo mucho, pensaba que lo del Thread es para algo de mas de un cliente, la cosa es que lo pruebo con 2 clientes y me recoge lo que escribo de los 2 clientes, por eso necesito que el server guarde esos clientes que se conecten en un list, para despues recorrer ese list de los clientes conectados y mandarles a todos los clientes un mensaje, la cosa es que me gustaria que alguien me lo adaptase, esque nose como hacerlo, o bien que me haga uno sencillo desde cero, pero con esas funciones, que guarde en un list los clientes que se conecten y despues que en un for recorra ese list de todos los clientes y les mande un mensaje.
  #4 (permalink)  
Antiguo 24/09/2014, 00:40
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Sockets Multicliente

Buenas,

Tienes razon, no ne habia fijado en que efectivamente haces el while(true).

De cualquier forma me extrana tu problema, ya que lo que te queda por hacer, comparado con lo que ya has hecho, es absolutamente trivial.

Tienes que declarar una lista de ClienteEscucha en el server y cada vez que creas un cliente lo anades a la lista.

Para poder eliminar clientes, deberas pasar el servidor al constructor de ClienteEscucha y cuando este termine de ejecutar el run() hacer una llamada para eliminarlo de la lista.

Para enviar los mensajes bastara un metodo que recorra la lista de ClienteEscucha y llame un metodo de este que escriba un mensaje.


Un saludo
  #5 (permalink)  
Antiguo 24/09/2014, 02:12
tukymix
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sockets Multicliente

Aham, ok !!! Y tu podrias, ya sabiendo lo que necesito, podrias aplicarmelo en el script de arriba ? Esque eso es un ejemplo que vi en internet, y como yo nose mucho de java, no me aclaro en aplicar el metodo del for que recorra el list y envie el mensaje. He visto este link: http://stackoverflow.com/questions/1...to-all-sockets y ahi esta como implementar una lista añadiendo clientes dentro del while y ademas en el Script Server de un usuario que respondió, tiene dentro del script esto:
Código Java:
Ver original
  1. protected void sendMessage(String message) {
  2.             outputWriter.println(message);
  3.         }
  4.  
  5.         private void sendToAnyone(String message) {
  6.  
  7.             for (ConnectionService connection : connections) {
  8.                 connection.sendMessage(message);
  9.             }
  10.         }

que es lo que me gustaria implementar en mi codigo, porque entiendo que una es la funcion que recorre todo el list en este caso llamado connections, y el otro envia el mensaje con outputWriter, la cosa es que no se, siempre me da errores por un sitio u otro, tu podrias arreglarmelo ? Mira, lo acabo de hacer asi, nose si esta bien o mal, unicamente me da un error en el listaclientes del "private void sendToAnyone(String message)" porque listaclientes esta detro del "public class MultiEchoServer", aqui dejo el script modificado como lo he echo yo, he incluido dentro del while el "listaclientes.add(escucha);", echale un vistazo:

Código Java:
Ver original
  1. public class MultiEchoServer
  2. {
  3.     private static ServerSocket ServidorSocket;
  4.     private static final int Puerto = 1121;
  5.     private static List<ClienteEscucha> listaclientes = new ArrayList<ClienteEscucha>();
  6.    
  7.     public static void main(String[] args) throws IOException{
  8.         try{ ServidorSocket = new ServerSocket(Puerto); }
  9.         catch (IOException e){
  10.             System.out.println("No se puede establecer conexion con el puerto!\n");
  11.             System.exit(1);
  12.         }
  13.  
  14.         do{
  15.             //En espera de un nuevo cliente
  16.             Socket cliente = ServidorSocket.accept();
  17.            
  18.             System.out.println("Nuevo cliente aceptado.\n");
  19.            
  20.             ClienteEscucha escucha = new ClienteEscucha(cliente);
  21.             escucha.start();
  22.            
  23.             listaclientes.add(escucha);
  24.            
  25.         }while (true);
  26.     }
  27. }
  28.  
  29. class ClienteEscucha extends Thread{
  30.     private Socket cliente;
  31.     private BufferedReader entrada;
  32.     private PrintWriter salida;
  33.    
  34.     public ClienteEscucha(Socket socket){
  35.         cliente = socket;
  36.  
  37.         try{
  38.             entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
  39.             salida = new PrintWriter(cliente.getOutputStream(),true);
  40.         }
  41.         catch(IOException e){
  42.             e.printStackTrace();
  43.         }
  44.     }
  45.  
  46.     public void run()
  47.     {
  48.         try{
  49.             String recibido;
  50.            
  51.             do{
  52.                
  53.                 recibido = entrada.readLine();
  54.                
  55.                 salida.println(recibido);
  56.  
  57.             }while (!recibido.equals("QUITAR"));
  58.         }
  59.  
  60.         catch(IOException e){
  61.             e.printStackTrace();
  62.         }
  63.        
  64.         finally{
  65.             try{
  66.                 if (cliente!=null){
  67.                     System.out.println("Cerrando la conexion del servidor...\n");
  68.                     cliente.close();
  69.                 }
  70.             }
  71.             catch(IOException e){
  72.                 e.printStackTrace();
  73.             }
  74.         }
  75.     }
  76.    
  77.     protected void sendMessage(String message) {
  78.         salida.println(message);
  79.     }
  80.  
  81.     private void sendToAnyone(String message) {
  82.  
  83.         for (ClienteEscucha connection : listaclientes) {
  84.             connection.sendMessage(message);
  85.         }
  86.     }
  87. }

Última edición por tukymix; 24/09/2014 a las 02:37
  #6 (permalink)  
Antiguo 24/09/2014, 03:22
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Sockets Multicliente

Solo te falta aplicar esto:

Para poder eliminar clientes, deberas pasar el servidor al constructor de ClienteEscucha y cuando este termine de ejecutar el run() hacer una llamada para eliminarlo de la lista.

Para enviar los mensajes bastara un metodo que recorra la lista de ClienteEscucha y llame un metodo de este que escriba un mensaje.


Te lo pongo sobre lo tuyo. Revisalo porque lo he puesto aqui directamente y lo mismo hay algo que no compila:

Código Java:
Ver original
  1. public class MultiEchoServer
  2. {
  3.     private static ServerSocket ServidorSocket;
  4.     private static final int Puerto = 1121;
  5.     private List<ClienteEscucha> listaclientes = new ArrayList<ClienteEscucha>();
  6.    
  7.     public static void main(String[] args) throws IOException{
  8.         MultiEchoServer server = new MultiEchoServer();
  9.         try{ ServidorSocket = new ServerSocket(Puerto); }
  10.         catch (IOException e){
  11.             System.out.println("No se puede establecer conexion con el puerto!\n");
  12.             System.exit(1);
  13.         }
  14.  
  15.         do{
  16.             //En espera de un nuevo cliente
  17.             Socket cliente = ServidorSocket.accept();
  18.            
  19.             System.out.println("Nuevo cliente aceptado.\n");
  20.            
  21.             ClienteEscucha escucha = new ClienteEscucha(cliente, server);
  22.             escucha.start();
  23.            
  24.             server.addClient(escucha );
  25.            
  26.         }while (true);
  27.     }
  28.  
  29.     public void addClient(ClienteEscucha clienteEscucha) {
  30.        listaclientes.add(clienteEscucha);
  31.     }
  32.  
  33.     public void removeClient(ClienteEscucha clienteEscucha) {
  34.        listaclientes.remove(clienteEscucha);
  35.     }
  36.  
  37.     //Este metodo lo llamas cuando quieras enviar un mensaje a todos
  38.     public void sendToAnyone(String message) {
  39.  
  40.         for (ClienteEscucha connection : listaclientes) {
  41.             connection.sendMessage(message);
  42.         }
  43.     }
  44. }
  45.  
  46. class ClienteEscucha extends Thread{
  47.     private Socket cliente;
  48.     private BufferedReader entrada;
  49.     private PrintWriter salida;
  50.     private MultiEchoServer server;
  51.    
  52.     public ClienteEscucha(Socket socket, MultiEchoServer server){
  53.         cliente = socket;
  54.         this.server = server;
  55.  
  56.         try{
  57.             entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
  58.             salida = new PrintWriter(cliente.getOutputStream(),true);
  59.         }
  60.         catch(IOException e){
  61.             e.printStackTrace();
  62.         }
  63.     }
  64.  
  65.     public void run()
  66.     {
  67.         try{
  68.             String recibido;
  69.            
  70.             do{
  71.                
  72.                 recibido = entrada.readLine();
  73.                
  74.                 salida.println(recibido);
  75.  
  76.             }while (!recibido.equals("QUITAR"));
  77.         }
  78.  
  79.         catch(IOException e){
  80.             e.printStackTrace();
  81.         }
  82.        
  83.         finally{
  84.             try{
  85.                 if (cliente!=null){
  86.                     System.out.println("Cerrando la conexion del servidor...\n");
  87.                     cliente.close();
  88.                 }
  89.                 server.removeClient(this);
  90.             }
  91.             catch(IOException e){
  92.                 e.printStackTrace();
  93.             }
  94.         }
  95.     }
  96.    
  97.     protected void sendMessage(String message) {
  98.         salida.println(message);
  99.     }
  100.  
  101. }

Creo que esta todo.


Un saludo

Última edición por Profesor_Falken; 24/09/2014 a las 05:14
  #7 (permalink)  
Antiguo 24/09/2014, 09:27
tukymix
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sockets Multicliente

Bueno, creo que ya esta todo echo jejeje, gracias de todas maneras, cualquier duda te mandare mp. Gracias !!
  #8 (permalink)  
Antiguo 24/09/2014, 12:36
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Sockets Multicliente

Yo no contesto privados.

Lo que quieras comentar lo puedes comentar aquí

Etiquetas: sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:24.