WebSocket简述及通过node.js的基本实现

这篇具有很好参考价值的文章主要介绍了WebSocket简述及通过node.js的基本实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WebSocket简述-通过node.js的基本实现

基本概念

WebSocket是自Html5开始在单个TCP连接上进行全双工通信1的协议,它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

为什么要使用WebSocket

HTTP 并不是为了保持打开连接以便服务器频繁地将数据推送到 Web 浏览器。以前,在系统开发的过程中大多数 Web 应用程序将通过频繁的异步 JavaScript 和 XML (AJAX)实现长轮询;
与之相比服务器推送比长轮询更高效和可扩展,因为 Web 浏览器不必通过 AJAX 请求流不断地请求更新,有更强的及时性且能节约资源。同时WebSockets 是全双工连接,因此客户端也可以将数据推送到服务器

node.js 针对 WebSocket的简易实现

这里采用node.js对功能进行展示, node.js的使用在这里不作额外介绍

服务端 server.js

// 引入express框架
var app = require('express')();
var server = require('http').Server(app);
// 引入ws框架支持webSocket实现
var WebSocket = require('ws');
// 针对8080接口进行监听
var wss = new WebSocket.Server({ port: 8080 });
// 当建立连接后,打印日志
wss.on('connection', function connection(ws) {
    console.log('server: receive connection.');
    // 同时返回服务端收到的信息
    ws.on('message', function incoming(message) {
        console.log('server: received: %s', message);
    });
    // 返回信息
    ws.send('receive');
});
// 绑定访问地址
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});
app.listen(3000);

客户端index.html

<script>
  var ws = new WebSocket('ws://localhost:8080');
  ws.onopen = function () {
    console.log('ws onopen');
    ws.send('from client: hello');
  };
  ws.onmessage = function (e) {
    console.log('ws onmessage');
    console.log('from server: ' + e.data);
  };
</script>

访问localhost:3000 会打开客户端页面,并对应向服务端发起请求,可以查看到应有的日志

WebSocket连接是如何建立的

打开控制台可以跟踪发现,首先是客户端通过标准的http请求 get方法发起升级协议请求

GET / HTTP/1.1
Host: localhost:8080
Origin: http://127.0.0.1:3000
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: JYB++OaZz3cuJvOOhZ2xHGghN80=

服务端对应响应升级完成链接建立

WebSocket通讯方式

WebSocket客户端、服务端通信的最小单位是帧(frame),由1个或多个帧组成一条完整的消息(message)。

发送端:将消息切割成多个帧,并发送给服务端;
接收端:接收消息帧,并将关联的帧重新组装成完整的消息;

WebSocket的每条消息可能被切分成多个数据帧。当WebSocket的接收方收到一个数据帧时,会根据FIN的值来判断,是否已经收到消息的最后一个数据帧。

FIN=1表示当前数据帧为消息的最后一个数据帧,此时接收方已经收到完整的消息,可以对消息进行处理。FIN=0,则接收方还需要继续监听接收其余的数据帧。

此外,opcode在数据交换的场景下,表示的是数据的类型。0x01表示文本,0x02表示二进制。而0x00比较特殊,表示延续帧(continuation frame),顾名思义,就是完整消息对应的数据帧还没接收完。

WebSocket的连接保持

WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没有断开。然而,对于长时间没有数据往来的连接,如果依旧长时间保持着,可能会浪费包括的连接资源。

但不排除有些场景,客户端、服务端虽然长时间没有数据往来,但仍需要保持连接。这个时候,可以采用心跳来实现。

发送方->接收方:ping
接收方->发送方:pong

对应实现代码

ws.ping('', false, true);

node.js WebSocket api示例

通过一个代码完整展示

<h2>Websocket Echo Client</h2>
    <div id="output"></div>
     // 初始化连接和事件
        function setup() {
            output = document.getElementById("output");
            ws = new WebSocket("ws://echo.websocket.org/echo");
            // 监听open
            ws.onopen = function (e) {
                log("Connected");
                sendMessage("Hello WebSocket!");
            }
            // 监听close
            ws.onclose = function (e) {
                log("Disconnected: " + e.reason);
            }
            //监听errors
            ws.onerror = function (e) {
                log("Error ");
            }
            // 监听 messages 
            ws.onmessage = function (e) {
                log("Message received: " + e.data);
                //收到消息后关闭
                ws.close();
            }
        }
        // 发送消息
        function sendMessage(msg) {
            ws.send(msg);
            log("Message sent");
        }
        // logging
        function log(s) {
            var p = document.createElement("p");
            p.style.wordWrap = "break-word";
            p.textContent = s;
            output.appendChild(p);
            // Also log information on the javascript console
            console.log(s);
        }
        // Start 
        setup();

  1. 全双工通信又称为双向同时通信,即通信的双方可以同时发送和接收信息的信息交互方式。与之不同的是半双工通信,虽然他也允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输 ↩︎文章来源地址https://www.toymoban.com/news/detail-486099.html

