Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Chat con varias salas

Hola a todos.

He programado un chat en java totalmente funcional y ahora me gustaría que se pudieran crear varias "salas" o "canales" a modo de IRC. El problema es que he definido una clase Sala en la cual creo los flujos de entrada y salida para comunicarme con los diferentes clientes, pero no consigo vislumbrar como hacer "varios de esos objetos Sala" y hacer que los diferentes clientes conectados al chat reciban solo los mensajes de un determinado canal.

Si creo un array de Sala y distingo los diferentes objetos almacenados ahí e intento diferenciarlos de algun modo... el resultado es desastroso. No pido que me pongais el código aquí. Simplemente algun tipo de estrategia para conseguir lo que busco.

Un saludo y gracias.

mayo 1, 2012 | Unregistered CommenterMatene

Una manera de diferenciar diversas instancias del mismo tipo puede realizarse con un Map, con el "nombre" de la Sala como key, y la instancia de la Sala como value.

mayo 1, 2012 | Registered Commenterchoces

Ya he hecho algo parecido. He añadido un atributo String a la clase Sala y a la hora de recibir un mensaje recorro el array y compruebo si el mensaje va dirigido a a esa Sala. Pero no funciona.

Es mas, se me ocurre otro problema. En realidad lo que yo hago es "enganchar" sockets de clientes al socket del servidor, con lo que en un posible escenario de, por imaginar, 300 clientes conectados, las respuestas del servidor llenarían la red local debido a que esas respuestas llegarían a todos los clientes, y serían estos los que a su vez deberían discriminar también.

Quizá la cosa vaya por usar un puerto local para el cliente también y que el sevidor, a su vez, sea capaz de almacenar de alguna forma la ip del cliente y ese puerto, para poder comunicarse.

No se, es la primera vez que programo algo complicado con sockets. Tal vez me este metiendo a mayores.
Salu2.

mayo 1, 2012 | Unregistered CommenterMatene

¿Por que no filtras en el lado del servidor en lugar de que cada cliente filtre los mensajes? Así evitarías tráfico innecesario.

mayo 1, 2012 | Registered Commenterantoniovl

Hola, gracias por la respuesta.

Evidentemente hay que filtrar en el lado del servidor para mandar el mansaje a la sala correspondiente, pero, ¿y las respuestas de los demas usuarios? Estas tendrían que ir "del servidor-a los demas clientes", con lo que se nos plantea el problema de como poner en comunicacion una determinada sala del chat SOLO Y EXCLUSIVAMENTE SOLO con los usuarios conectados a ella, para de esta forma tener que evitar mandar mensajes a todo el mundo.

Es complicado el concepto para mi. Salu2.

mayo 2, 2012 | Unregistered CommenterMatene

@choces ya te ha dado una buena pista, la cual podríamos ampliar brevemente. Si puedes agrupar en el servidor los usuarios (o sockets) por sala, se facilita la tarea. El mensaje de un cliente lo muestras localmente y lo transmites al servidor, y el servidor lo retransmitirá al resto de los participantes de la sala (agrupados en el servidor). Para ello puedes implementar una clase, digamos ChatRoom, que pueda almacenar usuarios (o sockets) y esos ChatRooms los puedes mantener agrupados en el servidor con una instancia de Map.

mayo 2, 2012 | Registered Commenterantoniovl

Gracias. Voy a hacer un último intento a ver si me sale.
Salu2.

mayo 3, 2012 | Unregistered CommenterMatene