Nodejs的net模块获取到数据转成json后,取得的值怎么是乱码?如何解决,求大神

Nodejs的net模块获取到数据转成json后,取得的值怎么是乱码?如何解决,求大神

socket.on(‘data’, function(data){
if(data.toString()==’<policy-file-request/>\0’){
socket.end(XML);
console.log(‘客户端flash已与服务器建立连接,可以正常传输数据了!’);			
}else{
sockets.push(socket);
console.log(sockets.length);
getdata = JSON.parse(data);
console.log(getdata.login);
socket.write(getdata.login);
}		
});


6 回复

当使用Node.js的net模块处理网络通信时,经常会遇到从网络读取的数据转换为JSON格式后出现乱码的问题。这通常是因为数据编码不一致或数据格式问题导致的。为了正确处理这种情况,我们需要确保从网络读取的数据是以正确的编码方式解析,并且数据本身是一个有效的JSON字符串。

示例代码

假设我们有一个简单的TCP服务器,它接收来自客户端的数据,并尝试将这些数据解析为JSON对象。如果数据不是有效的JSON格式或者编码不正确,解析过程可能会失败,导致乱码。

解决方案

  1. 确保数据编码正确:首先,确保从网络读取的数据是UTF-8编码。
  2. 检查数据完整性:确保接收到的数据是一个完整的JSON对象。
  3. 错误处理:添加错误处理逻辑以捕获并处理可能的异常。
const net = require('net');

const server = net.createServer((socket) => {
    let dataBuffer = '';

    socket.on('data', (chunk) => {
        dataBuffer += chunk.toString(); // 将接收到的二进制数据转换为字符串
        try {
            const jsonData = JSON.parse(dataBuffer);
            console.log(jsonData.login); // 正确打印出login字段
            socket.write(JSON.stringify({ response: 'Received' })); // 返回一个JSON响应
        } catch (error) {
            if (error instanceof SyntaxError) {
                console.error('数据不是有效的JSON格式');
            } else {
                console.error('发生其他错误:', error);
            }
        }
    });

    socket.on('end', () => {
        console.log('客户端断开连接');
    });
});

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

解释

  • 数据缓冲:使用dataBuffer变量来累积接收到的数据片段,直到形成一个完整的JSON对象。
  • 错误处理:通过try...catch块捕获解析过程中可能出现的SyntaxError,并进行相应的处理。
  • 数据输出:确保发送回客户端的数据也是JSON格式,这样客户端可以更容易地处理响应。

通过这种方式,我们可以避免由于编码问题或数据完整性问题导致的数据乱码现象,从而提高程序的健壮性和可靠性。


转成UTF-8 看看。

如果没有调用socket.setEncoding();,回调中拿到的data就是一个Buffer对象,Buffer直接toString()的话,默认编码是utf-8,所以乱码的话可能是客户端传输的编码不是utf-8

另外一个问题是,你从socket读数据的方式不对,TCP是面向字节流的,data事件触发的时候,你未必就能一次拿到全部json数据(它可能被切成一段一段的发过来,尤其是网络不好的情况下),一般的处理方式有两种:对端先发送数据长度,然后这别先读到长度,这样把后面的数据都buffer起来,直到读够了指定长度的数据,这时你才能确定这段数据传完了。另一种方式是:采用特定的分隔符号,比如用\r\n分隔每段json数据,这样也是先buffer,然后每读到一个\r\n就知道一段完整的json收到了。

再有一个问题是,node.jsv0.10中stream有一些变化,如果你在用新版本的话,建议使用新的API:

socket.on('readable', function () {
    var data = socket.read();
});

thanks,已解决

太感谢了,解决了大问题!

在使用Node.js的net模块处理数据时,如果直接将接收到的数据通过JSON.parse()转换为JSON对象,可能会遇到乱码问题。这通常是由于编码不一致导致的。解决这个问题的方法是在解析之前正确地将Buffer转换为字符串,并确保使用正确的字符编码。

下面是一段示例代码,展示如何正确处理从TCP套接字接收到的数据并将其解析为JSON对象:

const net = require('net');

const server = net.createServer((socket) => {
    socket.on('data', function (data) {
        let dataString = data.toString('utf-8'); // 使用utf-8编码转换为字符串
        if (dataString === '<policy-file-request/>\0') {
            socket.end('<cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>\0');
            console.log('客户端flash已与服务器建立连接,可以正常传输数据了!');
        } else {
            try {
                const getdata = JSON.parse(dataString); // 解析JSON字符串
                console.log(getdata.login);
                socket.write(JSON.stringify({ login: getdata.login })); // 将对象转换为JSON字符串并发送
            } catch (error) {
                console.error('无法解析接收到的数据为JSON:', error.message);
            }
        }
    });

    socket.on('end', () => {
        console.log('客户端断开连接');
    });
});

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

在这个示例中,我们首先使用toString('utf-8')方法将接收到的Buffer数据转换为UTF-8编码的字符串。这样做可以避免乱码问题。然后尝试将该字符串解析为JSON对象。如果解析成功,则打印出login字段的值,并以JSON格式返回给客户端。如果解析失败,则捕获错误并输出错误信息。

注意,确保客户端发送的数据确实是有效的JSON格式,否则JSON.parse()会抛出异常。

回到顶部