如何防止Node.js将套接字消息拆分成更小的块

时间:2010-08-09 02:33:59

标签: php apache sockets stream node.js

我有一个聊天程序,通过TCP套接字将JSON数据从Apache / PHP推送到Node.js:

// Node.js (Javascript)
phpListener = net.createServer(function(stream)
{
    stream.setEncoding("utf8");
    stream.on("data", function(txt)
    {
        var json = JSON.parse(txt);

        // do stuff with json
    }
}
phpListener.listen("8887", 'localhost');

// Apache (PHP)
$sock = stream_socket_client("tcp://localhost:8887");
$written = fwrite($sock, $json_string);
fclose($sock);

问题是,如果JSON字符串足够大(大约8k),输出消息将被拆分为多个块,并且JSON解析器失败。 PHP返回$ written值作为字符串的正确长度,但数据事件处理程序触发两次或更多次。

我是否应该将该函数附加到其他事件,或者是否有办法在事件触发时缓存文本,这种方式不会在重负载下屈服于竞争条件?或者其他一些我没有想过的解决方案?

谢谢!

2 个答案:

答案 0 :(得分:2)

您应该尝试使用缓冲区来缓存数据,因为Node.js倾向于拆分数据以提高性能。

http://nodejs.org/api.html#buffers-2

您可以缓冲所有请求,然后使用存储在其中的数据调用该函数。

答案 1 :(得分:1)

TCP套接字不会为您处理缓冲。怎么可能呢?它不知道您正在使用什么应用程序层协议,因此不知道“消息”是什么。你可以在它上面设计和实现另一个协议,并处理任何必要的缓冲。

但是,Node.js在TCP之上有一个内置的应用程序层协议,可以自动为你处理缓冲:http模块。如果您使用http模块而不是tcp模块,则无需担心数据包碎片和缓冲。