Nodejs—创建简易WebSocket通信过程详解

文章目录

    • 安装Nodejs
      • Windows 安装
      • Linux 源码安装
    • WebSocket简介
      • WebSocket 与 AJAX 轮询的区别
      • WebSocket的属性
      • 核心事件处理器
    • WebSocket使用示例
      • 设置 Node.js WebSocket 服务器
      • 创建客户端 HTML 页面
      • 运行 WebSocket 服务器和客户端

安装Nodejs

Windows 安装

下载地址: nodejs-release-v12.17.0安装包下载_开源镜像站-阿里云 (aliyun.com)

选择x64 或者x64,下载之后,打开安装包,根据提示下一步即可

在这里插入图片描述

安装成功之后打开命令行工具 输入 node -v

提示输出版本号便是安装成功

Linux 源码安装

根据自己的系统版本下载不同的源码,这里以Ubuntu20.04 arm64版本为例

这里下载的是node-v12.17.0-linux-arm64.tar.gz

解压到指定的目录 ,打开之后的目录结构如下

在这里插入图片描述

进入bin 文件夹,打开命令行终端,将npm 和 nodejs 创建软链接 即可

sudo ln -s xxxxx/node /usr/bin/node
sudo ln -s xxxxx/npm /usr/bin/npm

终端输入npm ,显示相关信息代表配置环境成功

在这里插入图片描述

WebSocket简介

​ WebSocket 是一种在单个持久连接上提供全双工通信通道的网络技术。它允许服务器和客户端之间的信息可以随时被发送,这使得它特别适用于需要实时数据交换的应用,比如在线游戏、实时交易平台、协作工具等。WebSocket 协议在2011年被标准化为 HTML5 的一部分,现在被大多数现代浏览器支持。

一些网站确实仍然使用 AJAX 来实现数据推送,这是最基本的数据推送形式,客户端定时发送 AJAX 请求到服务器,查询是否有新数据。这种方式的实现简单,但效率低且可能造成服务器资源的浪费,因为很多请求可能返回空数据。

WebSocket 与 AJAX 轮询的区别

1. 连接方式:

  • WebSocket:创建一个持久的连接,这个连接会保持打开状态,直到客户端或服务器决定关闭。在这个连接上,数据可以从任一端到另一端单向传输,也可以是双向传输。
  • AJAX 轮询:客户端定期发送 HTTP 请求到服务器,询问是否有新数据可用。每次请求都需要重新建立连接和拆解连接,这在 HTTP/1.1 中尤其消耗资源(HTTP/2 提供了一些改进)。

2. 实时性:

  • WebSocket:提供真正的实时功能,因为连接是持续的,数据可以随时被任一端发送。
  • AJAX 轮询:存在延迟,因为请求是周期性的;实时数据的传输延迟受到轮询频率的限制。

3. 资源消耗和网络流量:

  • WebSocket:由于是建立持久连接,初始握手后不需要再进行连接建立,减少了开销和网络流量。
  • AJAX 轮询:每次请求都需要发送 HTTP 头部和其他信息,这在频繁请求时会导致显著的网络流量和处理时间增加。

4. 复杂性:

  • WebSocket:实现相对复杂,需要服务器和客户端都支持 WebSocket 协议。但一旦建立,之后的数据交换非常高效。
  • AJAX 轮询:实现简单,基于标准的 HTTP 协议,不需要特殊的服务器支持,适用于不支持 WebSocket 的环境。

5. 可伸缩性:

  • WebSocket:虽然单个 WebSocket 连接的资源消耗比较小,但如果服务器需要同时处理大量的连接,仍然可能会面临资源限制问题。
  • AJAX 轮询:可伸缩性较差,因为服务器必须处理大量短暂的连接,且连接频繁建立和断开会消耗更多资源。

在这里插入图片描述

使用js 创建webSocket对象十分简单

var ws = new WebSocket('wss://example.com/socket', 'protocol-one');

首先传入URL,第二个参数可选,指定了连接的子协议

WebSocket的属性

WebSocket.readyState

  • 类型:unsigned short
  • 这个属性返回 WebSocket 连接的当前状态,可能的值包括:
    • WebSocket.CONNECTING (0):连接尚未建立。
    • WebSocket.OPEN (1):连接已建立,可以进行通信。
    • WebSocket.CLOSING (2):连接正在进行关闭。
    • WebSocket.CLOSED (3):连接已关闭或无法打开。

WebSocket.bufferedAmount

  • 类型:unsigned long
  • 返回还未发送至网络的 UTF-8 文本字节数。这个值在消息队列空的时候会重置为0。如果连接关闭,这个值将不会再更新。

WebSocket.url

  • 类型:DOMString
  • WebSocket 对象的绝对路径。这个 URL 在构造函数中指定,并且会在连接过程中不可变。

核心事件处理器

