实现自定义协议发送主要步骤
- 确定数据:明确要发送的数据内容。
- 计算数据长度:获取数据的字节长度。
- 构造协议数据:将数据长度转换为4字节的二进制表示(如使用
Buffer.alloc(4)
并填充长度值),再拼接实际数据。
- 发送数据:通过网络连接(如
net.Socket
的write
方法)将构造好的协议数据发送出去。
关键代码示例(发送端)
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);
});
实现自定义协议解析主要步骤
- 监听数据事件:在接收端(如
net.Server
的连接事件内)监听data
事件。
- 读取数据长度:从接收到的缓冲区中提取前4个字节,解析为数据长度(如使用
readUInt32BE
方法)。
- 读取实际数据:根据解析出的数据长度,从缓冲区剩余部分读取实际数据内容。
- 处理数据:对读取到的实际数据进行相应的业务处理。
关键代码示例(接收端)
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');
});