nodejs JSON.parse(data_from_TCP_socket)

时间:2014-03-03 21:50:41

标签: json node.js sockets buffer

我在使用require('net')的nodejs服务器上有这个代码,所以它是TCP,客户端是AS3并正确发送数据:

var server = net.createServer(function(socket) {

    socket.setEncoding("utf8");
    clients.push(socket);   

    function broadcast(message) {
        clients.forEach(function (client) {
            client.write(message);
        });
    }

    socket.on('data', function(dt){
        var rdt = dt;
        var srdt = rdt.toString();
        var ordt = JSON.parse(srdt);
        console.log(ordt);
        broadcast(ordt);
    }); 

    socket.on('end', function(){...});
})

它无法解析数据并提供各种错误。我能理解的是,我从客户端获得“缓冲”。但我需要保持套接字打开,所以带循环缓冲区的常见解决方案对我来说不起作用。

请帮我解决这个问题。

BTW,将数据字符串化的客户端,在收到数据时,会在发送时正确解析。

3 个答案:

答案 0 :(得分:3)

您需要知道,通过TCP套接字传递的唯一内容是两端的缓冲区。

因此,如果一端发送JSON编码数据,另一端获得缓冲区,为了解析JSON数据,您只需执行此操作

JSON.parse(buffer.toString('utf8'))

发送数据的结束需要在写入socket之前使用JSON.stringify

答案 1 :(得分:1)

我解决了这个问题。

发生了1个特定错误

undefined:1
{"chat":"hey","nickname":"nick_name"}
                                     ^
SyntaxError: Unexpected token
DEBUG: Program node app exited with code 8

数据字符串末尾的意外标记是一些不是空格的重影符号。 trim()不起作用,因此最后一个符号的子串可以工作。这是AS3符号,所以我们必须保留它。首先,将此符号保存在新变量中。你从线上擦掉这个符号。之后,您可以解析字符串。与之合作。

当您使用它完成后,将对象字符串化,然后将鬼符号添加到末尾并通过套接字发送。如果没有此符号,AS3将不会解析数据。

我不知道为什么会这样,但这对我有用。

答案 2 :(得分:1)

ValRus是正确的;你需要子串(0,str.length-1)来删除最后一个字符。

  let str = reading.toString('utf8');
  console.log( "String = %s", str );
  let obj = JSON.parse( str.substring(0, str.length-1) );


  let str2 = JSON.stringify(obj, null, 4); // Reverse conversion
  console.log("Obj = %s", str2);           // and output to inspect

这是我将JSON拉出MQTT消息缓冲区所需的代码。

(这在Java或C中调试会更容易 - 好主Javascript很痛苦!)