私はちょうど RPC (リモート プロシージャ コール) について触れました。これは、リモート マシン上のプログラムをローカルで呼び出すことができる方法であり、RPC の原理を学ぶのに非常に適した単純な Nodejs 実装を見ました。 🎜>nodejs light_rpc
使用例:
1. サーバーはプログラムを開始し、ポートをリッスンし、クライアントによって呼び出される関数 (上記の例では結合や乗算など) を実装し、それらをオブジェクトに保存します。
2. クライアントはプログラムを開始し、サーバーに接続し、接続の完了後に description コマンドを送信して、呼び出しに提供できる関数名を返すようにサーバーに要求します。
4. クライアントは、サーバーから送信された関数名を受信し、それを独自のオブジェクトに登録し、各関数名のメソッドをラップします。これにより、これらの関数をローカルで呼び出すときに、実際にサーバーにリクエストが送信されます。
1) callbackId という着信コールバック関数の一意の ID を生成し、クライアントのオブジェクトに記録します。
2) 次のデータをパッケージ化してサーバーに送信します: 呼び出し関数名、JSON シリアル化パラメーター リスト、callbackId
8. クライアントは関数の演算結果と callbackId を受け取り、callbackId に基づいてコールバック関数を取り出し、演算結果をコールバック関数に渡して実行します。
9. プロセス全体が完了しました。詳細についてはソース コードを参照してください: https://github.com/romulka/nodejs-light_rpc
いくつかの注意点:
1. クライアントとサーバーは処理中ずっと接続されたままになります。HTTP プロトコルとは異なり、送信と受信後に接続が切断されるため、接続の切断によってデータ送信の完了を判断することはできません。データ受信の完了を判断するために、クライアントとサーバーによって送信されるデータは、データ パケットの長さとデータの前にデリミタを追加するという単純なプロトコルに従います。たとえば、デリミタは n: [パケット長です。 データ]を選択することで、データを受信後、まずデータパケットの長さを取り出し、累積して受信したデータパケットがその長さ以上であるかどうかを継続的に判定し、それ以上であれば、1回のデータ送信が完了することができます。データの解析と抽出を開始します。
2. この RPC は、パラメーター内の関数の型を考慮しないため、単純です。たとえば、パラメーターがオブジェクトであり、このオブジェクトの下に関数メンバーがある場合、その関数は JSON シリアル化中に無視されます。のサーバー側では関数を実行できません。
この問題を解決するには、複雑な処理が必要です:
1. リモート エンドに送信される各パラメーターを詳細に調べ、関数メンバーを抽出し、この関数の一意の ID を生成し、それをローカル オブジェクトに配置し、この関数メンバーをこの ID 文字列で置き換えて識別します。 member は実際には関数です。このようにして、オブジェクトをシリアル化して送信できます。
2. サーバーは、パラメーター オブジェクト内の関数を使用する場合、これがクライアントによって処理され、ID を持つ関数であると判断し、その ID をクライアントに送り返します。同じメソッドで独自のコールバック関数を設定し、クライアントに ID を渡し、クライアントからのコールバックを待ちます。
3. クライアントは関数 ID を受け取り、関数エンティティを見つけて呼び出し、完了後にサーバーから指定されたコールバック ID に従ってサーバーに送り返します
4. サーバーは結果を受信し、コールバック関数を見つけて実行を継続し、完了します。
関数の記録方法は、他の方法でも完了できます。一般的な考え方は、関数をシリアル化できるものに置き換え、リモート側で呼び出されたときに関数をローカルで見つけられるようにすることです。 dnode の実装を参照できます。