WebSocket 也提供了几个事件处理器属性,允许开发者指定函数来处理特定的事件:

  1. onopen
    • 事件处理器,当 WebSocket 连接成功时触发。
  2. onmessage
    • 事件处理器,当接收到消息时触发。事件对象为 MessageEvent,包含 data 属性,表示接收到的数据。
  3. onclose
    • 事件处理器,当 WebSocket 连接关闭时触发。事件对象为 CloseEvent,包含有关关闭的信息,如代码和原因。
  4. onerror
    • 事件处理器,当 WebSocket 遇到错误,无法继续通信时触发。

WebSocket使用示例

设置 Node.js WebSocket 服务器

首先,确保你已安装 Node.js。接着,创建一个新的项目文件夹,并初始化一个 Node.js 项目:

mkdir websocket-demo
cd websocket-demo
npm init -y

然后,安装 ws 库:

npm install ws

创建一个名为 server.js 的文件,并添加以下代码来启动一个 WebSocket 服务器:

const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function connection(ws) {console.log('A new client Connected!');ws.send('Welcome New Client!');ws.on('message', function incoming(message) {console.log('received: %s', message);// Echo the message back to the clientws.send(`Server received: ${message}`);});ws.on('close', function() {console.log('The client has disconnected.');});ws.on('error', function(error) {console.error('WebSocket error:', error);});
});console.log('WebSocket server is running on ws://localhost:8080');

这段代码创建了一个运行在 8080 端口的 WebSocket 服务器。服务器监听连接事件,并对每个新客户端发送欢迎消息。同时,它也监听消息事件,将接收到的消息回显给客户端。

创建客户端 HTML 页面

在项目目录中,创建一个名为 index.html 的文件,并添加以下 HTML 和 JavaScript 代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Client</title>
<script>
document.addEventListener('DOMContentLoaded', function() {var ws = new WebSocket('ws://localhost:8080');ws.onopen = function() {console.log('Connected to the server');ws.send('我是客户端,Server!');};ws.onmessage = function(event) {console.log('来自服务器的消息 ', event.data);};ws.onclose = function() {console.log('服务器断开连接');};ws.onerror = function(error) {console.error('WebSocket error:', error);};
});
</script>
</head>
<body><h1>WebSocket 客户端</h1><p>F12 开发者选项,打开控制台,查看通信过程.</p>
</body>
</html>

这个 HTML 页面将连接到你的 WebSocket 服务器,并在打开连接后发送一个消息。服务器的响应将显示在浏览器的控制台中。

运行 WebSocket 服务器和客户端

首先,在命令行中运行服务器:

node server.js

然后,打开 index.html 文件在浏览器中,这里使用的Vscode编写 插件使用的是live server

按下F12查看控制台,可以看到简单的通信过程

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发现FionaAI:免费体验最新的GPT-4o Mini模型!

你现在可以在FionaAI上免费体验OpenAI刚刚发布的GPT-4o Mini模型&#xff01;作为您在Google Chrome中的ChatGPT驱动助手&#xff0c;FionaAI可以随时随地与您对话&#xff0c;帮助您轻松创作和处理文本。 为什么选择GPT-4o Mini&#xff1f; 最新技术&#xff1a;GPT-4o Mini是…

8个特征工程技巧提升机器学习预测准确性

引言 对于机器学习从业者来说&#xff0c;掌握各种特征工程技巧是非常有帮助的。毕竟&#xff0c;特征是影响机器学习和深度学习模型实时表现的关键因素。在机器学习领域&#xff0c;提升模型预测准确性的关键之一是选择合适的特征&#xff0c;并剔除那些对模型性能影响不大的特…

git修改提交姓名

git config --global user.name “新用户名” git config --global user.email “新邮箱地址” 修改提交的用户名 git config --global user.name “yu***”

Vue 多选下拉框+下拉框列表中增加标签

1、效果图 2、代码部分 &#xff08;1&#xff09;代码 <el-select class"common-dialog-multiple multipleSelectStyle" change"clusterListChange" v-model"form.clusterId" placeholder"请先选择" multiple filterable defaul…

【C++】STL-map的使用

目录 1、map的简述 2、map的使用 2.1 insert 2.2 operator*、operator-> 2.3 operator[] 3、multimap 1、map的简述 map与set一样是关联式容器 map就相当于二叉搜索树中的KV模型&#xff0c;底层是使用红黑树实现的&#xff0c;仿函数默认是less&#xff0c;即比根小…

在 PostgreSQL 中如何实现数据的加密存储?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 中如何实现数据的加密存储&#xff1f;一、为什么要进行数据加密存储&#xff1f;二、P…

如何证明员工有泄密行为,哪款软件可以提供这样的帮助?

如果员工泄密&#xff0c;如何证明员工有泄密行为&#xff1f; 证明员工有泄密行为通常需要以下几个步骤&#xff1a; 监控与记录&#xff1a;通过DLP&#xff08;数据防泄漏&#xff09;系统实时监控员工的行为&#xff0c;包括文件操作、数据传输、邮件发送等。分析行为&am…

RESTful API设计指南:构建高效、可扩展和易用的API

文章目录 引言一、RESTful API概述1.1 什么是RESTful API1.2 RESTful API的重要性 二、RESTful API的基本原则2.1 资源导向设计2.2 HTTP方法的正确使用 三、URL设计3.1 使用名词而非动词3.2 使用复数形式表示资源集合 四、请求和响应设计4.1 HTTP状态码4.2 响应格式4.2.1 响应实…

Linux中进程的控制

一、进程的创建 1、知识储备 进程的创建要调用系统接口&#xff0c;头文件 #include<unistd.h> 函数fork() 由于之前的铺垫我们现在可以更新一个概念 进程 内核数据结构&#xff08;task_struct, mm_struct, 页表....&#xff09; 代码 数据 所以如何理解进程的独…

C++进阶 之 【C++11】部分简单语法详细讲解(带你先入门学习C++11)

目录 一、C11简介 二、列表初始化 1.{} 初始化 2.std::initializer_list 三、变量类型推导 1.auto 2.decltype 3.nullptr 四、新增加容器---静态数组array、forward_list以及unordered系列 1.静态数组 array 2.单链表 forward_list 3.unordered_map 4.unordered_s…

前端面试题(JS篇七)

一、SQL 注入攻击&#xff1f; SQL 注入攻击指的是攻击者在 HTTP 请求中注入恶意的 SQL 代码&#xff0c;服务器使用参数构建数据库 SQL 命令时&#xff0c;恶意 SQL 被一起构 造&#xff0c;破坏原有 SQL 结构&#xff0c;并在数据库中执行&#xff0c;达到编写程序时意料之外…

shell详细介绍(清晰明了)

一、shell的介绍 Shell ⼀个命令解释器&#xff0c;它接收应⽤程序/⽤户命令&#xff0c;然后调⽤操作系统内核。 Shell还是⼀个功能强⼤的编程语⾔&#xff0c;易编写、易调试、灵活性强。 (1) Linux提供的shell解释器有 (2) bash 和 sh的关系 (3) Centos默认的Shell解析器…

2850. 将石头分散到网格图的最少移动次数 Medium

给你一个大小为 3 * 3 &#xff0c;下标从 0 开始的二维整数矩阵 grid &#xff0c;分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头&#xff0c;一个格子里可能会有 多个 石头。 每一次操作中&#xff0c;你可以将一个石头从它当前所在格子移动到一个至少有一条…

C++ | Leetcode C++题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size(), n matrix[0].size();int x 0, y n - 1;while (x < m && y > 0) {if (matrix[x][y] targ…

nodejs安装+踩坑报错解决

下载Node.js安装包 官网下载地址&#xff1a;http://nodejs.cn/download/&#xff0c;根据自己电脑选择32位还是64位&#xff0c; 下载地址 选择合适的版本下载 X86是32位的&#xff0c;X64是64位的&#xff0c;我们一般是下载win版X64的msi文件的是点击可以直接启动安装程序的…

Vue 对接海康威视,实现摄像头画面展示

文章目录 需求分析1. 下载2. 安装3. new 一个WebControl 插件相关实例 需求 项目中集成海康威视&#xff0c;实现摄像头画面展示 分析 1. 下载 传送门&#xff1a;官方插件包和文档下载 2. 安装 &#xff08;1&#xff09;下载完成后打开 &#xff08;2&#xff09;在项…

30_Swin-Transformer网络结构详解

1.1 简介 Swin Transformer 是一种用于计算机视觉任务的新型深度学习架构&#xff0c;由微软亚洲研究院于2021年提出。它结合了Transformer模型在序列数据处理上的强大能力与卷积神经网络&#xff08;CNN&#xff09;在图像识别中的高效局部特征提取优势&#xff0c;特别适用于…

《数据结构》预备

在学习数据结构之前&#xff0c;需要预先准备学习的C语言知识是&#xff1a;自定义类型--结构体类型。 本节主要讲的内容有&#xff1a; 1.结构体类型的声明 2.结构体变量的创建和初始化 3.结构成员的访问操作符 4.结构体传参 5.结构体内存对齐 6.结构体实现位段(位域) 正文开…

verilog实现ram16*8 (vivado)

module ram_16x2 (input clk, // 时钟信号input we, // 写使能input en, // 使能信号input [3:0] addr, // 地址线input [1:0] datain, // 输入数据线output reg [1:0] dataout // 输出数据线 );// 定义存储器数组reg [1:0] mem [15:0];always (posedge…

影响转化率的多元因素分析及定制开发AI智能名片S2B2C商城系统小程序的应用案例

摘要&#xff1a;在互联网时代&#xff0c;转化率是衡量营销活动成功与否的关键指标。本文首先分析了影响转化率的多种因素&#xff0c;包括活动页面的设计、活动的限时性、主题文案的吸引力、从众心理的运用&#xff0c;以及最核心的产品质量与优惠力度。接着&#xff0c;本文…