到了这里,关于WebSocket简述及通过node.js的基本实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用websocket+node.js实现pc后台与小程序端实时通信

    实现功能:实现pc后台与小程序端互发通信能够实时检测到 1.安装ws依赖 2.创建index.js 3.打开终端,启动服务 这里是手动点击连接按钮,发起的websocket连接,可自行更改到其他合适的地方连接websocket 1.创建两个按钮,连接按钮,发送按钮 2.定义事件,连接ws

    2024年02月03日
    浏览(44)
  • 用 Node.js 手写 WebSocket 协议

    目录 引言 从 http 到 websocekt 的切换 Sec-WebSocket-Key 与 Sec-WebSocket-Accept 全新的二进制协议 自己实现一个 websocket 服务器 按照协议格式解析收到的Buffer 取出opcode 取出MASK与payload长度 根据mask key读取数据 根据类型处理数据 frame 帧 数据的发送 完整代码 总结         我们知道,

    2024年02月16日
    浏览(40)
  • webSocket 聊天室 node.js 版

    全局安装vue脚手架  npm install @vue/cli -g 创建 vue3 + ts 脚手架  vue create vue3-chatroom src 同级目录下建 server:   核心代码: 完整代码:

    2024年02月12日
    浏览(48)
  • Node.js详解(三):Node.js的安装及基本使用

    Node.js支持在 Windows 、Linux以及在Mac 上安装使用 安装非常简单,无复杂操作;就不多做赘述,挂个连接参考:https://www.runoob.com/nodejs/nodejs-install-setup.html 安装完成,我们可以使用以下命令来查看当前的 Node 版本: $ node -v v18.16.0 注意:不同版本间可能是有差异的。 1、介绍 nvm全

    2024年02月10日
    浏览(57)
  • 【Node.JS】初入前端,学习node.js基本操作

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: npm可以分为全局安装和本地安装 Node所有API都支持回调函数,回调函数一般作为API的最后一个参数出现 阻塞代码实例 非阻塞代码示例 语法分析 具体示例 事件监听器就是

    2023年04月25日
    浏览(42)
  • node.js通过node-java库调用java接口(jar包)

    最近因项目需求,需要调用第三方java的打的jar包,但项目后端是用node.js写的,因此需要用node.js调用第三方jar,网上搜集资料,发现有一个库,node-java,可以通过js的方式调用java语言的包,以及包中的方法,因此整理了一下,以防时间长忘记,具体如下: jdk 1.8 并配置java_home、

    2024年02月12日
    浏览(41)
  • Node.js-Express框架基本使用

    Express是基于 node.js 的web应用开发框架,是一个封装好的工具包,便于开发web应用(HTTP服务) 中间件(Middleware):是一个回调函数,像路由一样可以访问请求对象(request, response). 作用:使用函数封装公共操作,简化代码。 全局中间件 路由中间件 静态资源中间件 注意事项 1、

    2024年02月12日
    浏览(52)
  • Node.js-模块化理解及基本使用

    讲一个复杂的程序文件按照一定的规则拆分成多个独立的小文件,这些小文件就是小模块,这就是模块化。 每个小模块内部的数据是私有的,可以暴露内部数据给外部其他模块使用。 减少命名的冲突 提高复用性 提高可维护性 按需加载 1.单个模块暴露 2.多个模块暴露 暴露数

    2024年02月14日
    浏览(51)
  • 使用node实现websocket

    websocket 代表了 Web 应用程序通信方式的根本转变。不同于传统的 HTTP 请求响应周期,即客户端从服务器请求数据并等待响应, websocket 在客户端和服务器之间建立一个持久的全双工连接。这意味着一旦建立了 websocket ,数据可以在任何时候双向流动,而不需要重复请求。 Web

    2024年02月08日
    浏览(34)
  • 通过nvm工具快捷切换node.js版本、以及nvm的安装

    使用nvm可以实现多个Node.js版本之间切换 步骤目录: 先卸载掉本系统中原有的node版本 去github上下载nvm安装包 安装node 常用的一些nvm命令 1、先卸载掉本系统中原有的node版本 2、去github上下载nvm安装包 https://github.com/coreybutler/nvm-windows/releases 下载:nvm-setup.zip,解压完后就是一个

    2024年02月14日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包