私は現在、ネットクラスを使用してPHPサーバーに接続する単純なNodeJSクライアントに取り組んでいます。さらに、NodeJSクライアントは、PHPサーバーから受信したデータをSocket.IOに接続されているブラウザーに送信するSocket.IOサーバーとして機能しています。
これまでのところ、すべてが正常に機能しています。しかし、別のクライアントとSocket.IOに接続すると、PHPサーバーは接続されているすべてのクライアントに通知を送信する必要があります。したがって、JSONでエンコードされた配列をNodeJSクライアントに送信します。NodeJSクライアントはJSONデータを処理します(デコードして少し変更します)。
ここで問題となるのは、PHPサーバーによって送信された2つの別々のメッセージがNodeJSのonDataイベント処理関数で連結されることがあるということです。
client.on("data", function(data) {
var msgData = JSON.parse(data.toString("utf8"));
[...]
}
変数データには、次のような2つのJSON文字列が含まれることがあります(毎回ではありません!)。
{ "todo":"message", [...] } { "todo":"message", [...] }
もちろん、これにより、JSON.parse関数によって例外がスローされます。変数データが次のようなonData関数の2つの呼び出しを期待していました。
{ "todo":"message", [...] }
PHPサーバー側では、現在提供されているすべてのSocket.IO接続を含む配列を反復処理する必要があります。
foreach($sockets as $id => $client) {
$nodeJS->sendData($client, array("todo" => "message", [...]);
}
$ nodeJS-> sendData -function json-配列をエンコードし、NodeJSクライアントに送信します。
socket_write($nodeClient, json_encode($dataToSend));
$ nodeJS-> sendData関数は、socket_writeと同様に、確実に2回呼び出されます。
PHPとNodeJSのどちらがこれらの2つの文字列を連結しているかわかりません。私が欲しいのは、NodeJSが$ nodeJS-> sendData関数が呼び出されるたびにonDataハンドラーを1回呼び出すことです(たとえば、sendDataが2回呼び出されます→onData-eventが2回発生します)。もちろん、jsonでエンコードされた各文字列の最後にフラグを追加し、後でonData関数でそれらを配列に分割することもできます。しかし、私はその解決策があまり好きではありません。
これを達成するためのより簡単な方法はありますか?