Foro de elhacker.net

Programación => Java => Mensaje iniciado por: luismi_12 en 14 Junio 2014, 09:52 am



Título: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 09:52 am
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.


Título: Re: Problema Java
Publicado por: NikNitro! en 14 Junio 2014, 11:16 am
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


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 12:31 pm
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.


Título: Re: Problema Java
Publicado por: NikNitro! en 14 Junio 2014, 12:41 pm
Si quieres que se mande a varios usuarios a la vez necesitas usar sockets multicast y direcciones multicast

Salud


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 12:56 pm
He estado mirando, que seria mas facil, implementar el servidor en java y el cliente en javascirpt, o usar node.js para el servidor


Título: Re: Problema Java
Publicado por: NikNitro! en 14 Junio 2014, 12:58 pm
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


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 13:09 pm
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.


Título: Re: Problema Java
Publicado por: NikNitro! en 14 Junio 2014, 14:28 pm
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;)


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 16:00 pm
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


Título: Re: Problema Java
Publicado por: NikNitro! en 14 Junio 2014, 16:37 pm
En ese caso tendrías que aprender a conectarte a una base de datos desde Java a la base de datos mediante PHP ;)


Título: Re: Problema Java
Publicado por: ~ Yoya ~ en 14 Junio 2014, 18:47 pm
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.


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 18:59 pm
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.


Título: Re: Problema Java
Publicado por: ~ Yoya ~ en 14 Junio 2014, 19:02 pm
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.

Código
  1.  public void broadcastArticle(@Observes @NewArticleEvent ArticleEvent articleEvent) {
  2.    for (Session s : sessions) {
  3.      if (s.isOpen()) {
  4.        try {
  5.          // send the article summary to all the connected clients
  6.          s.getBasicRemote().sendText("New article up:" + articleEvent.getArticle().getSummary());
  7.        } catch (IOException ex) { ... }
  8.      }
  9.    }
  10.  }


Título: Re: Problema Java
Publicado por: 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.


Título: Re: Problema Java
Publicado por: ~ Yoya ~ en 14 Junio 2014, 19:08 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.


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 19:15 pm
Vale le seguire dando vueltas, pero ahora mismo lo tengo asi
Código:
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

Código:
<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>


Título: Re: Problema Java
Publicado por: ~ Yoya ~ en 14 Junio 2014, 19:49 pm
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.


Título: Re: Problema Java
Publicado por: 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.


Título: Re: Problema Java
Publicado por: ~ Yoya ~ en 14 Junio 2014, 19:57 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.


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 19:58 pm
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.


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 20:12 pm
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.


Título: Re: Problema Java
Publicado por: luismi_12 en 14 Junio 2014, 20:21 pm
Muchas gracias por vuestra ayuda, ya he arreglado el problema que habia al recibir.


Título: Re:
Publicado por: ~ Yoya ~ en 14 Junio 2014, 23:47 pm
Me alegro bro,  y para cualquier cosa estamos aquí.

Saludos.

Enviado desde mi HTC One_M8 mediante Tapatalk


Título: Re: Problema Java
Publicado por: Nasty35 en 15 Junio 2014, 15:12 pm
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).


Título: Re: Problema Java
Publicado por: luismi_12 en 17 Junio 2014, 16:55 pm
Y como podria hacer para poder mandar mensajes entre dos usuarios unicamente tal y como lo tengo ahora, seria demasiado complicado


Título: Re: Problema Java
Publicado por: ~ Yoya ~ en 18 Junio 2014, 05:06 am
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.