基于spring websocket实现广播及点对点推送功能

2021年11月21日 15点热度 0条评论 来源: chenjhit

本文针对 Web 开发中实现服务器往客户端推送消息的关键技术 websocket 进行重点说明,并且基于spring websocket 实现服务器对客户端的广播及点对点推送功能,供大家参考讨论。

websocket 说明

这里主要参考了:http://blog.csdn.net/pacosonswjtu/article/details/51914567
写得很好,让人能够比较容易的理解 websocket 的原理。如果读完本博客,希望更深入的理解 websocket 建议阅读上述内容。下面主要总结了在实现 websocket 时,需要特别注意的几个重要内容:

服务端配置

在 spring 框架下,实现服务端的配置有两种方法:一种是参照参考链接中的方法,新建 WebSocketConfig 类;另一种方式是在 spring 配置文件中引入 websocket 命名空间,通过配置 xml 配置文件完成。

客户端 websocket 连接及监听

JavaScript 示例代码如下:

function connectAny() { 
    var socket = new SockJS("/hello");
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function(frame) { 
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/user/'+id+'/message', function(greeting){ 
            alert(JSON.parse(greeting.body).content);
            showGreeting(JSON.parse(greeting.body).content);
        });
        stompClient.subscribe('/topic/feed', function(greeting){ 
            alert(JSON.parse(greeting.body).content);
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

websocket 连接成功的 http 请求状态码是101,有的情况下会是404(比如 tomcat7的部分低版本)。404 说明websocket 并没有连接成功,但是有时候推送功能依然有效,这是因为引入了 stomp,程序会自动使用替代方案实现 websocket 功能。
示例中 stompClient.subscribe() 中路径,即是被监听的路径。

服务端推送

在服务端任意位置推送消息,需要使用到 SimpMessageSendingOperations 类,使用 convertAndSend(D destination, Object payload) 方法将实现广播推送,使用 convertAndSendToUser(String user, String destination, Object payload) 方法将实现点对点推送。
注意:点对点推送方式将会自动添加上前缀,默认为“/user”,也可以在服务端配置的时候配置为其他前缀,而且也并不一定是用户名,可以使用任何能够标明目的地唯一性的其他字符串,比如 session id。

Demo 测试

下载链接:http://download.csdn.net/detail/chenjhit/9903733
开发环境:IntelliJ IDEA 2016.3.4
运行环境:jre1.8.0_131
服务器:Tomcat 8.5

连接测试

请求状态码:

控制台信息:

广播功能测试

访问广播请求:

接收广播信息1:

接收广播信息2:

点对点推送功能测试

监听目的地:

发送推送请求:

接收推送消息:

==========================================
疑问?帮助?批评?欢迎评论 | QQ:593159978

    原文作者:chenjhit
    原文地址: https://blog.csdn.net/chenjhit/article/details/75386410
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。