Node.js中利用net模块编写socket发送遇到的问题

Node.js中利用net模块编写socket发送遇到的问题

由于各种原因在node.js里使用l了net模块,但是在发送的时候遇到了一个问题,比如我有个tbuff里面的数据是我已经加密和压缩好的数据,但是使用socket.write发送的时候,会将tbuff里的数据变成字符串后在通过io发送。不知道有什么办法可以正常发送我tbuff里面的数据。

9 回复

在Node.js中使用net模块编写Socket通信时,如果需要发送二进制数据(例如加密和压缩后的数据),直接使用socket.write()可能会导致数据被误解析为字符串。为了正确地发送二进制数据,我们需要确保数据是以Buffer形式传递的。

以下是一个简单的示例代码来说明如何正确发送二进制数据:

示例代码

const net = require('net');

// 创建服务器
const server = net.createServer((socket) => {
    console.log('客户端已连接');

    // 接收来自客户端的数据
    socket.on('data', (data) => {
        console.log('接收到数据:', data);
    });

    // 关闭连接时的操作
    socket.on('end', () => {
        console.log('客户端已断开连接');
    });
});

server.listen(3000, () => {
    console.log('服务器已启动,监听端口 3000');
});

// 客户端代码
const client = new net.Socket();
client.connect(3000, 'localhost', () => {
    console.log('成功连接到服务器');

    // 加密和压缩后的数据示例
    const tbuff = Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05]);

    // 发送二进制数据
    client.write(tbuff);

    // 断开连接
    setTimeout(() => {
        client.destroy();
    }, 1000);
});

解释

  1. 创建服务器

    • 使用net.createServer()创建一个TCP服务器。
    • 在连接事件中处理客户端发送的数据,并打印出来。
  2. 客户端代码

    • 使用new net.Socket()创建一个新的Socket对象。
    • 连接到服务器并发送二进制数据。
    • Buffer.from()方法用于创建一个包含特定字节序列的Buffer对象。
    • socket.write()方法用于发送数据,这里我们直接传入Buffer对象。

通过这种方式,我们可以确保发送的是原始的二进制数据,而不是被误解析为字符串的数据。这样可以避免数据在传输过程中出现不必要的转换或损坏。


你是如何知道它先变成字符串再发送的呢,确定不是接收端转的字符串?

不是变成字符串。是先把里面的内容变成 了字符串在转换成了2进制发送的。我的接收端是用C++写的socket接收后发现数据是字符串经过转换的byte

已经解决了。吧数据扔到BUFFER里发送就好了

额。。。。。。。。。。。。。。

楼主能给个qq号码不,有点东西需要请教下,我这边客户端也是c++,服务端用的nodejs

直接丢buffer。不要转码。

252997050 你联系吧

在Node.js中使用net模块编写Socket通信时,如果你希望直接发送二进制数据(如已加密或压缩后的数据),你需要确保数据是以Buffer对象的形式传递给socket.write()方法。

默认情况下,如果传入的是一个字符串,socket.write()会自动将其转换为Buffer。但如果你已经有了一个Buffer对象,可以直接传递给socket.write(),这样就不会发生类型转换问题。

示例代码

假设你有一个已经加密和压缩过的Buffer对象tbuff,你可以这样发送:

const net = require('net');

// 创建服务器
const server = net.createServer((socket) => {
    // 接收到客户端连接时触发
    console.log('Client connected');

    // 假设这是从客户端接收到的一个已加密和压缩的数据Buffer
    const tbuff = Buffer.from([/* 加密和压缩后的二进制数据 */]);

    // 直接发送tbuff中的二进制数据
    socket.write(tbuff);

    socket.on('end', () => {
        console.log('Client disconnected');
    });
});

server.listen(12345, () => {
    console.log('Server listening on port 12345');
});

解释

  • Buffer.from([...]):用于创建一个Buffer对象,这里假设你已经有了一个加密和压缩后的二进制数据。
  • socket.write(tbuff):直接将Buffer对象tbuff传递给socket.write()方法,避免数据类型转换。

如果你是从客户端发送数据到服务器,客户端代码也会非常相似,只是方向相反:

const net = require('net');

const client = new net.Socket();
client.connect(12345, 'localhost', () => {
    console.log('Connected to server');

    // 假设这是要发送的已加密和压缩的二进制数据
    const tbuff = Buffer.from([/* 加密和压缩后的二进制数据 */]);
    
    // 直接发送二进制数据
    client.write(tbuff);
});

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

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

这段代码展示了如何使用net模块发送和接收二进制数据。只要确保你传递给socket.write()的参数是Buffer对象,而不是字符串,就可以正确地发送原始二进制数据。

回到顶部