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’);
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');
});
解释
-
设置编码:
- 使用
client.setEncoding('binary')
设置编码为'binary'
,以确保数据以二进制形式处理。
- 使用
-
发送数据:
- 使用
Buffer
对象来创建包含0x00
、packedData
和0xFF
的数据块,并通过client.write
方法发送。
- 使用
-
接收数据:
- 使用
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
对象。这样可以方便地组合二进制数据,确保它们按预期顺序发送。
通过这种方式,你可以确保发送的数据完全符合预期,而不会因为在字符串操作中出现编码转换问题。