Problema Java

Iniciado por luismi_12, 14 Junio 2014, 09:52 AM

0 Miembros y 1 Visitante están viendo este tema.

~ Yoya ~

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.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

luismi_12

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.

~ Yoya ~

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 (java) [Seleccionar]
  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) { ... }
      }
    }
  }
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

luismi_12

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.

~ Yoya ~

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.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

luismi_12

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>

~ Yoya ~

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.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

luismi_12

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.

~ Yoya ~

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.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

luismi_12

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.