2

これはおそらく、node.js よりもソケット/tcp の動作に関するものです。

node.js でサーバーを作成しています。これは、一連の文字列化された JSON オブジェクトをソケット (HTTP ではなく) 経由で受信します。

クライアント (iOS アプリ) は、このソケットを介して JSON 文字列をストリーミングします。各 JSON 文字列のサイズはさまざま (数バイトから数 K バイト) であるため、タイミングが異なります。各 JSON 文字列は、1 回の「書き込み」操作で送信されます。

ソケットからデータを受け取るときは、JSON.parse() を呼び出します。

単純なテストケースはうまく機能しますが、これで十分かどうかはわかりません。

次のケースについて心配する必要があるかどうか疑問に思っています.(1)「データ」には複数のJSONオブジェクトが含まれています.(2)単一のJSONオブジェクトが複数のデータを介して送信されます.

4

2 に答える 2

4

json ペイロードとそうでないものについてのプロトコルを開発する必要があります。たとえば、tcp/ip ソケットを介して、開始文字を書き込み、次に json ペイロード、終了文字を書き込みます。このようにして、ソケットでの読み取りは、メッセージの開始時と終了時を認識します。複数のjsonペイロードを処理したい特定のケースでは、区切り文字が必要になります。

そのため、開始、終了、および区切り文字を選択するのはあなた次第です。使用できるキャラクターは多数あります。いくつかの選択肢については、ASCII/HEX テーブルを見てください。ただし、印刷できない文字に固執するのが最善です。そうしないと、ペイロードにこれらの文字が含まれる可能性がある状況に遭遇します。

その場合は、エスケープ シーケンス用に別の文字セットを開発する必要があります。つまり、begin、end、および区切り文字を定義すると、これらの文字はペイロードでは無効になり、送信側でエスケープ シーケンスに置き換える必要があります。これはまた、ペイロードを初期状態に戻すことができるように、受信側がこれらのエスケープ シーケンスを正しい文字に戻す必要があることを意味します。

たとえば、プロトコルを次のように定義できます。

[begin]     = 0x02     // Hex for Start of text
[end]       = 0x04     // Hex for end of end of transmission
[separator] = 0x03     // Hex for end of text

or 

[begin]     = 0x0B     // Hex for Vertical Tab
[end]       = 0x1C     // Hex for file separator
[separator] = 0x1E     // Hex for record separator

次に、tcp/ip ソケット (ワイヤ) を通過するメッセージは次のようになります (ここで、....... はメッセージ間の時間です)

[begin][json payload][separator][end].......[begin][json payload][seperator][json payload][separator][json payload][separator][end].......

そのため、begin が見つかるまで、ネットワーク上で読み取るコードを作成する必要があります。次に、セパレータが見つかるまでペイロードを保存します。次に、セパレーターの後の次の文字が終了チャーター ループでない場合は、次のペイロードを格納します。

Google で MLLP (Minimum Lower Level Protocol) を検索することもお勧めします。

于 2012-10-27T15:58:55.130 に答える
2

これは、この問題の非常に完全な説明であり、解決策とコードも含まれています。

于 2012-11-08T08:52:10.350 に答える