Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录

    • WebSocket的特点
        • 1、工作原理
        • 2、特点
        • 3、WebSocket 协议介绍
        • 4、安全性
    • WebSocket的使用
      • 一、服务端
        • 1、创建实例:创建一个webScoket实例对象
          • 1.1、WebSocket.Server(options[,callback])方法中options对象所支持的参数
          • 1.2、同样也有一个加密的 wss:// 协议。类似于 WebSocket 中的 HTTPS。
        • 2、监听连接:ws通过connection事件来监听连接
        • 3、发送数据:ws通过send()方法来发送数据
        • 4、接收数据:ws通过message事件来接收数据
        • 5、关闭WebSocket服务器:通过监听close事件关闭服务器
      • 二、客户端
        • 1、客户端实现WebScoket连接
        • 2、WebScoket的重连机制
        • 3、WebScoket的心跳保活
        • 4、客户端主动断开连接
        • 5、WebScoket添加token的几种方法
          • 5.1、使用send发送参数
          • 5.2、请求地址中携带参数
          • 5.3、基于协议头
      • 三、入门例子
        • 1、服务端
          • 1.1、ws模块:
          • 1.2、安装ws:
          • 1.3、创建WebSocket服务器:
        • 2、客户端
        • 3、运行结果
          • 3.1、服务端输出:
          • 3.2、客户端输出:
    • 总结

WebSocket的出现,使得浏览器具备了实时双向通信的能力。且它不在需要进行3次握手与4次挥手,只需要在客户端创建一个socket实例并且提供它所要连接服务端的IP地址和端口,而服务端创建另一个socket并绑定本地端口进行监听,然后客户端进行连接服务端,服务端接受连接之后双方建立了一个端对端的TCP连接,在该连接上就实现双向通讯了。本文由浅入深,介绍了WebSocket如何建立连接、交换数据的细节,以及数据帧的格式。此外,还简要介绍了针对WebSocket的安全攻击,以及协议是如何抵御类似攻击的。

WebSocket的特点

1、工作原理

浏览器发出webSocket的连线请求,服务器发出响应,这个过程称为握手,握手的过程只需要一次,就可以实现持久连接。

WebSocket 的工作原理如下:

  • 客户端向服务器发送一个 HTTP 请求,请求建立 WebSocket 连接。
  • 服务器收到请求后,会返回一个 HTTP 响应,响应中包含一个 101 Switching Protocols 状态码,表示同意建立 WebSocket 连接。
  • 服务器和客户端通过 TCP 连接进行通信,数据格式为 JSON、二进制或文本。

在这里插入图片描述

2、特点

WebSocket是真正的全双工通信机制,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。 HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,消息交换效率低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现,当然在现在这个时代,我们的主流浏览器都是支持HTML5的,使用时我们直接使用即可。

  • 实时性:服务器可以主动向客户端发送消息,实现实时通信。
  • 双向通信:客户端和服务器之间可以同时发送和接收数据。
  • 性能:WebSocket 连接建立后,数据传输效率更高,减少了 HTTP 请求的次数。
  • 兼容性:WebSocket 协议在大多数浏览器中得到了支持,无需额外插件。
3、WebSocket 协议介绍
  • WebSocket 协议的底层协议也是TCP协议
  • WebSocket 协议的标识符为ws,加密后为wss
  • WebSocket 协议没有同源限制,即WebSocket 协议可以跨域通信
  • WebSocket 协议是有状态的,是前后端交互的长连接,即建立连接后可以保持连接状态,通信时可以省略部分状态信息
  • WebSocket 协议可以发送文本,同时也可以发送二进制数据
4、安全性

WebSocket 协议本身是安全的,但你需要确保 WebSocket 连接是通过 HTTPS 协议建立的,以防止中间人攻击。在 Node.js 中,你可以使用 wss 模块来创建一个安全的 WebSocket 服务器。

WebSocket的使用

一、服务端

1、创建实例:创建一个webScoket实例对象
 //创建一个WebSocket服务器,在3000端口启动
 const WebSocket = require('ws')
 const server = new WebSocket.Server({port:3000})
