4

Node.jsのTCPソケットを利用してLuaプログラムと通信しようとしています。私が頭を悩ませようとしている2つの問題があります。まず、バッファリングします。

バッファー私が理解しているように、データがソケットからコードに提供される場合、それはこれまでに受信されたデータ(パケットではなくストリーム)になります。そのため、受信したデータを読み取ると、送信されたデータとは異なる場合があります。

つまり、受け取ったデータ{学校:["長い

送信されたデータとの比較{学校:[{"Longwood"、"Hillbrow"}]}

これを回避する方法は、データを「バッファ」に入れ、その情報の終わりを表示するために使用する方法でデータを分割することです。通常、改行のように見えます。

ここでの私の質問:

  1. バッファ内に2つ以上の完全なデータセクションが含まれることになりますか?これをどのように処理しますか?forループ?
  2. 同じ問題が、ソケットを離れるデータにも存在するようです。ただし、他のコード例では、ソケットに書き込む前にNode.jsバッファーを使用していることに気づきました。なぜこれが受信データに使用されないのですか?
  3. 残すために処理できるよりも多くのデータが書き込まれる場合、Nodeはこれを処理しますか、それともメソッドを考え出す必要がありますか。

最後に、私はデータ側を誤解しているようです。送受信されたすべてのデータをバイナリに変換して戻す必要がありますか?JSONデータのみを送受信したい。そこに私の混乱があると思います。例えば:

var myQuestion = "Is this acceptable and will I encounter any issues?
socket.write(myQuestion);

お時間をいただき、ありがとうございました。

4

2 に答える 2

5
  1. はい、間違いなくデータのいくつかのセクションになってしまう可能性があります。それはあなたがどちらかの端に書くコードに完全に依存します。
  2. 私はあなたが「書く前にバッファを使う」という意味に完全には従いません。バッファは単なるバイナリデータであり、着信データと発信データの両方に使用されます。ノードは通常、送信用の文字列も受け入れ、エンコードが指定されていない場合はUTF8であると見なします。を呼び出すと、受信時に文字列を取得することもできますsetEncoding
  3. OSにはTCPソケット上の着信データ用のバッファがあり、バッファがいっぱいになると(ノードによって空になるのが遅すぎる)、スペースができるまでパケットの受け入れを停止します。

まず、Bufferバイナリです。バッファは単にバイトの配列であり、それ以上のものではありません。バッファは文字列から作成でき、ノードはこれを自動的に行う場合があります。あなたの場合、私はあなたが電話することをお勧めしますsocket.setEncoding('utf8')。これにより、受信データが自動的に文字列に変換され、解析が簡素化されます。

データの処理と分割に関しては、それはあなた次第です。TCPは、送信されたのと同じ順序で到着するバイトのストリームのみを提供します。あなたが言ったように、あなたはバイトを集めることができます、そして改行が受け取られるとき、あなたはそれ以前のすべてを取り、それをJSONとして解析します。これは正常に機能するはずです。JSON内にポップアップしない任意の文字を使用できます。JSONシリアル化を実行するプログラムが改行を追加しない限り、設定されます。'data'が出力されると、文字列の改行を確認できます。そうでない場合は、以前に受信したデータに追加し、見つかった場合は分割して、既存のデータを追加します。

于 2012-12-30T20:20:05.760 に答える
1

バッファは、送受信される情報に使用されます。お気づきのように、受信したデータは断片化される可能性があります。このデータを正しい部分に戻すのは、常にコード次第です。

バッファで2つのチャンクのデータを受信することは完全に可能です。通常、ある種の区切り文字(前述のような改行など)があります。私がしていることはこれです:

  1. データが入ってくると、それを受信したデータバッファの最後に連結します。
  2. このバッファから読み取り、論理パケット区切り文字を分割する関数があります
  3. その論理パケットを検証します。
  4. そのパケットが有効で完全な場合は、完全な情報が受信されたというイベントをコードの上位レベルの部分に発生させます。JSONをすべて通常のオブジェクトに解析してこのイベントを発生させます。
于 2012-12-30T20:19:20.503 に答える