sockjs websocket,websocket stomp详解
最近有一个项目需要使用websocket。一开始我觉得很简单。但是,随着遇到的问题和了解的更多,我意识到websocket并没有我想象的那么简单。本文主要考虑websocket在客户端的使用。
1.http与websocket
Http超文本传输协议,大家都很熟悉了。http有几个版本:1.0、1.1和2.0。从http1.1开始,Keep-Alive在默认情况下是打开的,以保持连接的连续性。简单来说,当一个网页被打开时,客户端与服务器之间传输http数据的TCP连接不会被关闭。如果客户端再次访问该服务器上的网页,将继续使用该建立的连接,从而减少资源消耗并优化性能。但是,Keep-Alive也有时间限制。还有一种客户端只能发起请求获取返回的数据,而不能主动接收后台推送的数据,于是websocket应运而生。
Websocket是html5新增的功能之一。其目的是在浏览器和服务器之间建立一种全双工的通信方式,解决http请求-响应带来的资源过度消耗,同时为特殊场景应用提供一种全新的实现方式,如聊天、炒股、游戏等对实时性要求较高的行业。
http和websocket都是基于TCP(传输控制协议)的,websocket可以看作是http的补充。
2.SockJs
SockJS是一个JavaScript库。为了解决很多浏览器不支持WebSocket协议的问题,设计了一个替代的SockJs。SockJS是对WebSocket技术的模拟。SockJS会尽可能对应WebSocket API,但是如果WebSocket技术不可用,就会自动降为轮询。
3.Stompjs
面向简单文本的消息协议
SockJS为WebSocket提供了一个替代方案。但无论哪种场景,这种沟通形式的层次都太低,无法实际应用。STOMP协议,为浏览器和服务器之间的通信添加适当的消息语义。
4.WebSocket、SockJs、STOMP三者关系
简而言之,WebSocket是底层协议,SockJS是WebSocket的替代品,STOMP是基于WebSocket的上层协议(SockJS)。
1.HTTP协议解决了web浏览器发起请求和web服务器响应请求的细节问题。假设HTTP协议不存在,只能用TCP socket来写web应用。
2.直接使用WebSocket(SockJS)非常类似于使用TCP socket编写web应用程序。因为没有高层协议,所以我们需要定义应用程序之间发送的消息的语义,我们还需要保证连接的两端都能遵循这些语义;
3.由于HTTP在TCP socket上增加了请求-响应模型层,STOMP在WebSocket上提供了基于帧的线路格式层来定义消息语义;
5.使用实例
安装sockjs-client和stompjs;这里需要注意的是,我在 stompjs 的版本中发现:^2.3.3介绍stompjs会报错找不到net模块,需要在stompjs模块的根目录下执行npm install。这是一个奇妙的问题。
简介模块:
从“sockjs-client”导入sock js;从“stompjs”导入Stomp//连接函数let number=1;函数reconnect(socket URL){ let URL=` $ { BASE _ URL }/ws/SDF point `;//连接地址//建立连接对象(连接尚未发起)let socket=new SockJS(URL);//获取stomp子协议的客户端对象letstomp client=stomp . over(socket);//向服务器发起websocket连接,发送connect帧stompClient.connect( {},//可以添加客户端的认证信息,函数connectCallback (){//连接成功的回调函数//订阅通道stomp client . subscribe(/topic/display/control ,function(data){ if(data){ console . log( subscribe data ,data);}}}},函数错误回调(error){//连接失败时再次调用函数号=1;if(number=10){ reconnect(URL);} console.log(error ,error);}}}总结:websocket实现客户端看起来简单,但是需要和后台做好协调和调试,才能达到最好的效果。通过SockJS和Stomp,浏览器兼容性可以增加消息语义,增强可用性。要彻底理解websocket,我们需要了解一些底层原理和相关知识。
这就是本文的全部内容。希望对大家的学习和支持有帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。