从服务器向websocket客户端发送消息

时间:2017-04-19 13:15:57

标签: java websocket glassfish

我正在使用glassfish构建一个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);
        }
    }

}

如何在收到活动后向客户发送消息?我应该实例化我的班级服务器吗?

1 个答案:

答案 0 :(得分:0)

这是一个关于如何向此白板应用中的所有连接客户端发送消息的示例: 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);
        }
    }
}