2017-04-19 14 views
1

Ich baue eine Websocket-Anwendung mit Glassfish Ich brauche in einem bestimmten Ereignis mein Server zu senden Nachricht an alle angeschlossenen Clients. Ich kann Nachrichten von beiden senden und empfangen, aber ich kann den Klassenserver nicht zum Senden von Nachrichten verwenden.Senden von Nachrichten vom Server an Websocket-Clients

Meine Serverklasse hat die folgende Stelle:

@ApplicationScoped @ServerEndpoint("/actions") public class DeviceWebSocketServer {

@Inject 
private DeviceSessionHandler sessionHandler; 

@OnOpen 
public void open(Session session) { 
    sessionHandler.addSession(session); 
} 

@OnClose 
public void close(Session session) { 
    sessionHandler.removeSession(session); 
} 

@OnError 
public void onError(Throwable error) { 
    Logger.getLogger(DeviceWebSocketServer.class.getName()).log(Level.SEVERE, null, error); 
} 

@OnMessage 
public void handleMessage(String message, Session session) { 

    System.out.println("Chegou uma mensagem: " + message); 
    System.out.println("Na sessao: " + session.getId()); 

    try (JsonReader reader = Json.createReader(new StringReader(message))) { 
     JsonObject jsonMessage = reader.readObject(); 

     if ("add".equals(jsonMessage.getString("action"))) { 
      Device device = new Device(); 
      device.setName(jsonMessage.getString("name")); 
      device.setDescription(jsonMessage.getString("description")); 
      device.setType(jsonMessage.getString("type")); 
      device.setStatus("Off"); 
      sessionHandler.addDevice(device); 
     } 

     if ("remove".equals(jsonMessage.getString("action"))) { 
      int id = (int) jsonMessage.getInt("id"); 
      sessionHandler.removeDevice(id); 
     } 

     if ("toggle".equals(jsonMessage.getString("action"))) { 
      int id = (int) jsonMessage.getInt("id"); 
      sessionHandler.toggleDevice(id); 
     } 
    } 

} 

Wie sende ich Nachrichten an Kunden nach Empfang eines Ereignisses? Sollte ich meinen Klassenserver instanziieren?

Antwort

0

Theres ein Beispiel auf Howto Nachrichten an alle angeschlossenen Clients in diesem Whiteboard App senden: https://netbeans.org/kb/docs/javaee/maven-websocketapi.html

@ServerEndpoint(value="/whiteboardendpoint", encoders = {FigureEncoder.class}, decoders = {FigureDecoder.class}) 
public class MyWhiteboard { 

    private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>()); 

    @OnMessage 
    public void broadcastFigure(Figure figure, Session session) throws IOException, EncodeException { 
    System.out.println("broadcastFigure: " + figure); 
    for (Session peer : peers) { 
     if (!peer.equals(session)) { 
      peer.getBasicRemote().sendObject(figure); 
     } 
    } 
} 
Verwandte Themen