2017-01-14 2 views
1

私はソケットプロトコルを実装しようとしていますが、どのように進めるのかは不明です。ソケットをStreamオブジェクトとして持っていて、ソケットに送信するためのデータを書き込むことができます。データを受け取るために「読み取り可能な」イベントまたは「データ」イベントを使用できることがわかりました。しかし、プロトコルが、あるホストがデータを送信し、応答を待ってから、応答後に再びデータを送信することになっている会話がプロトコルに含まれている場合、これはうまく機能しません。それは次のようになり、ブロックパラダイムでソケットストリーム会話のnode.jsパラダイムとは何ですか?

send some data 
wait for specific data reply 
massage data and send it back 
send additional data 

私の知る限り、ノードのStreamオブジェクトは、非同期的に要求されたバイト数を返します。読み取り機能を持っていません。さもなければ、各待ちは残りの機能性をそれ自身のコールバックに入れることができます。

このタイプの通信のためのnode.jsパラダイムとは何ですか?

答えて

0

技術的にはReadable.read()がありますが、推奨されていません(サイズやブロックについてはわからないかもしれません)。状態を追跡し、各データイベントにバッファーは徐々に処理を続けます。バッファー上のreadUInt32LEなどを使用して、必要な場合はバイナリー・データの特定の部分を読み取ることができます(または、テキスト・データの場合は文字列に変換できます)。あなたのwaitForSpecialReplyの約束は、特定のメッセージの後に保存され、解決されhttps://github.com/runvnc/metastream/blob/master/index.js

あなたはあなたの「ブロックパラダイム」でそれを書きたい場合は、基本的にはいくつかの約束または非同期機能させることができ、その後

let specialReplyRes = null; 

waitForSpecialReply = f => new Promise(res => specialReplyRes = res); 

stream.on('data', (buff) => { 
    if (buff.toString().indexOf('special')>=0) specialReplyRes(buff.toString()); 
}); 

// ... 

async function proto() { 
    stream.write(data); 
    let reply = await waitForSpecialReply(); 
    const message = massage(reply); 
    stream.write(message); 
} 

あなたの解析を通して受け取られます。

+0

私は約束を抱いていませんでした...国家ベースのアプローチに関しては、サーバー側でこれをやっています。私がする必要があるのはリクエストを出して回答を送ることです。クライアント側では、送信、受信、送信、および受信が必要なので、もう少し複雑です。送信と受信を何らかの形で同期させる必要があります。 – Michael

関連する問題