关于javascript:如何通过spring websocket将消息发送到特定设备

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,所以我想知道:

  • 如何与将从客户端发送的属性进行握手?
  • 如何从客户端JavaScript发送握手属性?
  • 如何通过握手属性从服务器向客户端发送消息?
  • 感谢您的关注。


    您可以使用的会话是保存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;
            }
        }
    }

    您可以从服务器向特定用户发送消息