How to send message to a specific device by spring websocket
我对Spring websocket相当陌生。我在下面有一个简单的演示:
HandshakeInterceptor类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor { private static final Log logger = LogFactory .getLog(HandshakeInterceptor.class); @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { logger.info("Before Handshake"); return super.beforeHandshake(request, response, wsHandler, attributes); } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { logger.info("After Handshake"); super.afterHandshake(request, response, wsHandler, ex); } |
} ??
WebsocketEndPoint类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class WebsocketEndPoint extends TextWebSocketHandler { private static final Log logger = LogFactory .getLog(WebsocketEndPoint.class); @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { super.handleTextMessage(session, message); logger.info("Recieved Message:" + message.getPayload()); TextMessage returnMessage = new TextMessage(message.getPayload() +" received at server"); logger.info("Return Message:" + returnMessage.getPayload()); session.sendMessage(returnMessage); } |
} ??
弹簧映射websocket:
1 2 3 4 5 6 7 8 9 10 | <bean id="websocket" class="com.n9.api.websocket.handler.WebsocketEndPoint" /> <websocket:handlers> <websocket:mapping path="/websocket" handler="websocket" /> <websocket:handshake-interceptors> <bean class="com.n9.api.websocket.HandshakeInterceptor" /> </websocket:handshake-interceptors> </websocket:handlers> |
HTML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | function connect() { if ('WebSocket' in window){ console.log('Websocket supported'); socket = new WebSocket('ws://localhost:8080/n9-api/websocket'); console.log('Connection attempted'); socket.onopen = function(){ console.log('Connection open!'); } socket.onclose = function(){ console.log('Disconnecting connection'); } socket.onmessage = function (evt) { var received_msg = evt.data; console.log(received_msg); console.log('message received!'); } } else { console.log('Websocket not supported'); } } function disconnect() { setConnected(false); console.log("Disconnected"); } function sendMessage(message) { socket.send(JSON.stringify({ 'message': message })); } |
现在我想向特定用户发送消息。我定义每个设备都有一个deviceId,所以我想知道:
感谢您的关注。
您可以使用的会话是保存deviceId
1 | session.setAttribute("deviceId",deviceId); |
并在HandshakeInterceptor.java
中
1 2 3 4 5 6 7 8 9 | if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(false); if (session != null) { String deviceId= (String) session.getAttribute("deviceId"); attributes.put("websockt_deviceId",deviceId); } } |
在WebsocketEndPoint.java中,您需要类似
的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | private static final ArrayList<WebSocketSession> sessions; public void sendMessageToUser(String deviceId, TextMessage message) { for (WebSocketSession session: sessions) { if (session.getAttributes().get("websockt_deviceId").equals(deviceId)) { try { if (session.isOpen()) { session.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } break; } } } |
您可以从服务器向特定用户发送消息