websocket详解

2023-11-16

之前利用websocket以及jQuery做了一个聊天通讯应用,最近在总结整个过程中的一些问题,也借此机会聊聊websocket协议。

webSocket本身不存在跨域问题,所以可以利用webSocket来进行非同源之间的通信。

webSocket协议

传统的http协议有着一个缺陷:其模型是客户端请求,服务器响应的形式,并且连接完之后就断开,这种就造成了一个问题,服务端可不可以在实现长连接的同时,让响应将数据发送呢?诚然,目前http2.0也推出了服务器推送的功能,但是目前http2.0并未完全取代http1.1。由于上面的问题,webSocket协议就应运而生。

webSocket协议与http协议

Webscoket是Web浏览器和服务器之间的一种全双工通信协议,与http协议相比

共同点:
1、都是基于TCP协议的;
2、都是客户端-服务器模型;
3、默认端口都是80或者443(ws,http:80,wss,https:443;)
4、webSocket协议是基于http的;(个人观点:我并不确定这个说法是否准确,但是我个人感觉可以这样说)
不同点:
1、webSocket协议可以服务器主动推数据;(最大的特点)
2、没有同源限制;
3、数据格式多、效率高;
4

这里主要说一下,我上面说的第4点共同点,我主要是从webSocket协议的报文角度出发得到的这个观点,下面来看看这个例子:

客户端请求:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

根据客户端请求,我们可以看出实际上发出的还是http请求,但是在http握手完成后,由于请求中携带着Upgrade、Connection字段会将http协议升级成webSocket协议。在响应中,状态码以及响应字符串分别是101、Switching Protocols。另外,需要注意的是Sec-WebSocket-Key字段是很重要的,目前还没整理完,后续慢慢补上。
基于上面的分析,个人觉得webSocket协议是基于http的。

心跳检测与重连机制

由于webSocket是面向客户端与服务端且双方可以互相发送数据,那么保持连接没有断开是极为重要的一点。webSocket利用心跳检测来判断连接状态,如果发生了断开,那么就启用重连机制,让客户端-服务器继续保持连接。
心跳检测:每隔一个时间,发一次消息,检测连接状态。
先来上一段代码,后面再做分析

<html>
<head>
  <meta charset="utf-8">
  <title>WebSocket Demo</title>
</head>
<body>
  <script type="text/javascript">
    var lockReconnect = false;//避免重复连接
    var url = "http://localhost:3000";
    var ws;
    var tt;
    function createWebSocket() {
      try {
        socket = io(url);
        init();
      } catch(e) {
        reconnect(url);
      }
    }
    function init() {
      socket.onclose = function () {
        reconnect(url);
      };
      socket.onerror = function() {
        reconnect(url);
      };
      socket.onopen = function () {
        //心跳检测重置
        heartCheck.start();
      };
      socket.onmessage = function (e) {
        //拿到任何消息都说明当前连接是正常的
        console.log('接收到消息');
        heartCheck.start();
      }
    }
    
    function reconnect(url) {
      if(lockReconnect) {
        return;
      };
      lockReconnect = true;
      //没连接上会一直重连,设置延迟避免请求过多
      if(tt){clearTimeout(tt)}
      tt = setTimeout(function () {
        createWebSocket(url);
        lockReconnect = false;
      }, 3000);
    }
    //心跳检测
    var heartCheck = {
      timeout: 3000,
      timer : null,
      serverTimeoutObj: null,
      start: function(){
        var self = this;
        this.timer && clearTimeout(this.timer );
        this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
        this.timer = setTimeout(function(){
          //心跳消息,后端收到返回心跳消息,
          socket.send("HeartBeat");
          self.serverTimeoutObj = setTimeout(function() {
            socket.close()
            // 超时重连
          }, self.timeout);
        }, this.timeout)
      }
    }
    createWebSocket(url);
  </script>
</body>
</html>

首先,我们分析一下连接断开的原因

1、正常断开,利用监听close函数,可以进行重连;
2、报错断开,利用监听error函数,可以进行重连;
3、非正常断开,比如网络问题,前端问题或者后端问题,都会造成一个结果,那就是发出消息无法收到回应,这就是心跳检测的原理。当一方发出消息之后,另一方必须做出回应,通过message进行监听,如果没有收到消息或者消息超时,则默认连接断开,调用close函数,而websocket监听到close函数,立即重新连接。如果收到消息直接重新计时。

未完待续~~~~


参考文章:
掘金:前端必备 HTTP 技能之 WebSocket 协议详解
思否:理解WebSocket心跳及重连机制(五)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

websocket详解 的相关文章

随机推荐

  • Java前后端分离动态国际化(动态配置扩展性高)

    介绍 主要是针对前后端分离场景国际化系统设计 亮点 1 动态国际化配置 2 可维护性 3 国际化数据池化 性能高 4 后端数据内容动态国际化 5 提供前台动态国际化数据 6 后台异常国际化处理 7 可动态添加国际化的语种 8 国际化配置集中
  • React中路由组件的lazyLoad

    1 通过React的lazy函数配合import 函数动态加载路由组件 gt 路由组件代码会被分开打包 const Login lazy gt import pages Login 2 通过
  • 生成一定相关性的二元正态分布

    生成一定相关性的二元正态分布 摘要 二元正态分布 二元正态分布概率密度函数 二元正态分布随机数的生成 程序实现 多元正态分布的情况 生成服从 N
  • 【http】10,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE]

    1 概述 本日使用http远程连接获取远程接口信息报错 10 000 milliseconds timeout on connection http outgoing 0 ACTIVE 022 12 23 09 54 15 181 ERRO
  • C潜规则篇之防止重定义

    C程序编译时常出现类似xxx redefinition错误 除了模块间的命名冲突 命名污染及static 问题多数与头文件管理有关 大型C工程的头文件管理很麻烦 C源文件往往包含很多头文件 头文件又包含其他头文件 形成复杂的嵌套包含 C没有
  • Android 逆向工程,反编译心得

    前言 apk的反编译是我们在Android开发中绕不开的一个坎 对于反编译这门技术 我们应该抱着学习的态度 学的越多 也越能防备别人反编译我们 这就是所谓的知己知彼吧 哈哈 需要准备的工具 Apktool 解包和重新打包都需要它 dex t
  • 在什么情况下、使用python类的使用-使用Python编程时的10个注意事项

    原标题 使用Python编程时的10个注意事项 1 初始变化量 在Python里 一个表达式中的名字在它被赋值之前是没法使用的 这是有意而为的 这样能避免一些输入失误 同时也能避免默认究竟应该是什么类型的问题 0 None 记住把计数器初始
  • iOS Provisioning Profile(Certificate)与Code Signing详解

    引言 关于开发证书配置 Certificates Identifiers Provisioning Profiles 相信做iOS开发的同学没少被折腾 对于一个iOS开发小白 半吊子 比如像我自己 抑或老兵 或多或少会有或曾有过以下不详 疑
  • “Intel VT-x处于禁用状态”如何处理

    在安排虚拟机时 出现Intel VT x处于禁用状态时 第一步 进入bios页面 就是重装系统的那个页面 有的电脑是F1 F2 F10 F12 具体多少上网查查就行了 将intel Virtual Technology改成enabled 第
  • 回调函数&&回调机制

    所谓回调 定义是 一个方法的指针传递给事件源 当某一事件发生时用来调用这个方法 比如客户程序C调用服务程序S中的某个函数A 然后S又在某个时候反过来调用C中的某个函数B 对于C来说 这个B便叫做回调函数 例如Win32下的窗口过程函数就是一
  • 如何写CSDN博客

    如何写CSDN博客 我这里使用Typora软件先将博客写好 这个软件可以去应用商城下载 写好以后我们打开CSDN博客网页 找到创作中心的写文章 然后我们会找到导入 找到我们要选择发布的博客 导入后我们发现博客里的图片图片导入失败 我们需要手
  • Kappa 与 Lambda 架构介绍与对比

    Lambda 架构 Lambda 架构由Storm的作者Nathan Marz提出 其设计目的在于提供一个能满足大数据系统关键特性的架构 包括高容错 低延迟 可扩展等 其整合离线计算与实时计算 融合不可变性 读写分离和复杂性隔离等原则 可集
  • Ubuntu mysql配置root用户远程登录

    查看mysql默认密码登录数据库 cat etc mysql debian cnf 查看root用户数据 use mysql select User Host authentication string from user 增加root用户
  • Android中Context详解 ---- 你所不知道的Context

    大家好 今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友 Context类 说它熟悉 是应为我们在开发中 时刻的在与它打交道 例如 Service BroadcastReceiver Activity等都会利用到Context的相关方法
  • AngularJS 2调用.net core WebAPI的几个坑

    前几天 按照AngularJS2的英雄指南教程走了一遍 教程网址是http origin angular live docs ts latest tutorial 在步骤完成后 又更进一步 在英雄增删改的时候 直接调用 net core的W
  • 关于 clock_gettime() 的一个问题以及解决方法

    在新的2 6x内核上 编译使用这个函数的程序的时候 会发现 如果 gcc lpthead 无法链接成功 原因在于 libpthread so中没有这个函数的实现 但是 libpthread a中有 还有一个librt so librt a中
  • 堆和栈的通俗解释【转】

    数据结构的栈和堆 首先在数据结构上要知道堆栈 尽管我们这么称呼它 但实际上堆栈是两种数据结构 堆和栈 堆和栈都是一种数据项按序排列的数据结构 栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧 它是一种具有后进先出性质的数据结构 也就是
  • 医院RFID药物跟踪管理解决方案

    1 技术背景 基于 2018年2月6日 药物调配商QuVa Pharma 与Kit Check合作 为其医院药房客户 提供基于RFID药物跟踪管理解决方案 QuVa提供的系统包括Kit Check的 无源 超高频 UHF RFID 标签 该
  • WEB基础-变形动画

    字体图标 IconFont 图标字体也叫字体图标 就是字体做的图标 可以通过设置字体的方式改变图标的样式 受到近些年 扁平化设计 的影响 越来越多的图标都开始使用 IconFont 下载字体图标 首先打开IconFont 阿里巴巴矢量图标库
  • websocket详解

    之前利用websocket以及jQuery做了一个聊天通讯应用 最近在总结整个过程中的一些问题 也借此机会聊聊websocket协议 webSocket本身不存在跨域问题 所以可以利用webSocket来进行非同源之间的通信 webSock