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.Socketwrite 方法向服务器传输数据。具体来说,我需要将一些打包后的数据(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 对象来创建包含 0x00packedData0xFF 的数据块,并通过 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 对象。这样可以方便地组合二进制数据,确保它们按预期顺序发送。

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

回到顶部