当前位置: 首页 > article >正文

深入浅出WebSocket(实践聊天室demo)

文章目录

    • 什么是WebSocket?
      • WebSocket连接过程
    • WebSocket与Http的区别
    • 重连机制
      • 完整代码
      • 使用方法
    • 心跳机制
    • 实现聊天室demo(基于Socket.io)
    • 参考文章、视频
    • 小广告~

什么是WebSocket?

在这里插入图片描述

WebSocket 是一种在单个TCP连接上进行全双工通信的协议(计算机网络应用层的协议)

在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。(维基百科)

特点:

  1. 与HTTP协议有良好的兼容性,默认端口也是80和443,握手阶段采用HTTP协议
  2. 建立在TCP协议之上,服务端的实现比较容易

WebSocket连接过程

  1. 建立握手
    客户端发起HTTP请求,请求头中含有

    Connection: Upgrade
    Upgrade: Websocket
    Sec-WebSocket-Key:  xxx // 提供给服务器来验证是否收到一个有效的WebSockets请求
    Sec-WebSocket-Version: xxx  // 版本
    

    服务器收到之后,明白要升级websocket连接。向客户端发送101状态码的响应

    101 Switching Protocols
    Connection: Upgrade
    Upgrade: Websocket
    Sec-WebSocket-Accept: xxx
    

    之后就可以进行双端通信

WebSocket与Http的区别

在这里插入图片描述

  1. 二者都是基于TCP,都是应用层协议。但是websocket只是在建立握手时,数据是通过HTTP传输的。

重连机制

目的是防止WebSocket,断开连接时,能主动重连(区分主动断开,不进行重连)

完整代码

// 订阅发布--EventDispatcher
class EventDispatcher {
   
    listeners= {
   };
    addEventListener(type, listener) {
     // 收集依赖
        if (!this.listeners[type]) {
   
            this.listeners[type] = [];
        }
        if (this.listeners[type].indexOf(listener) === -1) {
   
            this.listeners[type].push(listener);
        }
    }
    removeEventListener(type) {
     // 清空依赖
        this.listeners[type] = [];
    }
    dispatchEvent(type, data) {
     // 循环执行callback
        const listenerArray = this.listeners[type] || [];
        if (listenerArray.length === 0) return;
        listenerArray.forEach(listener => {
   
            listener

http://www.kler.cn/a/387024.html

相关文章:

  • git没有识别出大写字母改成小写重命名的文件目录
  • SQL,力扣题目1127, 用户购买平台
  • vue请求数据报错,设置支持跨域请求,以及2种请求方法axios或者async与await
  • 服务器显卡和桌面pc显卡有什么不同
  • MoneyPrinterTurbo – 开源的AI短视频生成工具
  • ArkTs简单入门案例:简单的图片切换应用界面
  • 掌握鸿蒙生态的崛起之机:开发者的挑战与机遇
  • 递推经典例题 - 爬楼梯
  • 微服务系列五:避免雪崩问题的限流、隔离、熔断措施
  • mybatis+postgresql,无感读写json字段
  • Docker 中部署 SQL Server
  • OSPF(Open Shortest Path First,开放式最短路径优先)动态路由介绍
  • 分析Element Plus UI 中 mt-x 类的基本知识
  • Axure设计之三级联动选择器教程(中继器)
  • [网络架构设计师论文] ‌论企业云数据中心安全防范技术
  • 【linux】再谈网络基础(二)
  • 使用EasyExcel实现excel导入
  • 31.7K+ Star!AgentGPT:一个在浏览器中运行的Agent
  • 全排列(DFS)
  • 【MIT-OS6.S081笔记1】Chapter1阅读摘要:Operating system interfaces
  • Spring Boot的过滤器与拦截器的区别
  • 【C++ 滑动窗口】2134. 最少交换次数来组合所有的 1 II
  • Anaconda安装和环境配置教程(2024年11月9日)
  • Kafka 之事务消息
  • GJ Round (2024.10) Round 8~21
  • 鸿蒙多线程开发——Worker多线程