在vue中使用SockJS实现webSocket通信的过程


Posted in Javascript onAugust 29, 2018

最近接到一个业务需求,需要做一个聊天信息的实时展示的界面,这就需要和服务器端建立webSocket连接,从而实现数据的实时获取和视图的实时刷新.在此将我的实现记录下来,希望可以给有同样需求的人一些帮助.废话少说,下面我就来讲一下我的实现过程:

socksjs

•客户端和服务器端api尽可能简洁,尽量靠近websocket api
•支持服务端扩展和负载均衡技术
•传输层应该全面支持跨域通信
•如果受到代理服务器的限制,传输层能优雅地从一种方式回退到另一种方式
•尽可能快地建立连接
•客户端只是纯粹的JavaScript,不需要flash
•客户端JavaScript必须经过严格的测试
•服务器端代码尽可能简单,降低用另一种语言重写server的代价

前提

要进行文章中的代码的测试,需要服务端端开发人员配合你,提供相关的通信接口.来完成客户端和服务端的通信.实现通信,我们需要用到另个模块 sockjs-client 模块和 stomjs 模块,接下来我会先对这两个模块做一个简单的介绍.

关于实时通信

实现实时通信,我们通常有三种方法:

ajax轮询 ajax轮询的原理非常简单,让浏览器每隔几秒就像服务器发送一个请求,询问服务器是否有新的信息.

http 长轮询 长轮询的机制和ajax轮询差不多,都是采用轮询的方式,不过才去的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起链接后,如果没有消息,就一直不返回response给客户端.知道有新的消息才返回,返回完之后,客户端再此建立连接,周而复始.

WebSocket WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议.在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送,不需要繁琐的询问和等待. 从上面的介绍很容易看出来,ajax轮询和长轮询都是非常耗费资源的,ajax轮询需要服务器有很快的处理速度和资源,http长轮询需要有很高的并发,也就是同时接待客户的能力.而WebSocket,只需要经过一次HTTP请求,就可以与服务端进行源源不断的消息收发了.

sockjs-client

sockjs-client 是从SockJS中分离出来的用于客户端使用的通信模块.所以我们就直接来看看SockJS. SockJS是一个浏览器的JavaScript库,它提供了一个类似于网络的对象,SockJS提供了一个连贯的,跨浏览器的JavaScriptAPI,它在浏览器和Web服务器之间创建了一个低延迟,全双工,跨域通信通道. 你可能会问,我为什么不直接用原生的WebSocket而要使用SockJS呢?这得益于SockJS的一大特性,一些浏览器中缺少对WebSocket的支持,因此,回退选项是必要的,而Spring框架提供了基于SockJS协议的透明的回退选项。SockJS提供了浏览器兼容性,优先使用原生的WebSocket,如果某个浏览器不支持WebSocket,SockJS会自动降级为轮询.

stomjs

STOMP(Simple Text-Orientated Messaging Protocol) 面向消息的简单文本协议; WebSocket是一个消息架构,不强制使用任何特定的消息协议,它依赖于应用层解释消息的含义. 与HTTP不同,WebSocket是处在TCP上非常薄的一层,会将字节流转化为文本/二进制消息,因此,对于实际应用来说,WebSocket的通信形式层级过低,因此,可以在 WebSocket 之上使用STOMP协议,来为浏览器 和 server间的 通信增加适当的消息语义。

STOMP与WebSocket 的关系:

  • HTTP协议解决了web浏览器发起请求以及web服务器响应请求的细节,假设HTTP协议不存在,只能使用TCP套接字来编写web应用,你可能认为这是一件疯狂的事情;
  • 直接使用WebSocket(SockJS)就很类似于使用TCP套接字来编写web应用,因为没有高层协议,就需要我们定义应用间发送消息的语义,还需要确保连接的两端都能遵循这些语义;
  • 同HTTP在TCP套接字上添加请求-响应模型层一样,STOMP在WebSocket之上提供了一个基于帧的线路格式层,用来定义消息语义.

代码实现

代码中除了最基本的连接,还设置了一个定时器,每隔十秒发送一条数据到服务器端,如果发生错误,catch这个错误,重新建立连接.

// 安装并引入相关模块
import SockJS from 'sockjs-client'; 
import Stomp from 'stompjs';
export default {
 data() {
  return {
  dataList: []
  };
 },
 mounted:function(){
  this.initWebSocket();
 },
 beforeDestroy: function () {
  // 页面离开时断开连接,清除定时器
  this.disconnect();
  clearInterval(this.timer);
 },
 methods: {
  initWebSocket() {
  this.connection();
  let self = this;
  // 断开重连机制,尝试发送消息,捕获异常发生时重连
  this.timer = setInterval(() => {
   try {
   self.stompClient.send("test");
   } catch (err) {
   console.log("断线了: " + err);
   self.connection();
   }
  }, 5000);
  },
  removeTab(targetName) {
  console.log(targetName)
  },
  connection() {
  // 建立连接对象
  this.socket = new SockJS('http://xxxxxx:8089/ws');//连接服务端提供的通信接口,连接以后才可以订阅广播消息和个人消息
  // 获取STOMP子协议的客户端对象
  this.stompClient = Stomp.over(this.socket);
  // 定义客户端的认证信息,按需求配置
  var headers = {
   login: 'mylogin',
   passcode: 'mypasscode',
   // additional header
   'client-id': 'my-client-id'
  };
  // 向服务器发起websocket连接
  this.stompClient.connect(headers,(frame) => {
   this.stompClient.subscribe('/topic/chat_msg', (msg) => { // 订阅服务端提供的某个topic
   consolel.log(msg.body); // msg.body存放的是服务端发送给我们的信息
   });
  }, (err) => {
   
  });

  },
  disconnect() {
  if (this.stompClient != null) {
   this.stompClient.disconnect();
   console.log("Disconnected");
  }
  }
 }
};

总结

以上所述是小编给大家介绍的在vue中使用SockJS实现webSocket通信的过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 弹出窗体点击按钮返回选择数据的实现
Apr 01 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
Nov 14 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
javaScript 计算两个日期的天数相差(示例代码)
Dec 27 Javascript
jquery实现动态画圆
Dec 04 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
jQuery大于号(>)选择器的作用解释
Jan 13 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
Apr 10 Javascript
AngularJS基础 ng-srcset 指令简单示例
Aug 03 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 Javascript
jQuery实现遮罩层登录对话框
Dec 29 Javascript
Javascript执行流程细节原理解析
May 14 Javascript
微信小程序自定义select下拉选项框组件的实现代码
Aug 28 #Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 #Javascript
vee-validate vue 2.0自定义表单验证的实例
Aug 28 #Javascript
vue+element-ui动态生成多级表头的方法
Aug 28 #Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 #jQuery
对Vue table 动态表格td可编辑的方法详解
Aug 28 #Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 #Javascript
You might like
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
js实现消息滚动效果
2017/01/18 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
js仿360开机效果
2019/12/26 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
用python代码做configure文件
2014/07/20 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
ECHT官方网站:男女健身服
2020/02/14 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
播音主持女孩的自我评价分享
2013/11/20 职场文书
中英文自我评价语句
2013/12/20 职场文书
课程设计心得体会
2013/12/28 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
客户经理岗位职责
2015/01/31 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript