https://github.com/romulka/nodejs-light_rpc
几个注意的点:
1.整个过程中client和server一直保持连接,不像http协议发送和接收完就断开链接,所以不能以断开链接判断一次数据的传送完成。为了判断数据接收完成,client和server发送的数据遵循一个简单的协议:在数据前加上数据包的长度和分隔符,如定分隔符为\n:[数据包长度\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的实现。相关阅读:
Android实现的状态栏定制和修改方法
MySQL慢查询查找和调优测试
jQuery Ajax方式上传文件的方法
C#线程队列用法实例分析
smarty获得当前url的方法分享
详解HTML5中ol标签的用法
Win10正式版KB3140741更新已推送:提升了稳定性
在CentOS系统上简单安装配置XRDP服务器
C#线程执行超时处理与并发线程数控制实例
深入解析C++编程中范围解析运算符的作用及使用
JavaScript实现搜索框的自动完成功能(一)
php修改文件上传限制方法汇总
Win7系统传真扫描功能不能正常使用的解决方法
MySql安装与配置方法(MySQL添加用户、删除用户与授权)