国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 幫助中心 > 正文

node.js中RPC(遠程過程調用)的實現原理介紹

2024-07-09 22:43:03
字體:
來源:轉載
供稿:網友

剛接觸到RPC(遠程過程調用),就是可以在本地調用遠程機子上的程序的方法,看到一個簡單的nodejs實現,用來學習RPC的原理很不錯:nodejs light_rpc

使用示例:

復制代碼 代碼如下:
//服務端
var light_rpc = require('./index.js');
var port = 5556;
var rpc = new light_rpc({
    combine: function(a, b, callback){
        callback(a + b);
    },
    multiply: function(t, cb){
        cb(t*2);
    }
}).listen(port);

Sample client:

復制代碼 代碼如下:
//客戶端
rpc.connect(5556, 'localhost', function(remote, conn){
    remote.combine(1, 2, function(res){
        if(res != 3){
            console.log('ERROR', res);
        }
    });
});

簡單說說整個過程:

1.server端啟動程序,偵聽端口,實現提供給client調用的函數(如上述例子的combine和multiply),保存在一個對象里。
2.client端啟動程序,連接服務端,連接完成后發送describe命令,要求server返回它能提供調用的函數名。

復制代碼 代碼如下:
connection.on('connect', function(){
  connection.write(command(descrCmd));
});

3.server端接收到describe命令,把自己可供調用的函數名包裝好發送出去(“combine”, “multiply”)
4.client端接收到server發送的函數名,注冊到自己的對象里,給每個函數名包裝一個方法,使本地調用這些函數時實際上是向server端發送請求:

復制代碼 代碼如下:
for(var p in cmd.data){
  remoteObj[p] = getRemoteCallFunction(p, self.callbacks, connection);
  //getRemoteCallFunction的實現見下面
}

5.client端調用server端的函數:

1) 給傳入的callback函數生成一個唯一ID,稱為callbackId,記錄到client的一個對象里。
2) 包裝好以下數據發送給server端:調用函數名,JSON序列化后的參數列表,callbackId

復制代碼 代碼如下:
function getRemoteCallFunction(cmdName, callbacks, connection){
  return function(){
    var id = uuid.generate();
    if(typeof arguments[arguments.length-1] == 'function'){
      callbacks[id] = arguments[arguments.length-1];
    }
    var args = parseArgumentsToArray.call(this, arguments);
    var newCmd = command(cmdName, {id: id, args: args});
    connection.write(newCmd);
  }
}

6.server端接收到上述信息,解析數據,對參數列表反序列化,根據函數名和參數調用函數。

復制代碼 代碼如下:
var args = cmd.data.args;
args.push(getSendCommandBackFunction(c, cmd.data.id));
self.wrapper[cmd.command].apply({}, args);

7.函數運行完成后,把結果序列化,連同之前收到的callbackId發送回client端

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河津市| 安庆市| 滨海县| 平湖市| 福鼎市| 抚顺市| 华亭县| 融水| 富阳市| 化州市| 泽普县| 原平市| 东乡族自治县| 那曲县| 昭平县| 乐清市| 克什克腾旗| 铁岭市| 永寿县| 美姑县| 浏阳市| 进贤县| 凤冈县| 孟连| 泗阳县| 临澧县| 来宾市| 江安县| 和龙市| 德兴市| 达日县| 田阳县| 石城县| 房山区| 德钦县| 静安区| 甘谷县| 姚安县| 清河县| 白城市| 宝清县|