实时通信WebSocket的原理和工作过程

 更新时间:2023年12月02日 16:08:28   投稿:yin  
WebSocket持久连接使得服务器可以主动向客户端推送数据,而不需要等待客户端的请求,是一种专门设计用于实现持久连接的协议,WebSocket的持久连接特性使其成为实时性要求高的应用的理想选择,如在线聊天、实时游戏、数据监控等

WebSocket 是一种用于实现持久连接的通信协议,用于在客户端和服务端之间进行双向数据传输。但它跟 HTTP 没什么关系,它是一种基于 TCP 的一种独立实现。

以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较高。另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一直不挂电话,也就是说,客户端发起连接后,如果没消息,就一直不返回 Response 给客户端,连接阶段一直是阻塞的。

而 WebSocket 解决了 HTTP 的这几个难题。首先,当服务器完成协议升级后( HTTP -> WebSocket ),服务端可以主动推送信息给客户端,解决了轮询造成的同步延迟问题。由于 WebSocket 只需要一次 HTTP 握手,服务端就能一直与客户端保持通讯,直到关闭连接,这样就解决了服务器需要反复解析 HTTP 协议,减少了资源的开销。

WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。用于此的安全模型是Web浏览器常用的基于原始的安全模式。 协议包括一个开放的握手以及随后的TCP层上的消息帧。 该技术的目标是为基于浏览器的、需要和服务器进行双向通信的(服务器不能依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或和长轮询))应用程序提供一种通信机制。

WebSocket 的原理

在理解 WebSocket 的工作原理之前,我们首先要了解 HTTP 协议的短连接性质。在传统的 HTTP 通信中,客户端发送一个请求到服务器,服务器响应后就关闭连接,这导致了每个请求都需要建立和关闭连接,而这些连接的建立和关闭会消耗网络资源和时间。

WebSocket 的原理是在 HTTP 协议上建立一种全双工的通信方式,使得客户端和服务器之间可以建立一次连接,然后保持这个连接的开放状态,而不需要在每次通信后关闭连接。这种持久连接使得服务器可以主动向客户端推送数据,而不需要等待客户端的请求。

WebSocket 的工作过程

下面是 WebSocket 的工作过程,包括握手阶段和通信阶段:

握手阶段:

a. 客户端发起一个 HTTP 请求,请求升级到 WebSocket 协议。这个请求包含了一些特殊的头信息,表明客户端希望建立 WebSocket 连接。

b. 服务器收到这个请求后,会进行升级协议的操作,如果支持 WebSocket,它将回复一个 HTTP 101 状态码,表示成功升级到 WebSocket 协议。

c. 一旦协议升级完成,客户端和服务器之间的连接就变成了全双工,保持开放状态,可以双向通信。

通信阶段:

a. 客户端和服务器可以互相发送消息,这些消息都是以帧(frames)的形式进行传输,而不是传统的 HTTP 请求和响应。

b. 服务器可以主动向客户端推送消息,而客户端也可以主动向服务器发送消息。这种双向通信在实时性要求高的应用中非常有用,比如在线聊天、股票市场数据推送等。

关闭连接:

a. 当双方中的一方决定关闭连接时,它会发送一个关闭帧,通知另一方关闭连接。

b. 另一方收到关闭帧后,也会回复一个关闭帧,然后双方都关闭连接。

为什么 WebSocket 可以实现持久连接?

WebSocket 可以实现持久连接的原因有以下几点:

协议支持:WebSocket 是一种专门设计用于实现持久连接的协议,与传统的 HTTP 不同。HTTP 是一种请求-响应协议,每次请求后都会关闭连接。WebSocket 则建立在一次握手之后,保持连接开放状态,允许双向通信。

资源节约:传统的 HTTP 建立和关闭连接会消耗网络资源和时间。WebSocket 的持久连接避免了这种开销,因此更适用于实时通信的场景。

