21xrx.com
2025-03-21 18:53:30 Friday
文章检索 我的文章 写文章
Node.js 实现 WebSocket 上传文件功能
2023-07-05 08:41:23 深夜i     59     0
Node js WebSocket 上传文件 实现 功能

在现代的 web 应用开发中,实时性非常重要。在实时性要求比较高的 web 应用中,常会使用 WebSocket 技术。

WebSocket 是一种建立在 TCP 协议基础上的全双工通信协议,它可以实现客户端和服务端之间的实时双向通信。在实时的 web 应用中,除了实时的消息推送,文件上传也是必不可少的功能。

Node.js 是一种非常流行的服务端编程语言,它可以轻松地实现 WebSocket 上传文件功能。下面将介绍如何使用 Node.js 实现 WebSocket 上传文件功能。

首先,我们需要安装一些 Node.js 模块。运行以下命令来安装这些模块:

npm install websocket fs path

其中,websocket 是 WebSocket 库,fs 和 path 是 Node.js 原生模块,分别用于读取文件和处理文件路径。

接下来,我们需要创建一个 WebSocket 服务端。代码如下:

const WebSocketServer = require('websocket').server;
const http = require('http');
const fs = require('fs');
const path = require('path');
const server = http.createServer((request, response) => {
  response.writeHead(404);
  response.end();
});
server.listen(8080, () => {
  console.log('Server is listening on port 8080');
});
const wsServer = new WebSocketServer(
  httpServer: server
);
wsServer.on('request', (request) => {
  const connection = request.accept(null, request.origin);
  connection.on('message', (message) => {
    if (message.type === 'utf8') {
      console.log(`Received message: ${message.utf8Data}`);
    } else if (message.type === 'binary') {
      console.log(`Received binary data. Message size: ${message.binaryData.length} bytes.`);
      fs.writeFile(path.join(__dirname, 'uploads', 'filename.txt'), message.binaryData, (err) => {
        if (err) {
          console.log(`Error writing file: ${err}`);
        } else {
          console.log('File written successfully');
        }
      });
    }
  });
});

上面的代码创建了一个 HTTP 服务器,并使用 WebSocket 库创建了一个 WebSocket 服务端。WebSocket 服务端监听客户端的连接请求,并在客户端连接成功后,等待客户端发送消息。如果客户端发送的是文本消息,WebSocket 服务端会直接打印出消息内容。如果客户端发送的是二进制消息,WebSocket 服务端会将消息保存到 uploads 目录下的 filename.txt 文件中。如果文件已经存在,WebSocket 服务端会覆盖它。

现在,我们需要创建一个客户端来测试 WebSocket 上传文件功能。代码如下:

const WebSocket = require('ws');
const fs = require('fs');
const path = require('path');
const ws = new WebSocket('ws://localhost:8080');
ws.on('open', () => {
  console.log('Connected to server');
  const file = fs.readFileSync(path.join(__dirname, 'file.txt'));
  ws.send(file,
    binary: true
  , () => {
    console.log('File sent');
  });
});
ws.on('error', (err) => {
  console.log(`Error: ${err}`);
});
ws.on('close', () => {
  console.log('Connection closed');
});

上面的代码创建了一个 WebSocket 客户端,并连接到上面创建的 WebSocket 服务端。客户端读取了本地的 file.txt 文件,并使用 WebSocket 发送了它。发送时,客户端设置了 binary 标志,以告诉 WebSocket 库这是一个二进制文件。

运行上面的代码后,我们可以在服务端控制台看到文件上传的日志输出。这表示文件已经成功上传到服务端。我们可以在 uploads 目录下找到文件,确认文件内容与原文件相同。

至此,我们已经成功地使用 Node.js 实现了 WebSocket 上传文件功能。在实时性要求比较高的 web 应用中,这种实现方式可以让用户以更加快速、高效的方式上传文件。

  
  

评论区