剛接觸到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端
function getSendCommandBackFunction(connection, cmdId){
return function(){
var innerArgs = parseArgumentsToArray.call({}, arguments);
var resultCommand = command(resultCmd, {id: cmdId, args: innerArgs});
connection.write(resultCommand);
};
}
8.client端接收到函數運行結果和callbackId,根據callbackId取出回呼函數,把運行結果傳入回調函數中執行。
9.整個過程完成,詳見原始碼:https://github.com/romulka/nodejs-light_rpc
幾個注意的點:
1.整個過程中client和server一直保持連接,不像http協議發送和接收完就斷開鏈接,所以不能以斷開鏈接判斷一次數據的傳送完成。為了判斷資料接收完成,client和server傳送的資料遵循一個簡單的協定:在資料前加上資料包的長度和分隔符,如定分隔符為n:[資料包長度 資料],這樣在收到資料後先取出資料包的長度,再不斷判斷累計已接收到的資料包是否等於或超過這個長度,若是則一次資料傳送完成,可以開始解析擷取資料。
2.這個RPC簡單在於沒有考慮參數裡有函數類型的情況,例如有參數是一個object,這個object下有函數成員,JSON序列化時會把函數忽略,在server端是執行不了這個函數的。
為了解決這個問題,需要進行複雜的處理:
1.深度遍歷每個要發送給遠端的參數,把函數成員抽出來,給這個函數生成唯一id,放到本地一個物件裡,把這個函數成員替換成這個id字串,並標識這個成員其實是一個函數。這樣這個物件就可以序列化送出去了。
2.server接收到調用,當要使用參數object裡的函數時,判斷到這是一個經過client處理過的函數,有一個id,把這個id發送回client端,並用同樣的方法把自身的回調函數id傳給client,等待client端的回呼。
3.client端接收到這個函式id,找到這個函式實體,調用,完成後根據server端給的回呼id傳回給server端
4.server端收到結果,找到回呼函數,繼續執行,完成。
函數的記錄方法可以用其他方式完成,大體思路就是把函數替換成可序列化的東西,記錄函數以便remote端調用時能在本地找到這個函數。可以參考dnode的實作。

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版