【问题标题】:How to know when all data has arrived in node sockets如何知道所有数据何时到达节点套接字
【发布时间】:2013-02-23 17:18:54
【问题描述】:

我在后端使用带有 net 模块的 node.js,并在前端使用 flash。我想传递 json 格式的对象。我怎么知道所有数据何时到达我的后端以便我可以执行 JSON.parse?

我的动作脚本:

var obj = new Object();
obj.msg = "I want pizza";
xmlSocket.send(JSON.encode(obj));

我的javascript:

    socket.on("data", function(data){
        var msg = JSON.parse(data.toString());

        var i = 0;
        while(i < clientData.length){

            var client = clientData[i];
            if(client.writable){
                client.write(msg.msg, 'utf8');
            }
            i++;    
        }

});

目前我收到一个错误,我不确定与此有关,因为它显示了整个对象:

undefined:1
{"msg":"I want pizza"}
                      ^
SyntaxError: Unexpected token

【问题讨论】:

    标签: flash node.js sockets actionscript


    【解决方案1】:

    要知道数据何时结束,您必须在前面添加一些指定长度的内容或在末尾添加一些内容以表明数据结束。因此,要么将长度放在 JSON 的前面,要么在每个 JSON 对象之后放置一个换行符。

    另外:JSON.encode 是什么?我只知道JSON.stringify

    【讨论】:

    • 你能告诉我一个你将如何在javascript中进行检查的例子吗?谢谢。 JSON.encode 是动作脚本而不是 javascript。它来自 com.adobe.serialization.json.JSON。
    • @Bastrix:对于 appended-newline 方法:首先从套接字中读取一个字符串并将其附加到数据中,然后,只要数据包含换行符,就将字符串从开头取到第一个换行符,将其从原始字符串中删除并将其解释为 JSON。例如。 var data_buffer=''; socket.on('data', function(data) {data_buffer+=data; var i; while ((i = data_buffer.indexOf('\n')) != -1) {do_stuff_with(JSON.parse(data_buffer.substring(0, i)));data_buffer=data_buffer.substring(i+1);}})
    • 谢谢!有用。不过,我对您的最后一行代码感到有些困惑。这被认为适用于由 \n 分隔的几个 json 对象......对吗?所以它适用于单个对象以及类似 { "msg": "peanut" }\n{ "msg": "butter" }\n ... 对吗?
    • 为了让我能够通过您的示例发送多个对象,我只调整了一些东西。由于字符 \ 是转义字符。我检查: while ((i = data_buffer.indexOf('\\n')).... 另外,在最后一行中,为了跳过新行,我添加了两个位置:data_buffer=data_buffer。 substring(i+2);... 这似乎适用于我的本地网络上的小对象。我还没有在带有大对象的远程服务器上测试过。:)
    • @Bastrix:呃,我认为你做错了。您确实想使用换行符而不是字符串 \n 作为分隔符,因为真正的换行符不能出现在 JSON 中,但 \n 可以。您需要一个不能出现在常规数据中的分隔符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多