2017-04-19 50 views
1

glassfishを使用してwebsocketアプリケーションを構築しています。指定されたイベントで、接続されているすべてのクライアントにメッセージを送信するためにサーバーが必要です。両方からメッセージを送受信できますが、クラスサーバーを使用してメッセージを送信することはできません。私は、イベントを受け取った後、顧客にメッセージを送信するにはどうすればよいサーバーからwebsocketクライアントにメッセージを送信

@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); 
     } 
    } 

} 

私のサーバークラスには、次の体を持っていますか?クラスサーバーをインスタンス化する必要がありますか?

答えて

0

このホワイトボードアプリで接続されたすべてのクライアントにメッセージを送信HOWTOの例をtheresの: 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); 
     } 
    } 
} 
関連する問題