Nodejs实现WebSocket代码实例

下面是针对“Nodejs实现WebSocket代码实例”的完整攻略,包含代码示例和详细说明:

什么是WebSocket

WebSocket是HTML5提出的一种新型通信协议,它建立在传输层TCP协议之上,并通过HTTP协议进行握手。WebSocket协议的特点是支持全双工通信、实时性更高、更省带宽、更灵活、能够实现跨域通信等。

Nodejs实现WebSocket的原理

Node.js中实现WebSocket通信需要依赖两个核心模块wshttp模块,前者用于WebSocket通信,后者用于提供HTTP请求服务。

WebSocket通信的过程可以简化为以下步骤:

  1. 客户端发送一个WebSocket请求,请求报文中包含WebSocket key和协议版本信息。
  2. 服务端收到WebSocket请求,校验WebSocket key并返回HTTP响应报文,包含一个握手响应头Sec-WebSocket-Accept以及协议版本信息。
  3. 客户端收到握手响应后,判断Sec-WebSocket-Accept是否与自己生成的WebSocket key匹配,如果匹配则认为握手成功,开始进行WebSocket通信。

实现WebSocket通信的关键是进行握手,需要在服务端接收到WebSocket请求后进行握手处理。

握手的过程示例代码如下:

const http = require('http');
const crypto = require('crypto');
const websocket = require('ws');

