当前位置: 首页 > 知识库问答 >
问题:

如何通过spring websocket向特定设备发送消息

郑翰海
2023-03-14

我对Spring websocket相当陌生。我有一个简单的演示如下:

HandshakeInterceptor类:

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类:

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

}

Spring映射webSocket:

<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:

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

  1. 如何与属性握手,这将从客户端发送?
  2. 如何从客户端javascript发送握手属性?
  3. 如何通过握手属性从服务器发送消息到客户端?

感谢您的关注。

共有1个答案

曹普松
2023-03-14

您可以使用会话来保存设备ID

session.setAttribute("deviceId",deviceId);

在握手听筒里。JAVA

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,您需要一个类似

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

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

 类似资料:
  • 我正在研究使用从旧的Google云消息传递应用程序迁移的Firebase云消息传递向项目发送消息的可能性。 旧应用程序仅使用CURL和应用程序在我的服务器上的唯一GCM API密钥从php网页向Android设备发送消息。 因此,每个android设备只需注册代码,例如: 让 Google 服务器使每台设备都可单独寻址。(注册表存储在我的服务器上的MySql数据库中,因此我知道要处理哪个设备。 A

  • null curl--不安全--header“Authorization:key=AIZASYBidMyAuthKeyisFinel-6NCJXJ-1JUVEM”--header“content-type:application/json”-d“notification:title:note-title.body:note-body}”https://fcm.googleapis.com/fcm/

  • 我正在编写一个新的服务器应用程序(使用。net)向客户端(主要是android设备)发送通知,我正在使用firebase cloud messaging的新Http v1 api,我看到下面的Post请求主体发送主题通知 但是,我如何使用FCM Id向特定设备发送通知? 注意:我已经实现了使用旧版 API 向单个设备发送通知。

  • 我需要使用< code>aws-sdk-go lib通过设备令牌数组向多个设备发送SNS推送通知。 目前我正在使用以下步骤向SNS发送推送消息: 创建endpoint: 将消息发送到endpoint: 我还没有见过一种方法,只使用一个请求就可以将一个推送消息发送到多个设备。可能吗? 像这个例子来说明:

  • 我有一个包含用户名数据库的服务器。我还有一个Android应用程序,用户可以在服务器数据库中注册自己的用户名,也可以在服务器的GCM部分注册设备。 我目前正在服务器代码中使用GCM演示,它将多播一个推送通知到每个注册的设备。但是,我希望它能够将推送通知发送给某些用户,而不是每个注册的GCM设备。 我的第一个想法是将数据库中的每个用户与其GCM注册表关联起来。这样行吗?我读过一些关于regID更改或

  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的