2012-05-07 14 views
3

問題は、ネットソケットを介して大規模なシリアル化されたJSON(16,000文字以上)をチャンクに分割することです。各チャンクは、受信側のdataイベントを起動します。したがって、受信データでJSON.parse()を単に実行すると、SyntaxError: Unexpected end of inputで失敗することがあります。ノード - ネットソケットを介して大きなJSONを送信

私がこれまで考えてきたことは、シリアライズされたJSONの末尾にヌル文字('\u0000')を追加し、受信側でそれを確認することです。ここでの例である:このモデルの失敗の

var partialData = ''; 
client.on('data', function(data) { 
    data = data.toString(); 
    if (data.charCodeAt(data.length - 1) !== 0) { 
     partialData += data; 
     // if data is incomplete then no need to proceed 
     return; 
    } else { 
     // append all but the null character to the existing partial data 
     partialData += data.substr(0, data.length - 1); 
    } 
    // pass parsed data to some function for processing 
    workWithData(JSON.parse(partialData)); 
    // reset partialData for next data transfer 
    partialData = ''; 
}); 

つの受信機は、複数のソケットに接続されている場合であり、各ソケットは、大きなJSONファイルを送信しています。

同じボックスで実行されている2つのプロセス間でデータを渡す必要があるため、ポートを使用しない方が望ましいからです。したがって、ネットソケットを使用します。したがって、2つの質問があります:まず、2つのNode.jsプロセス間で大きなJSONデータをすばやく渡すためのより良い方法がありますか?次に、これが最善の方法であれば、シリアル化されたJSONが送信されたときに分割されているケースをどうすれば処理できますか?

+0

好奇心が...あなたはソケット接続とHTTPのどちらかでこれをしたいですか? –

+0

は、1つのソケットファイルブロードキャスターを持っています。データを取得して(例えばデータベースに送る、ブラウザーでグラフを送るなど)、データを取得する多くの「リスナー」を作成できます。 1つのNode.jsプロセスからより多くのNode.jsプロセスにデータをより確実に送信する方法はすべて公開されています。応答のために –

答えて

4
  1. try ... catchを使用して、有効なjsonであるかどうかを確認できます。しかし、それほど良いパフォーマンスはありません。
  2. 送信側のjsonのサイズを計算し、JSONの前に送信することができます。
  3. JSONにはない境界文字列を追加できます。あなたの\ u0000 - はい、正当な方法と思われます。しかし、最も一般的な選択は改行です。

  4. dnodeのような外部ライブラリを使うことができます。すでにdnodeを使っています。私はそれを試みることをお勧めしたい。本当に。このモデルの失敗の

つの受信機が複数のソケットに接続されている場合であり、各ソケットは、大きなJSONファイルを送信しています。

ソケットごとに異なるバッファを使用してください。ここでは問題ありません。

+0

ありがとう。 dnodeについて聞いたことはありません。 –

1

各ソケットを個別に識別し、それぞれのバッファを構築することは可能です。私は接続を受け取ったときに各ソケットにIDを追加し、データを受け取ったときにそのデータをバッファに追加します。

net.createServer(function(socket) { 
    // There are many ways to assign an id, this is just an example. 
    socket.id = Math.random() * 1000; 
    socket.on('data', function(data) { 
    // 'this' refers to the socket calling this callback. 
    buffers[this.id] += data; 
    }); 
}); 

あなたはバッファが使用する準備ができていることを教えてくれますその「キー」区切り文字を受け取ったかどうかをチェックすることができますたびに。

関連する問題