Spring 基于websocket 的推送接收消息

Spring 基于websocket 的推送接收消息

创建后端服务类,通过ServerEndPoint注解将类注解为服务端

package com.erdp.service;

import javax.mail.Session;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndPoint(value = "/websocket/message/{userId}")
public class MessageServer {
    private static Map<String,MessageServer> clients = new ConcurrentHashMap<>();
    private Session session;
    private String userId;
    private static Map<String, List<String>> userAndSessions = new ConcurrentHashMap<>();
    @OnOpen
    public void onOpen(@PathParam("userId")String userId,Session session){
        this.session = session;
        this.userId = userId;
        String sessionId = session.getId();
        clients.put(sessionId,this);
        List<String> list = userAndSessions.get(userId);
        if(list == null){
            list = new ArrayList<>();
        }
        list.add(sessionId);
        userAndSessions.put(userId,list);
    }
    @OnClose
    public void onClose(){
        clients.remove(session.getId());
        List<String> list = userAndSessions.get(userId);
        list.remove(session.getId());
        if(list.size() == 0){
            userAndSessions.remove(userId);
        }
    }
    @OnError
    public void OnError(Session session,Throwable t){
        t.printStackTrace();
    }
    @OnMessage
    public void OnMessage(String userName,String text){
        sendMessageTo(userName,text);
    }
    public static void sendMessageTo(String userName,String text){
        List<String>list = userAndSessions.get(userName);
        if(list == null){
            return;
        }for(String sessionId:list){
            MessageServer messageServer = clients.get(sessionId);
            sendMessage(messageServer,text);
        }
    }

    private static void sendMessage(MessageServer messageServer,String message){
        if (messageServer != null){
            messageServer.session.getAsyncRemote().sendText(message);
        }
    }
}

前端客户端调用

layui.use(['jquery','layui'],function(){
   var layer  = layui.layer;
   $(function () {
        var websocket = null;
        if('WebSocket' in window){
            websocket = new WebSocket('/websocket/message/{userId}')
            websocket.onmessage = function(e) {
                o = false;
                if(timeout){
                    loginOut();
                }
            }
            websocket.onclose = function() {
                loginOut();
            }
            websocket.onmessage = function(ev) {
                var data = ev.data.replace(new RegExp("\n","gm"),"")
                var activeInfo = JSON.parse(data);
            }
        }
    })
});

调用方式

package com.erdp.service;
public class PasuController {
    MessageServer.sendMessageTo("userId","具体发送的消息内容");
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值