const server = http.createServer((req, res) => {
  //处理WebSocket握手
  if (req.headers.connection === 'Upgrade' && req.headers.upgrade === 'websocket') {
    const secWebSocketKey = req.headers['sec-websocket-key'];
    const secWebSocketAccept = crypto
      .createHash('sha1')
      .update(secWebSocketKey + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', 'binary')
      .digest('base64');
    res.writeHead(101, {
      Connection: 'Upgrade',
      Upgrade: 'websocket',
      'Sec-WebSocket-Accept': secWebSocketAccept
    });
    const ws = new websocket.WebSocket({ server: server });
    ws.on('connection', function (socket) {
      console.log('webSocket server connected');
      socket.on('message', function (message) {
        console.log('received: %s', message);
      });
      socket.send('Hello from WebSocket server');
    });
  } else {
    //处理HTTP请求
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
  }
});

server.listen(8080);
console.log('Server running on port 8080.');

在代码中,我们通过http.createServer创建了一个HTTP请求服务,当收到WebSocket请求时,会进入到握手处理逻辑中。

首先取出WebSocket key,生成WebSocket Accept,然后通过res.writeHead设置响应报文头,包括状态码101、Connection和Upgrade字段以及Sec-WebSocket-Accept字段。此外,还需要创建一个websocket对象,该对象监听connection事件,并在连接成功后,处理收到的消息并返回一个问候信息。

Nodejs实现WebSocket的使用示例

在第一个示例中,我们将通过WebSocket连接模拟客户端和服务端之间的聊天,服务端收到客户端发送的消息后,通过WebSocket通道将消息推送给所有已连接的客户端。

服务端代码:

const http = require('http');
const crypto = require('crypto');
const websocket = require('ws');

const server = http.createServer((req, res) => {
  //处理WebSocket握手
  if (req.headers.connection === 'Upgrade' && req.headers.upgrade === 'websocket') {
    const secWebSocketKey = req.headers['sec-websocket-key'];
    const secWebSocketAccept = crypto
      .createHash('sha1')
      .update(secWebSocketKey + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', 'binary')
      .digest('base64');
    res.writeHead(101, {
      Connection: 'Upgrade',
      Upgrade: 'websocket',
      'Sec-WebSocket-Accept': secWebSocketAccept
    });
    const ws = new websocket.WebSocket({ server: server });
    ws.on('connection', function (socket) {
      console.log('webSocket server connected');
      socket.on('message', function (message) {
        console.log('received: %s', message);
        ws.clients.forEach(client => {
          if (client.readyState === websocket.OPEN) {
            client.send(message);
          }
        });
      });
    });
  } else {
    //处理HTTP请求
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
  }
});

server.listen(8080);
console.log('Server running on port 8080.');

客户端代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>WebSocket Chat Example</title>
  <script>
    let socket;
    function connect() {
      socket = new WebSocket('ws://localhost:8080');
      socket.onopen = function () {
        console.log('WebSocket connection opened.');
      }
      socket.onmessage = function (e) {
        console.log('received: ' + e.data);
        const messages = document.getElementById('messages');
        const message = document.createElement('li');
        message.textContent = e.data;
        messages.appendChild(message);
      }
      socket.onclose = function () {
        console.log('WebSocket connection closed.');
        setTimeout(connect, 1000);
      }
      socket.onerror = function (error) {
        console.log('WebSocket error: ' + error.message);
      }
      const form = document.getElementById('sendForm');
      const input = document.getElementById('messageInput');
      form.addEventListener('submit', e => {
        e.preventDefault();
        socket.send(input.value);
        input.value = '';
      });
    }
    window.addEventListener('load', connect);
  </script>
</head>
<body>
  <ul id="messages"></ul>
  <form id="sendForm">
    <input id="messageInput" type="text"><button>Send</button>
  </form>
</body>
</html>

在客户端启动后,在页面输入框内输入任意内容,再点击发送按钮,消息将被发送到服务端,而服务端收到消息后,会通过WebSocket通道将消息推送给所有已连接的客户端。

第二个示例中,我们将通过WebSocket连接模拟客户端和服务端之间的传输文件,客户端选择文件后,服务端接收文件并保存到本地。

服务端代码:

const http = require('http');
const fs = require('fs');
const crypto = require('crypto');
const websocket = require('ws');
const stream = require('stream');

const server = http.createServer((req, res) => {
  //处理WebSocket握手
  if (req.headers.connection === 'Upgrade' && req.headers.upgrade === 'websocket') {
    const secWebSocketKey = req.headers['sec-websocket-key'];
    const secWebSocketAccept = crypto
      .createHash('sha1')
      .update(secWebSocketKey + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', 'binary')
      .digest('base64');
    res.writeHead(101, {
      Connection: 'Upgrade',
      Upgrade: 'websocket',
      'Sec-WebSocket-Accept': secWebSocketAccept
    });
    const ws = new websocket.WebSocket({ server: server });
    ws.on('connection', function (socket) {
      console.log('webSocket server connected');
      let writableStream;
      socket.on('message', function (message) {
        if (message instanceof Buffer) {
          if (writableStream) {
            writableStream.write(message);
          }
        } else {
          //收到文件名
          const fileName = message.toString();
          writableStream = fs.createWriteStream(`./files/${fileName}`);
        }
      });
      socket.on('close', function () {
        writableStream.end(() => {
          console.log('file saved successfully');
        });
      });
    });
  } else {
    //处理HTTP请求
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
  }
});

server.listen(8080);
console.log('Server running on port 8080.');

客户端代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>WebSocket File Transfer Example</title>
  <script>
    let socket;
    function connect() {
      socket = new WebSocket('ws://localhost:8080');
      socket.onopen = function () {
        console.log('WebSocket connection opened.');
      }
      socket.onmessage = function (e) {
        console.log('received: ' + e.data);
        if (typeof e.data === 'string') {
          //接收到服务端请求文件内容的消息,开始发送文件
          const file = document.getElementById('file').files[0];
          const reader = new FileReader();
          reader.onload = function (e) {
            const buffer = e.target.result;
            for (let i=0, length=buffer.byteLength; i<length; i+=1024) {
              const chunk = buffer.slice(i, i+1024);
              socket.send(chunk);
            }
          }
          reader.readAsArrayBuffer(file);
          //发送文件名
          socket.send(file.name);
        }
      }
      socket.onclose = function () {
        console.log('WebSocket connection closed.');
      }
      socket.onerror = function (error) {
        console.log('WebSocket error: ' + error.message);
      }
    }
    window.addEventListener('load', connect);
  </script>
</head>
<body>
  <form enctype="multipart/form-data">
    <input id="file" type="file">
  </form>
</body>
</html>

在客户端启动后,选择任意文件,上传文件时,服务端便会接收到文件,并将文件保存到指定目录中。

这便是应用WebSocket实现的两个示例,第一个示例利用WebSocket实现客户端与服务端之间的聊天,第二个示例利用WebSocket实现了文件上传及保存的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs实现WebSocket代码实例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs开发环境配置与使用

    Node.js开发环境配置与使用攻略 Node.js是一种基于V8引擎的JavaScript运行环境,可以帮助我们在服务器端运行JavaScript代码。在开发Node.js应用程序前,我们需要对开发环境进行配置,本文将为你介绍如何在不同平台上设置Node.js开发环境。 一、Windows平台上配置 以下是在Windows平台上配置Node.js开发环境的…

    node js 2023年6月8日
    00
  • JS 中实现一个串型异步函数队列

    异步函数队列的定义 在JS中,异步函数队列是指将多个异步函数串连起来按照顺序执行的一种方式。每个异步函数需要等待上一个异步函数完成后才能执行,如此循环执行下去。这种实现方式通常用于异步任务按照顺序逐步执行的场景中,例如:多个Ajax请求,或者是依赖关系复杂的操作。 实现串型异步函数队列的方法 实现JS中串型异步函数队列的方法有很多种,我将会介绍一种较为常用的…

    node js 2023年6月8日
    00
  • Vue2.0表单校验组件vee-validate的使用详解

    下面是关于Vue2.0表单校验组件vee-validate的使用详解: 1. 简介 vee-validate是一款基于Vue2.0开发的表单校验组件,可以方便地在Vue项目中实现表单校验功能。 它支持动态校验规则、i18n国际化等特性。 2. 安装 npm install vee-validate 3. 引入 在Vue项目中,需要使用以下代码进行引入: im…

    node js 2023年6月8日
    00
  • node.js文件上传处理示例

    下面我会详细讲解一下 “node.js 文件上传处理示例” 的完整攻略。这个示例是用来演示如何使用 node.js 处理文件上传的场景。 前置知识 在学习这个示例之前,需要掌握以下知识: 基本的 node.js 知识 HTTP 协议 基本的 JavaScript 知识 了解文件上传的相关概念 实现方法 使用 node.js 实现文件上传主要使用了以下两个模块…

    node js 2023年6月8日
    00
  • nodejs前端自动化构建环境的搭建

    我将为你详细讲解”Node.js前端自动化构建环境的搭建”。 什么是Node.js前端自动化构建? 在web前端开发中,为了提高工作效率,避免重复繁琐的人工操作,我们需要使用一些特定的工具进行自动化构建。Node.js在前端开发中具有很大的优势,可以使用它构建自动化流程,比如自动化压缩、合并、编译等,极大地增强了前端开发的效率。 Node.js前端自动化构建…

    node js 2023年6月8日
    00
  • Python调用JavaScript代码的方法

    Python 可以通过集成第三方库实现调用 JavaScript 代码。下面我介绍两种主流的方法以及示例说明。 方法一:使用 PyV8 PyV8 是一种 Python 和 JavaScript 之间的双向绑定引擎。通过它我们可以在 Python 中调用 JavaScript 代码,方法如下: 安装 PyV8 !pip install PyV8 使用 PyV8…

    node js 2023年6月8日
    00
  • 基于node搭建服务器,写接口,调接口,跨域的实例

    首先,我们需要明确基于node搭建服务器并写接口,其实就是利用node提供的http模块来实现服务器端的开发。在搭建服务器时,需要注意以下几个步骤: 步骤1:创建一个npm项目 首先,打开命令行工具,进入要创建项目的文件夹中,输入以下命令: npm init 然后,按照提示输入项目的相关信息,如名字、版本号、描述等等。 步骤2:安装依赖库 在项目中使用到的依…

    node js 2023年6月8日
    00
  • Node.js Sequelize如何实现数据库的读写分离

    Node.js中的Sequelize是一种非常流行的ORM(对象关系映射)框架,它提供了兼容多种数据库的API,支持数据库的读写分离。下面是关于如何使用Sequelize实现数据库的读写分离的攻略: 什么是数据库读写分离 数据库读写分离(database read-write separation)是指将数据库的读操作和写操作分别放在不同的实例上,以实现更高…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部