1.1、WebSocket.Server(options[,callback])方法中options对象所支持的参数
  • (1)host:绑定服务器的主机名
  • (2)port:绑定服务器的端口号
  • (3)backlog:挂起连接队列的最大长度
  • (4)server:预先创建的node.js http/s服务器
  • (5)verifyClient:可用于验证传入连接的函数
  • (6)handleProtocols:可用于处理WebSocket子协议的函数
  • (7)path:仅接受与此路径匹配的连接
  • (8)noServer:不启用服务器模式
  • (9)clientTracking:指定是否跟踪客户端
  • (10)perMessageDeflate:启用/禁用消息压缩
  • (11)maxPayload:允许的最大消息大小(以字节为单位)
1.2、同样也有一个加密的 wss:// 协议。类似于 WebSocket 中的 HTTPS。
  • wss:// 协议不仅是被加密的,而且更可靠。

  • 因为 ws:// 数据不是加密的,对于任何中间人来说其数据都是可见的。并且,旧的代理服务器不了解 WebSocket,它们可能会因为看到“奇怪的” header 而中止连接。

  • 另一方面,wss:// 是基于 TLS 的 WebSocket,类似于 HTTPS 是基于 TLS 的 HTTP),传输安全层在发送方对数据进行了加密,在接收方进行解密。因此,数据包是通过代理加密传输的。它们看不到传输的里面的内容,且会让这些数据通过。

2、监听连接:ws通过connection事件来监听连接

只要有WebSocket连接到该服务器,就会触发’connection’事件;req对象可以用来获取客户端的信息,如ip、端口号

// 监听连接事件
server.on('connection',function connection(ws,req){
     const ip = req.socket.remoteAddress
     const port = req.socket.remotePort
     const clientName = ip + port
     console.log('%s is connected ',clientName)
 })

3、发送数据:ws通过send()方法来发送数据
 server.on('connection',function connection(ws,req){
     const ip = req.socket.remoteAddress
     const port = req.socket.remotePort
     const clientName = ip + port
     
     // 发送消息到客户端
     ws.send('Welcome ' + clientName)
 })

send(data [,options][,callback])

data:发送的数据
options对象:

  • (1)compress:指定数据是否需要压缩。默认为true
  • (2)binary:指定数据是否通过二进制传送。默认是自动检测
  • (3)mask:指定是否应遮罩数据。
  • (4)fin:指定数据是否为消息的最后一个片段。默认为true
4、接收数据:ws通过message事件来接收数据

当客户端有消息发送给服务器时,服务器就能够触发该消息

server.on('connection',function connection(ws){

    // 监听接收消息事件
     ws.on('message',function incoming(message){
         console.log('received: %s from %s',message,clientName)
         server.clients.forEach(function each(client){
             if(client.readyState === WebSocket.OPEN){
                 client.send(clientName +" -> " + message)
             }
         })
     })
 })

5、关闭WebSocket服务器:通过监听close事件关闭服务器
server.on('close',function close(){
 console.log('disconnected')
})

二、客户端

创建了一个webScoket实例对象常用属性和方法的介绍

属性说明
url当前连接的webScoket接口地址
readyState当前连接的状态: 0:正在链接中 1:已经链接并且可以通讯 2:连接正在关闭 3;连接已关闭或者没有链接成功
onopen连接成功的回调函数
onerror连接失败的回调函数
onmessage从服务端接受到信息的回调函数
onclose连接关闭的回调函数
binaryType使用二进制的数据类型连接
protocol服务器选择的下属协议
bufferedAmount未发送至服务器的二进制字节数
close()关闭当前连接
send(data)发送消息到服务器
1、客户端实现WebScoket连接
// 创建 WebSocket 连接
const ws = new WebSocket('ws://localhost:3000')

// 连接打开时触发
ws.onopen = function () {
  console.log('我们连接成功啦...')
  
  // 发送消息到服务器
  webSocket.send('Hello!')
}

// 连接出错时触发
ws.onerror = function () {
  console.log('连接失败了...')
}

// 接收到服务器消息时触发
ws.onmessage = function (e) {
  console.log('服务端传来数据啦...' + e.data)
}

// 连接关闭时触发
ws.onclose = function () {
  console.log('连接关闭了...')
}
2、WebScoket的重连机制

