Итак, когда мы разобрались как реализовать WebSocket server с использованием NIO2.0. Я покажу лучший способ это сделать используя JSR 356, Java API for WebSocket. Обратите внимание насколько все просто. Достаточно обвесить обычный POJO следующими анатациями и упаковать как веб-приложение.
Код как обычно на https://github.com/Hibernate2009/websocket-jsr356.git
- @ServerEndpoint
- @OnOpen
- @OnMessage
- @OnClose
- @OnError
Код как обычно на https://github.com/Hibernate2009/websocket-jsr356.git
package com.bssys.ws;
import java.util.logging.Logger;
import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/echo")
public class WsChatServlet {
private Logger logger = Logger.getLogger(this.getClass().getName());
@OnOpen
public void onOpen(Session session) {
logger.info("Connected ... " + session.getId());
SessionManager.getInstance().addSession(session);
}
@OnMessage
public void onMessage(Session session, String message ) {
logger.info(String.format("Client %s send message %s", session.getId(), message));
SessionManager.getInstance().writeMessageToClients(session, message);
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
logger.info(String.format("Session %s closed because of %s", session.getId(), closeReason));
SessionManager.getInstance().removeSession(session);
}
@OnError
public void onError(Session session, Throwable throwable){
logger.info(String.format("Session %s error ", session.getId()));
SessionManager.getInstance().removeSession(session);
}
}
Вспомогательный класс для управления подключениями
package com.bssys.ws;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.websocket.Session;
public class SessionManager {
private final List<Session> sessions = Collections.synchronizedList(new ArrayList<Session>());
private static SessionManager instance;
private SessionManager() {
}
public static SessionManager getInstance() {
if (instance == null) {
instance = new SessionManager();
}
return instance;
}
public void addSession(Session session) {
sessions.add(session);
}
public void removeSession(Session session) {
sessions.remove(session);
}
public void writeMessageToClients(Session session, String message) {
synchronized (session) {
for (Session clientSession : sessions) {
if (session != clientSession) {
try {
clientSession.getBasicRemote().sendText(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
Комментариев нет:
Отправить комментарий