Hola buenas, estoy haciendo un chat en java, pero tengo un problema, los mensajes solo se le muestran al usuario que se les manda, estoy usando javascript en el cliente y java en el servidor. Estoy enviando los datos al cliente por session, pero no consigo que se le manden a todos los usuarios.
Estás usando sockets, supongo, no? Yo ahora mismo estoy haciendo uno de punto a punto en java (lo estoy subiendo a mi blog, en la firma :P).
Supongo que estarás probando en red local no? Sino tendrías que abrir puertos :P
Si estoy usando websocket, el servidor esta en java y el cliente en javascript, pero no se como hacer para que se mande a todos los usuarios, si supieras donde puedo ver un ejemplo o algo por el estilo, ya que buscando solo he conseguido liarme mas.
Si quieres que se mande a varios usuarios a la vez necesitas usar sockets multicast y direcciones multicast
Salud
He estado mirando, que seria mas facil, implementar el servidor en java y el cliente en javascirpt, o usar node.js para el servidor
La verdad es que node.js no se aún. Yo lo he hecho enteramente en Java (ahora quiero hacer un cliente en c++ para ver hasta donde pueden complementarse). Pero mi servidor es una raspberry con el servidor cargado en segundo plano, por lo que si (en tu caso) es un servicio de hosting gratuito, no te valdría.
Salud
Y para poder hacer un socket multicast con direcciones multicast como seria, la verdad yo quiero hacer un chat sencillo que el mensaje se mande a todos los usuarios es decir a un textarea.
Las dos opciones que vi en su momento (y que estoy llevando adelante) son:
1º Que Java esté conectado a una Base de Datos. Se pueden enviar mensajes con nombre de usuario receptor o una constante "remite". El cliente descargaría todos los mensajes de "remite" como si fuera un multicast. Todos podrían enviar y recibir a ese "remite" y formar un chat grupal.
2º: Cada cliente en Java es un servidor también. Es necesario abrir puertos. El socket que usa java en estos casos en el servidor es 'MulticastSocket'. El mensaje tendría que enviarse a una direccion de multicast (creo que de la 224.0.0.0 a la 239.255.255.255, en cualquier caso te vale con la 224.0.0.1, por ejemplo :p ). Cada cliente debería de conectarse (usando .joinGroup() a la misma dirección multicast para poder recibir.
Salud;)
Al final voy a optar por la base de datos ya que de los websocket por mucho que lo he mirado no tengo ni idea
En ese caso tendrías que aprender a conectarte a una base de datos desde Java a la base de datos mediante PHP ;)
Never give up :P
Lo que pasa que cada vez que el cliente (javascript en este caso) se conecta al servidor de Websockets, se crea una sesión nueva para ese cliente. Y cada vez que otro cliente ingresa es otra sesión nueva independiente de las demás. Por lo tanto todos mantienen una comunicación independiente, algo así como una conexión Punto a Punto.
Lo que puedes hacer obtener todas las sesiones activas en el servidor, y ir mandando el mensaje a todas las sesiones abiertas.
No utilices socket multicast porque seria complicarse mucho mas, y no obtendrías las ventajas, performance ni el nivel de abstracción que te ofrece Websockets. Y encimas tendrías que configurar puertos de los clientes y tener en cuenta que el firewall no bloquee esos puertos... Y para lo que deseas hacer no deberías utilizar socket multicast y tampoco no existe una api en javascript para recibir dichos mensajes.
Tomando en cuenta que Websockets puede correr sobre HTTP por lo tanto no tendrás problema, prueba de eso es que pudiste establecer una comunicación cliente servidor sin mucho problema :D.
Te dejo unos links que te podrían ayudar mucho en lo que te interesa hacer:
http://stackoverflow.com/questions/18481597/how-to-get-an-existing-websocket-instance
Este ultimo link tomarlo de referencia.
http://java.dzone.com/articles/creating-websocket-chat
PD: Te recomiendo que te leas sobre la especificación de WebSocket de JavaEE 7, para que no tengas este tipo de problema. Ya que sabrás como funciona todo.
Saludos.
Ya he estado mirando esos ejemplos, pero como podria hacer para que se hiciera un broadcast cada vez que hay un onmensaje, si me puedierais ayudar por favor.
En el primer LINK, ponen un ejemplo compa. Te recomiendo que lo examines y dime que hace el trozo de código que acabo de poner copiado del link antes de volver a postear.
public void broadcastArticle(@Observes @NewArticleEvent ArticleEvent articleEvent) {
for (Session s : sessions) {
if (s.isOpen()) {
try {
// send the article summary to all the connected clients
s.getBasicRemote().sendText("New article up:" + articleEvent.getArticle().getSummary());
} catch (IOException ex) { ... }
}
}
}
Lo que hace es por cada sesion que hay abierta mandarles el articulo. Lo que pasa que si lo modifico en local para que mande lo recibe del formulario ya no me funciona.
Cita de: luismi_12 en 14 Junio 2014, 19:05 PM
Lo que hace es por cada sesion que hay abierta mandarles el articulo. Lo que pasa que si lo modifico en local para que mande lo recibe del formulario ya no me funciona.
No entendí. Pero piensa porque no esta funcionando y piensa como haz programado todo, y llegaras a una conclusión.
Vale le seguire dando vueltas, pero ahora mismo lo tengo asi
package com.apuntesdejava.websocket;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/broadcast")
public class MyEndpoint {
// EJB that fires an event when a new article appears
@EJB
// a collection containing all the sessions
private static final Set<Session> sessions =
Collections.synchronizedSet(new HashSet<Session>());
@OnOpen
public void onOpen(final Session session) {
sessions.add(session);
}
@OnClose
public void onClose(final Session session) {
// remove the session from the set
sessions.remove(session);
}
@OnMessage
public void broadcastArticle(String message) {
for (Session s : sessions) {
if (s.isOpen()) {
try {
// send the article summary to all the connected clients
s.getBasicRemote().sendText(message);
} catch (IOException ex) { }
}
}
}
}
Y el scrip asi
<script type="text/javascript">
var wsUri = "ws://localhost:8080/Hlc/broadcast";
var websocket = new WebSocket(wsUri); //creamos el socket
websocket.onopen = function(evt) {
};
websocket.onmessage = function(evt) {
document.getElementById("msgArea").textContent += message.data + "\n";
console.log(message.data);
};
websocket.onerror = function(evt) {
log("oho!.. error:" + evt.data);
};
function log(mensaje) { //aqui mostrará el LOG de lo que está haciendo el WebSocket
var logDiv = document.getElementById("log");
logDiv.innerHTML += (mensaje + '<br/>');
}
function EnviarServidor() {
websocket.send(document.getElementById("msg").value)
document.getElementById("msg").value = "";
}
</script>
Lo acabo de probar el código y funciona con múltiple cliente.
Pero tuve que editar un poco el código Java para quitar cosas innecesarias y el cliente javascript tienen errores, uno de ellos es que nunca veras lo mensaje que el servidor envía al cliente...
Y la razón porque no te funciona y de tus problemas es que haz copiado código o trozos de código y me refiero mas al cliente en javascript. Y no sabes a nivel técnico 100% como funciona lo que haz hecho porque haz copiado y como no entiendes todo lo que tienes entonce no sabes donde y como solucionar el problema.
Así que ya sabes, a debuguear ese código javascript y dejar de copiar.
Saludos.
Me podrias decir, mas o menos por donde estan los errores, ya se que lo mejor es aprender por uno mismo pero ayer me revento la aplicacion donde usaba este codigo y llevo dos dias contando hoy, dando vueltas a por que no se contecta a la base de datos, digo si puedes, es que no voy muy sobrado de tiempo.
Cita de: luismi_12 en 14 Junio 2014, 19:52 PM
Me podrias decir, mas o menos por donde estan los errores, ya se que lo mejor es aprender por uno mismo pero ayer me revento la aplicacion donde usaba este codigo y llevo dos dias contando hoy, dando vueltas a por que no se contecta a la base de datos, digo si puedes, es que no voy muy sobrado de tiempo.
Solo dos días? En el mundo de la programacion duras varios dias con un problema es normal. Y gracias a esos problemas es crecemos como programadores :D
Cuando lo soluciones tu mismo, alcanzaras un nuevo nivel de programación!!!
Y ese derecho no te lo pienso quitar.
Ya lo se, pero es que esto estaba completo, pero es parte de una aplicacion que debo entregar este lunes, me pegue dias investigando ya que no habia estudiado ni trabajado en la vida con websocket.
El problema esta al recibir el mensaje, en el javascript, pero no llego a ver correctamente el fallo, ya que si le digo que al enviar me escriba hola en el textarea, funciona correctamente.
Muchas gracias por vuestra ayuda, ya he arreglado el problema que habia al recibir.
Me alegro bro, y para cualquier cosa estamos aquí.
Saludos.
Enviado desde mi HTC One_M8 mediante Tapatalk
Crea una lista (Map<Integer, Socket> clientes), cada vez que se conecte/desconecte vas añadiendo/quitando, y cuando quieras enviar un mensaje a todos basta con un for.
(En vez de Socket en el Map, puedes crear una clase para manejar las conexiones, ahí usa lo que quieras).
Y como podria hacer para poder mandar mensajes entre dos usuarios unicamente tal y como lo tengo ahora, seria demasiado complicado
Estudia la especificación de Websocket de Java EE bro. No deberías preguntar como hacer cualquier cosa cada vez que no sepas hacer algo...
Y en cualquier caso, deberías abrir otro hilo con tu duda nueva y con un titulo mas descriptivo.