实时性:在某些应用中,特别是需要实时性的应用,WebSocket 的持久连接允许服务器主动向客户端推送数据,而不需要等待客户端的请求。这对于在线聊天、实时游戏、股票市场数据等应用非常重要。

Node.js创建WebSocket 的示例

下面是一个简单的 WebSocket 示例,使用 Node.js 来创建一个 WebSocket 服务器和一个 WebSocket 客户端:

WebSocket 服务器示例(Node.js):

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  console.log('Client connected');

  ws.on('message', (message) => {
    console.log(`Received: ${message}`);
    ws.send(`You sent: ${message}`);
  });

  ws.on('close', () => {
    console.log('Client disconnected');
  });
});

WebSocket 客户端示例(Node.js):

const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', () => {
  console.log('Connected to server');
  ws.send('Hello, server!');
});

ws.on('message', (message) => {
  console.log(`Received from server: ${message}`);
});

ws.on('close', () => {
  console.log('Disconnected from server');
});

在这个示例中,服务器和客户端都使用了 Node.js 的 ws 模块来创建 WebSocket 连接。服务器监听在端口 8080 上,当客户端连接时,会在服务器端和客户端之间建立双向通信。服务器接收来自客户端的消息,然后将消息返回给客户端。

这个示例展示了 WebSocket 的简单用法,但它可以用作更复杂的实时通信应用的基础。WebSocket 的持久连接特性使其成为实时性要求高的应用的理想选择,如在线聊天、实时游戏、数据监控等。

到此这篇关于实时通信WebSocket的原理和工作过程的文章就介绍到这了,更多相关WebSocket的原理和工作过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nodejs和npm版本不匹配:ERROR: npm v9.5.1 is known not to run on Node.js

    nodejs和npm版本不匹配:ERROR: npm v9.5.1 is known not to run

    本文主要介绍了nodejs和npm版本不匹配:ERROR: npm v9.5.1 is known not to run on Node.js,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • node.js如何根据URL返回指定的图片详解

    node.js如何根据URL返回指定的图片详解

    这篇文章主要介绍了NODE.JS如何根据URL返回指定的图片详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • nodejs与浏览器中全局对象区别点总结

    nodejs与浏览器中全局对象区别点总结

    在本篇文章里小编给大家整理的是一篇关于nodejs与浏览器中全局对象区别点总结内容,对此有需要的朋友们可以学习下。
    2021-12-12
  • 学习 NodeJS 第八天:Socket 通讯实例

    学习 NodeJS 第八天:Socket 通讯实例

    本篇文章主要介绍了学习 NodeJS 第八天:Socket 通讯实例,非常具有实用价值,需要的朋友可以参考下。
    2016-12-12
  • 基于nodejs的雪碧图制作工具的示例代码

    基于nodejs的雪碧图制作工具的示例代码

    雪碧图就是把很多小图标合并为一张图片,这篇文章主要介绍了基于nodejs的雪碧图制作工具的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Node.JS文件系统解析实例详解

    Node.JS文件系统解析实例详解

    这篇文章主要介绍了Node.JS文件系统解析实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • node搭建后台的实现步骤

    node搭建后台的实现步骤

    本文介绍了使用Node.js搭建后台的实现步骤,文章详细阐述了每个步骤的实现过程,并给出了示例代码,对于想要了解如何使用Node.js搭建后台的读者具有一定的参考价值
    2023-08-08
  • 如何使用npm安装yarn详解

    如何使用npm安装yarn详解

    Yarn是一个新的快速安全可信赖的可以替代NPM的依赖管理工具,下面这篇文章主要给大家介绍了关于如何使用npm安装yarn的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • nodejs实现解析xml字符串为对象的方法示例

    nodejs实现解析xml字符串为对象的方法示例

    这篇文章主要介绍了nodejs实现解析xml字符串为对象的方法,涉及nodejs针对xml格式字符串的解析与转换相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • express启用https使用小记

    express启用https使用小记

    这篇文章主要介绍了express启用https使用小记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论