当我们正在使用WebScoket的时候,难免会出现WebScoket的断联,这个时候,我们只需要在onclose的回调函数中,重新链接即可

ws.onclose = function (e) {
   // 1每10秒重连一次,直到连接成功
    setTimeout(function () {
   // 重新调用连接webSocket事件
     ws = new WebSocket('ws://192.168.31.19:8081/')
 	 ws.onopen = function () {
     console.log('连接成功...')
  			} 
         }, 10000);
        };
3、WebScoket的心跳保活

websocket长连接有默认的超时时间(1分钟),也就是说,超过一定的时间客户端和服务器之间没有发生任何消息传输,连接会自动断开;除此之外,服务器或防火墙一般也会在一段时间不活动并超时之后终止外部的长连接。因此,若需要使客户端一直保持连接,就需要设置心跳保活机制了。

实现原理:我们可以每次在 每次保持心跳保活的时候,向WebScoket发送一条消息,证明我们还"活着"

var timeout = 1000 * 30 //心跳间隔  
var timeoutTimer=null //保持心跳的定时器
  timeoutTimer = setTimeout(function () {
    ws.send('HeartBeat')
  }, timeout)
4、客户端主动断开连接
// 客户端主动断开连接
ws = new WebSocket('ws://192.168.31.19:8081/')
ws.close();
5、WebScoket添加token的几种方法
5.1、使用send发送参数
var  ws = new WebSocket("ws://" + url );
ws.onopen=function(){
    ws.send(token)
}
5.2、请求地址中携带参数
var  ws = new WebSocket("wss://" + url?token );
5.3、基于协议头

websocket请求头中可以包含Sec-WebSocket-Protocol这个属性,该属性是一个自定义的子协议。它从客户端发送到服务器并返回从服务器到客户端确认子协议。我们可以利用这个属性添加token。

var  ws = new WebSocket("ws://" + url,[token]);

三、入门例子

例子包括了WebSocket服务端、WebSocket客户端。

1、服务端

Node使用ws创建WebSocket服务器

1.1、ws模块:

是一个用于支持WebSocket客户端和服务器的框架。它易于使用,功能强大,且不依赖于其他环境

1.2、安装ws:
npm install ws
1.3、创建WebSocket服务器:

启动3000端口。当有新的连接请求到达时,打印日志,然后延迟两次向客户端发送消息。当收到到来自客户端的消息时,同样打印日志。

server.js

var WebSocket = require('ws');

var wss = new WebSocket.Server({
    port: 3000
});

// 创建一个TextDecoder实例来处理字符串
const decoder = new TextDecoder('utf-8');

wss.on('connection', function connection(ws) {
    console.log('server: receive connection.');

    ws.on('message', function incoming(message) {
        console.log('server: received', decoder.decode(message));
    });
    let data1 = {
        name: 'zhangsan',
        age: 18
    }
    let data2 = {
        name: 'lisi',
        age: 19
    }
    let data3 = 'wangwu'
    sendData(ws, data1, 1000 * 60 * 1)
    sendData(ws, data2, 1000 * 60 * 2)
    sendData(ws, data3, 1000 * 60 * 3)
});

const sendData = (ws, data = '', delay = 1000) => {
    if (!data) return
    if (typeof data === 'object') data = JSON.stringify(data)
    setTimeout(() => {
        ws.send(data);
    }, delay)
}

2、客户端

向3000端口发起WebSocket连接。连接建立后,打印日志,同时向服务端发送消息。接收到来自服务端的消息后,同样打印日志。

app.vue

const ws = new WebSocket('ws://localhost:3000');
ws.onopen = function () {
    console.log('我们连接成功了');
    ws.send('hello');
};
ws.onmessage = function (e) {
    console.log('服务端传来数据了:',e.data);
};
ws.onclose = function () {
    console.log('连接关闭了');
};
ws.onerror = function (err) {
    console.log('连接失败了', err);
};
3、运行结果

可分别查看服务端、客户端的日志,这里不展开。

3.1、服务端输出:
server: receive connection.
server: received hello
3.2、客户端输出:
我们连接成功了
服务端传来数据了:{"name":"zhangsan","age":18}
服务端传来数据了:{"name":"lisi","age":19}

