我在使用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,将数据字符串化的客户端,在收到数据时,会在发送时正确解析。
答案 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很痛苦!)