我目前正在开发一个使用网络类连接到 PHP 服务器的简单 NodeJS 客户端。此外,NodeJS 客户端作为 Socket.IO 服务器工作,将从 PHP 服务器接收到的数据发送到与 Socket.IO 连接的浏览器。
到目前为止,一切正常。然而,如果我将另一个客户端连接到 Socket.IO,PHP 服务器必须向每个连接的客户端发送通知。因此,它将一个 JSON 编码的数组发送到处理 JSON 数据的 NodeJS 客户端(对其进行解码和修改)。
现在的问题是,有时 PHP 服务器发送的两条单独的消息在 NodeJS 的 onData 事件处理函数中连接:
client.on("data", function(data) {
var msgData = JSON.parse(data.toString("utf8"));
[...]
}
变量数据现在有时(不是每次!)包含两个 JSON 字符串,例如:
{ "todo":"message", [...] } { "todo":"message", [...] }
这当然会导致JSON.parse函数抛出异常。我预计 onData 函数的两次调用,变量数据为:
{ "todo":"message", [...] }
在 PHP 服务器端,我必须遍历包含当前服务的所有 Socket.IO 连接的数组:
foreach($sockets as $id => $client) {
$nodeJS->sendData($client, array("todo" => "message", [...]);
}
$nodeJS->sendData函数对数组进行 json 编码并将其发送到 NodeJS 客户端:
socket_write($nodeClient, json_encode($dataToSend));
$nodeJS->sendData函数最终被调用了两次,就像 socket_write 一样。
我现在不知道是 PHP 还是 NodeJS 连接了这两个字符串。我想要的是,每次调用$nodeJS->sendData函数时,NodeJS 都会调用一次 onData 处理程序(例如,sendData 被调用两次→ onData 事件被触发两次)。我当然可以在每个 json 编码字符串的末尾添加一些标志,然后在 onData 函数中将它们拆分为一个数组。但是,我不太喜欢这种解决方案。
有没有更简单的方法来实现这一点?