总结

WebSocket 是一种强大的网络通信协议,它允许服务器和客户端之间进行实时、双向通信。在 WebSocket 连接中,服务器可以主动向客户端发送消息,这对于实时应用来说非常重要。通过使用 JavaScript 和后端语言,你可以轻松实现 WebSocket 通信。在实际应用中,WebSocket 已被广泛应用于在线聊天、股票交易、游戏等领域。

WebSocket 是一种在浏览器和服务器之间建立持久连接的现代方式。

  • WebSocket 没有跨源限制
  • 浏览器对 WebSocket 支持很好
  • 可以发送/接收字符串和二进制数据

WebSocket 方法:

  • socket.send(data)
  • socket.close([code], [reason])

WebSocket 事件:

  • open
  • message
  • error
  • close

WebSocket 自身并不包含重新连接(reconnection),身份验证(authentication)和很多其他高级机制。因此,有针对于此的客户端/服务端的库,并且也可以手动实现这些功能。

有时为了将 WebSocket 集成到现有项目中,人们将主 HTTP 服务器与 WebSocket 服务器并行运行,并且它们之间共享同一个数据库。对于 WebSocket 请求使用一个通向 WebSocket 服务器的子域 wss://ws.site.com,而 https://site.com 则通向主 HTTP 服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/609594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024第九届数维杯数学建模论文模板(内附LaTeX+Word)

一年一度的2024年第九届数维杯国赛报名进行中!相信很多同学们已经摩拳擦掌蓄势待发了! 经历三天比赛,最后提交的论文就是最终答卷,那么一篇数模论文,包括哪些内容呢? 一篇完整的数模论文,包括…

【初阶数据结构】单链表经典OJ题

目录标题 原题展现题目解析代码展现1.创建新节点2.拷贝random指针3.将新节点尾插 原题展现 该题是力扣上的第138题,题目链接如下:随机链表的复制。 题目解析 我们发现这个链表和一般的链表存在着一点点区别,那就是每个节点多了一个random指…

遥控挖掘机之ESP8266调试心得(1)

ESP8266调试心得 1. 前言2.遇到的问题2.1 ESP8266模块建立TCP连接时候报错2.2 指令异常问题 3. 更新ESP8266固件3. ESP8266的部分AT指令3. 连接步骤3.1 模块与电脑连接3.2.1 电脑上的设置3.2.2 ESP8266模块作为客户机(TCP Cilent)的设置步骤 3.2 模块与模…

Python深度学习基于Tensorflow(3)Tensorflow 构建模型

文章目录 数据导入和数据可视化数据集制作以及预处理模型结构低阶 API 构建模型中阶 API 构建模型高阶 API 构建模型保存和导入模型 这里以实际项目CIFAR-10为例,分别使用低阶,中阶,高阶 API 搭建模型。 这里以CIFAR-10为数据集,C…

SparkStructuredStreaming状态编程

