Nodejs net.Socket发送binary数据的问题

Nodejs net.Socket发送binary数据的问题

最近要模拟比较老版本的websocket的client。 要用到net.Socket的write向服务器传输数据 client.write(String.fromCharCode(0x00)+packeddata+String.fromCharCode(0xFF)) 但是接受的信息来看末尾的 0xFF 变成 0XC3,0xBF 不是我想要的0xFF 这怎么解决呢?(我不能控制server,所以必须要传0xFF做EOF) PS:已经设置了client.setEncoding(‘binary’);


3 回复

Nodejs net.Socket 发送 binary 数据的问题

最近需要模拟一个较老版本的 WebSocket 客户端,并使用 net.Socket 的 write 方法向服务器传输数据。具体来说,我需要将一些打包后的数据(packeddata)通过 net.Socket 发送到服务器,并且以 0xFF 作为结束标志符。

但是,当我接收从服务器返回的数据时,发现结尾的 0xFF 被转换成了 0xC3, 0xBF,而不是我期望的 0xFF。这是因为 JavaScript 默认处理字符串的方式导致了编码问题。为了解决这个问题,我们需要确保数据以二进制形式正确地发送和接收。

解决方案

我们可以通过设置 Socket 的编码为 'binary' 来确保数据以二进制形式发送。同时,我们可以使用 Buffer 对象来确保数据在发送和接收时保持正确的二进制格式。

示例代码

const net = require('net');

// 创建一个客户端实例
const client = new net.Socket();

// 设置编码为 'binary'
client.setEncoding('binary');

// 连接到服务器
client.connect({ port: 12345, host: 'localhost' }, () => {
    console.log('Connected to server');

    // 打包数据
    const packedData = Buffer.from([0x01, 0x02, 0x03]); // 示例打包数据

    // 发送数据
    client.write(Buffer.concat([
        Buffer.from([0x00]),
        packedData,
        Buffer.from([0xFF])
    ]), 'binary');
});

// 监听数据接收事件
client.on('data', (data) => {
    console.log('Received data:', data);

    // 处理接收到的数据
    const buffer = Buffer.from(data, 'binary');
    if (buffer[buffer.length - 1] === 0xFF) {
        console.log('End of message detected');
    }
});

// 监听连接关闭事件
client.on('close', () => {
    console.log('Connection closed');
});

解释

  1. 设置编码:

    • 使用 client.setEncoding('binary') 设置编码为 'binary',以确保数据以二进制形式处理。
  2. 发送数据:

    • 使用 Buffer 对象来创建包含 0x00、packedData 和 0xFF 的数据块,并通过 client.write 方法发送。
  3. 接收数据:

    • 使用 Buffer.from 方法将接收到的数据转换为 Buffer 对象,以便正确解析数据并检查是否以 0xFF 结束。

通过这种方式,我们可以确保数据在发送和接收过程中保持正确的二进制格式,从而避免编码问题。


用Buffer别用string

在使用 net.Socket 发送二进制数据时,需要注意编码问题。直接使用字符串拼接可能会导致编码转换错误,进而影响二进制数据的准确性。

你可以使用 Buffer 对象来处理二进制数据,确保数据以正确的格式发送。以下是一个示例代码:

const net = require('net');

// 创建客户端socket连接
const client = new net.Socket();

client.connect(12345, '127.0.0.1', () => {
    console.log('Connected to server!');

    // 使用Buffer对象创建二进制数据
    const packedData = Buffer.from([/* 填入你的二进制数据 */]);
    const endMarker = Buffer.from([0xFF]);

    // 拼接二进制数据并发送
    client.write(Buffer.concat([Buffer.from([0x00]), packedData, endMarker]));
});

client.on('data', (data) => {
    console.log('Received data:', data);
});

client.on('close', () => {
    console.log('Connection closed');
});

解释

  • Buffer 对象:Buffer 是 Node.js 中处理二进制数据的主要工具。它允许你以原始字节的形式操作数据,而不会因为字符编码的问题而导致数据被修改。

  • Buffer.from() 方法:用于创建包含特定字节的 Buffer 对象。你可以传递一个数组来指定字节值。

  • Buffer.concat() 方法:将多个 Buffer 对象合并成一个新的 Buffer 对象。这样可以方便地组合二进制数据,确保它们按预期顺序发送。

通过这种方式,你可以确保发送的数据完全符合预期,而不会因为在字符串操作中出现编码转换问题。

回到顶部