MST

星途 面试题库

面试题:Node.js 中如何自定义一个简单的网络通信协议并进行解析

假设你正在开发一个基于Node.js的简单网络应用,需要自定义一个协议用于客户端和服务器之间的数据传输。协议格式为:前4个字节表示数据长度,紧接着是实际数据内容。请描述实现自定义协议发送和解析的主要步骤,并给出关键代码示例。
31.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

实现自定义协议发送主要步骤

  1. 确定数据:明确要发送的数据内容。
  2. 计算数据长度:获取数据的字节长度。
  3. 构造协议数据:将数据长度转换为4字节的二进制表示(如使用Buffer.alloc(4)并填充长度值),再拼接实际数据。
  4. 发送数据:通过网络连接(如net.Socketwrite方法)将构造好的协议数据发送出去。

关键代码示例(发送端)

const net = require('net');
const client = new net.Socket();
const data = 'Hello, custom protocol!';
const dataLengthBuffer = Buffer.alloc(4);
dataLengthBuffer.writeUInt32BE(data.length);
const protocolData = Buffer.concat([dataLengthBuffer, Buffer.from(data)]);

client.connect(8080, '127.0.0.1', function () {
    client.write(protocolData);
});

实现自定义协议解析主要步骤

  1. 监听数据事件:在接收端(如net.Server的连接事件内)监听data事件。
  2. 读取数据长度:从接收到的缓冲区中提取前4个字节,解析为数据长度(如使用readUInt32BE方法)。
  3. 读取实际数据:根据解析出的数据长度,从缓冲区剩余部分读取实际数据内容。
  4. 处理数据:对读取到的实际数据进行相应的业务处理。

关键代码示例(接收端)

const net = require('net');
const server = net.createServer(function (socket) {
    let buffer = Buffer.alloc(0);
    socket.on('data', function (chunk) {
        buffer = Buffer.concat([buffer, chunk]);
        while (buffer.length >= 4) {
            const dataLength = buffer.readUInt32BE(0);
            if (buffer.length >= 4 + dataLength) {
                const data = buffer.slice(4, 4 + dataLength);
                buffer = buffer.slice(4 + dataLength);
                console.log('Received data:', data.toString());
            } else {
                break;
            }
        }
    });
});

server.listen(8080, '127.0.0.1', function () {
    console.log('Server is listening on port 8080');
});