[文末赠书]手把手教你SpringBoot整合websocket实现消息推送

Java学习之道

共 4173字,需浏览 9分钟

 · 2021-01-30

点击上方 Java学习之道,选择 设为星标

每天12点,干货准时奉上!

来源: segmentfault.com/a/1190000011908831
作者: kunm

依赖

  • springboot基础环境,请参考springboot文档
  • maven依赖

            org.springframework.boot
            spring-boot-starter-websocket
        

环境准备

准备常量类

//webSocket相关配置
    //链接地址
    public static String WEBSOCKETPATHPERFIX = "/ws-push";
    public static String WEBSOCKETPATH = "/endpointWisely";
    //消息代理路径
    public static String WEBSOCKETBROADCASTPATH = "/topic";
    //前端发送给服务端请求地址
    public static final String FORETOSERVERPATH = "/welcome";
    //服务端生产地址,客户端订阅此地址以接收服务端生产的消息
    public static final String PRODUCERPATH = "/topic/getResponse";
    //点对点消息推送地址前缀
    public static final String P2PPUSHBASEPATH = "/user";
    //点对点消息推送地址后缀,最后的地址为/user/用户识别码/msg
    public static final String P2PPUSHPATH = "/msg";

接收前端消息实体

public class WiselyMessage {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

后台发送消息实体

private String responseMessage;

    public WiselyResponse(String responseMessage){
        this.responseMessage = responseMessage;
    }

    public String getResponseMessage() {
        return responseMessage;
    }

    public void setResponseMessage(String responseMessage) {
        this.responseMessage = responseMessage;
    }

配置websocket

@Configuration
// @EnableWebSocketMessageBroker注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller)
// 开始支持@MessageMapping,就像是使用@requestMapping一样。
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        //注册一个Stomp的节点(endpoint),并指定使用SockJS协议。
        stompEndpointRegistry.addEndpoint(Constant.WEBSOCKETPATH).withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //服务端发送消息给客户端的域,多个用逗号隔开
        registry.enableSimpleBroker(Constant.WEBSOCKETBROADCASTPATH, Constant.P2PPUSHBASEPATH);
        //定义一对一推送的时候前缀
        registry.setUserDestinationPrefix(Constant.P2PPUSHBASEPATH);
        //定义websoket前缀
        registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);
    }
}

service

@Service
public class WebSocketService {

    @Autowired
    private SimpMessagingTemplate template;

    /**
     * 广播
     * 发给所有在线用户
     *
     * @param msg
     */
    public void sendMsg(WiselyResponse msg) {
        template.convertAndSend(Constant.PRODUCERPATH, msg);
    }

    /**
     * 发送给指定用户
     * @param users
     * @param msg
     */
    public void send2Users(List users, WiselyResponse msg) {
        users.forEach(userName -> {
            template.convertAndSendToUser(userName, Constant.P2PPUSHPATH, msg);
        });
    }
}

控制器

@Controller
public class WsController {

    @Resource
    WebSocketService webSocketService;

    @MessageMapping(Constant.FORETOSERVERPATH)//@MessageMapping和@RequestMapping功能类似,用于设置URL映射地址,浏览器向服务器发起请求,需要通过该地址。
    @SendTo(Constant.PRODUCERPATH)//如果服务器接受到了消息,就会对订阅了@SendTo括号中的地址传送消息。
    public WiselyResponse say(WiselyMessage message) throws Exception {
        List users = Lists.newArrayList();
        users.add("d892bf12bf7d11e793b69c5c8e6f60fb");//此处写死只是为了方便测试,此值需要对应页面中订阅个人消息的userId
        webSocketService.send2Users(users, new WiselyResponse("admin hello"));

        return new WiselyResponse("Welcome, " + message.getName() + "!");
    }
}

页面


"http://www.thymeleaf.org">

    "UTF-8" />
    Spring Boot+WebSocket+广播式


"disconnect()">


    

        "connect" onclick="connect();">连接
        "disconnect" disabled="disabled" onclick="disconnect();">断开连接
    

    "conversationDiv">
        type="text" id="name" />
        "sendName" onclick="sendName();">发送
        "response">


        "response1">


    









测试

点击连接控制台输出

表示连接成功并且订阅了两个地址

此时在文本框内输入任意值 结果如图所示则代表成功

控制台中显示依次为,发送信息,目标长度内容

此时服务端控制器接收到请求

同时给指定用户发送了消息,所以控制台接收到消息

同时因为控制器有注解@SendTo所以会向@SendTo的地址广播消息,客户端订阅了广播地址所有控制台显示接收了消息

送书活动
首先,感谢北京大学出版社为 "Java学习之道" 提供的书籍赞助,非常感谢!后续公众号头条推文,1周至少会有1-2次的文末送书活动,大家记得看完文章后,多多参与送书哈,混脸熟也能中奖

《程序员数学从零开始》

从人们身边常见的整数讲起,逐步深入,介绍了数论、计数、图论、机器学习等领域的一些典型算法及其原理,尤其是算法背后的数学原理,可以让读者轻松对算法建立更深入的理解。


可点击下方链接直接购买
  • 「一等奖」:1名 --《程序员数学从零开始》书籍一本
  • 「二等奖」:2 名 -- 现金红包 9.99 元
  • 「三等奖」:3 名 -- 现金红包 6.66 元
  • 「幸运奖」:10名 -- 现金红包 1 元

👉 免费获取方法:

2月4日前公众号后台回复 【 java学习 即可参与活动!!!

扫码回复「java学习」抽奖品

没加小编微信的建议先加一下小编微信,方便中奖之后安排发货和领

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报