本文针对 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