spark官网关于spark有状态编程介绍比较少,本文是一篇个人理解关于spark状态编程。 官网关于状态编程代码例子: spark/examples/src/main/scala/org/apache/spark/examples/sql/streaming/StructuredComplexSessionization.scala at v3.5.0 apache/spark (github…

智能评估时代:SurveyKing开源问卷系统YYDS

最近有同事在设计问卷系统,我碰巧在 GitHub 上发现了一个开源的问卷/考试系统,觉得它非常不错,给他推荐了下。今天我打算和家人们分享一下这个发现。 项目介绍 官方网站:https://surveyking.cn/ github地址:https://…

springboot整合websocket,超简单入门

springBoot整合webSocket,超简单入门 webSocket简洁 WebSocket 是一种基于 TCP 协议的全双工通信协议,它允许客户端和服务器之间建立持久的、双向的通信连接。相比传统的 HTTP 请求 - 响应模式,WebSocket 提供了实时、低延迟的数据传输能力。…

数据库(MySQL)基础:约束

一、概述 1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 2.目的:保证数据库中数据的正确、有效性和完整性。 3.分类 约束描述关键字非空约束限制该字段的数据不能为nullnot null唯一约束保证该字段的所有数据都是唯一…

QX---mini51单片机学习---(6)独立键盘

目录 1键盘简绍 2按键的工作原理 3键盘类型 4独立键盘与矩阵键盘的特点 5本节相关原理图 6按键特性 7实践 1键盘简绍 2按键的工作原理 内部使用轻触按键,常态按下按键触点才闭合 3键盘类型 编码键盘与非编码键盘 4独立键盘与矩阵键盘的特点 5本节相关原理…

硬性清空缓存的方法

前端发布代码后,我们是需要刷新页面再验证的。有时候仅仅f5 或者ctrlshiftdelete快捷键仍然有历史缓存,这时可以通过下面的方法硬性清空缓存。 以谷歌浏览器为例,打开f12,右键点击刷新按钮,选择【清空缓存并硬性加载】…

计算机网络5——运输层2TCP原理

文章目录 一、传输控制协议 TCP 概述1、TCP最主要的特点2、TCP的连接 二、可靠传输的工作原理1、停止等待协议1)无差错情况2)出现差错3)确认丢失和确认迟到4)信道利用率 2、连续 ARQ协议 三、TCP 报文段的首部格式 一、传输控制协…

代码审计-PHP模型开发篇动态调试反序列化变量覆盖TP框架原生POP链

知识点 1、PHP审计-动态调试-变量覆盖 2、PHP审计-动态调试-原生反序列化 3、PHP审计-动态调试-框架反序列化PHP常见漏洞关键字 SQL注入: select insert update delete mysql_query mysqli等 文件上传: $_FILES,type"file"&…

Kafka 执行命令超时异常: Timed out waiting for a node assignment

Kafka 执行命令超时异常: Timed out waiting for a node assignment 问题描述: 搭建了一个kafka集群环境,在使用命令行查看已有topic时,报错如下: [rootlocalhost bin]# kafka-topics.sh --list --bootstrap-server…

Vue自定义封装音频播放组件(带拖拽进度条)

Vue自定义封装音频播放组件(带拖拽进度条) 描述 该款自定义组件可作为音频、视频播放的进度条,用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。 实现效果 具体效果可以根据自定义内容进行位置调整 项目需求 有播放暂停…

51单片机软件环境安装

keli5的安装 把CID放到破解程序中 破解程序会给一串数字然后填到那个框中 驱动程序的安装 安装完了以后 设备管理器会出现这个 同时c盘会出现这个文件夹

巨量千川的投放技巧,一站式全自动千川投流工具(抖音玩家必备)

随着抖音平台的快速发展,越来越多的品牌和广告商意识到抖音的潜力,并希望能够通过投放广告来获取更多的曝光和用户参与。在这个过程中,巨量千川成为了抖音玩家必备的一站式全自动千川投流工具,为广告商提供了投放技巧,…

word-快速入门

1、熟悉word界面 2、word排版习惯 3、排版文本基本格式 1、word界面 选项卡 功能组 点击功能组右下角小三角可以开启完整功能组,获得启动器 软件右上角有功能显示折叠按钮 2、排版好习惯 (1)随时保存 (2)规范文件命…

408算法题专项-2015

题目: 分析:时间复杂度尽可能高效,提示可能存在一种空间换时间的算法 思路一:空间换时间 思考:开数组储存结点数据域,对于只出现一次或多次出现第一次的,保留,对于多次出现的&…

流程详解!2024年成都市发明专利申请流程及各阶段操作要点

一、受理阶段 时间期限: 电子申请2天内,纸质申请当天现场提交,邮寄约为半月。 申请人: 1. 委托专利代理机构,签订委托代理协议和保密协议等; 2. 提供原始技术资料和个人以及单位信息等; 3…

片冰机工作原理

片冰机工作原理 1、制冰用的水需要加盐(行话叫做加药)至于多少量。看制冰量多少调制泵(柱塞泵)自动调整。 2、制冰机主体分两腔体外腔体内盘的一定密度的铜管。专业术语叫(蒸发腔)就是俗话讲的制冷的东西。 3、外腔体内是一个很规则的圆不锈钢腔体,中心有一三叶刮…