《846-第四讲远程过程调用.ppt》由会员分享,可在线阅读,更多相关《846-第四讲远程过程调用.ppt(24页珍藏版)》请在三一文库上搜索。
1、第 四 讲 远程过程调用,1、动因与实例 2、工作原理 3、编排/还原 4、请求分派,内 容,1、动因与实例,开发基于SOCKET的网络软件非常复杂 FTP TELNET 位于不同机器上的软件互操作困难 连接管理 异构 导致RPC(Remote Procedure Calling )的产生 主要实例: SUN公司等提出的ONC(Open Network Computing)RPC 主要由SUN予以实现 OSF(Open Software Foundation)RPC影响最大 主要由DCE(Distributed Computing Environment)实现 DCE是OSF提出的分布计算体系
2、结构,2、 工作原理,Deposit(,1000,),继续运行,启动服务器上的存款过程,int Deposit(number),return total + number;,客户端程序,服务器端程序,以对某银行帐户的一个存款过程为例:,Network,Local Call,send,receive,send,receive,( 1)调用过程,客户端程序,服务器端程序,1、客户按本地调用的方式 直接调用本地的客户指代 客户指代具有与服务器相同的过程接口 2、客户指代 将客户的调用请求进行加工、打包 向底层通信机制(如套接字)发出请求消息 客户指代 不进行任何逻辑处理 只是一个中介 3、客户端通过
3、底层的通信机制 将消息传送给服务器端的底层通信机制,过程描述:,4、服务器 需要部分地解析消息 找出客户希望调用的服务器程序 5、服务器指代对消息进行解析 从中获得调用者的参数 然后调用服务器程序 6、服务器程序执行相应的过程 7、服务器程序将结果返回给服务器指代 8、服务器指代将结果打包 向底层通信机制发出应答消息 9、服务器端通信机制将消息传送给客户端通信机制,10、客户端节点上也可能有多个调出点 通信机制需要部分地解析返回的消息 找出消息应该返回给哪个客户程序 并将消息发送给对应的客户指代 11、客户指代从消息中解析结果 返回给客户程序,(2)编排/还原,指代(Stub)的主要工作包括:
4、 (1)建立客户与服务器之间的连接 (2)将客户的高层调用语句打包为一条底层的请求消息 这一过程在RPC中被称为编排(marshal) (3)等待服务器返回应答消息 (4)将来自服务器底层的应答消息解析为可以返回的数据 这一过程在RPC中被称为还原(unmarshal) (5)将返回值传送给客户程序 需要特别处理: 编码、字节序 等问题,(3) 请求分派,服务器端的指代: 除了需要进行编排、还原外 还需要 区分客户所请求的过程名 然后将客户的请求分派(dispatch)给正确的过程 “指代” 目前主要被用于专门代表客户端的代理程序 而服务器端则由新的机制予以支持 在CORBA中专门分离出了对象
5、适配器(OA:Object Adaptor) 在EJB中发展出了构件容器 用于在运行过程中专门管理构件的各种状态 此时的服务器端不仅负责请求分派 还负责向底层机制的注册(以方便请求的定位) 以及过程的激活(以加强系统的灵活性) 等等功能,三、基于RPC的开发过程,1、定义并编译接口 2、编写实现具体服务功能的代码 3、编译、连接,产生可执行的服务器程序 4、编写客户端代码 5、编译、连接,产生客户程序 6、运行服务器端程序 7、运行客户端程序,客户端开发过程,服务器端开发过程,服务器端程序,IDL编译器 (rpcgen),客户端程序,IDL,account.h,account_clnt.c,a
6、ccount _svc.c,server.c,client.c,rpclib.o,1、定义并编译接口,仍然结合银行帐号的例子 接口定义文件account.x :,program ACCOUNT version ACCOUNT_VER int deposit(int) = 2; int withdraw(int) = 1; =1; =0x20010929;,编译后生成三个主要文件: account.h account_clnt.c account_svc.c,extern “C“ #define ACCOUNT 0x20010929 #define ACCOUNT_VER 1 #define d
7、eposit 2 extern int * deposit_1(int *, CLIENT *); extern int * deposit_1_svc(int *, struct svc_req *); #define withdraw 1 extern int * withdraw_1(int *, CLIENT *); extern int * withdraw_1_svc(int *, struct svc_req *); extern int account_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t); ,account.h,accoun
8、t_clnt.c,static struct timeval TIMEOUT = 25, 0 ; int * deposit_1(int *argp, CLIENT *clnt) static int clnt_res; memset(char *) ,int main (int argc, char *argv) register SVCXPRT *transp; pmap_unset (ACCOUNT, ACCOUNT_VER); transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp = NULL) fprintf (stderr, “
9、%s“, “cannot create tcp service.“); exit(1); if (!svc_register(transp, ACCOUNT, ACCOUNT_VER, account_1, IPPROTO_TCP) fprintf (stderr, “%s“, “unable to register (ACCOUNT, ACCOUNT_VER, tcp).“); exit(1); svc_run (); fprintf (stderr, “%s“, “svc_run returned“); exit (1); ,account_svc.c,static void accoun
10、t_1(struct svc_req *rqstp, register SVCXPRT *transp) union int deposit_1_arg; int withdraw_1_arg; argument; char *result; xdrproc_t _xdr_argument, _xdr_result; char *(*local)(char *, struct svc_req *); switch (rqstp-rq_proc) case NULLPROC: (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)
11、NULL); return; case deposit: _xdr_argument = (xdrproc_t) xdr_int; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *) deposit_1_svc; break; case withdraw: _xdr_argument = (xdrproc_t) xdr_int; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)
12、withdraw_1_svc; break;,default: svcerr_noproc (transp); return; memset (char *) ,2、编写实现具体服务功能的代码,#include “account.h“ int total= 10000; int * deposit_1_svc(int *argp, struct svc_req *rqstp) static int result; total= total + argp; result = total; printf(“new total =%s”, total); return ,server.c,3、编译、
13、连接,产生可执行的服务器程序,cc o server server.c account_svc.c account.h,4、编写客户端代码,#include “account.h“ void account_1(char *host) CLIENT *clnt; int *result_1; int deposit_1_arg=1000; int *result_2; int withdraw_1_arg=2000; clnt = clnt_create (host, ACCOUNT, ACCOUNT_VER, “tcp“); result_1 = deposit_1( ,client.c,5、编译、连接,产生客户程序,cc o client client.c account_clnt.c account.h,6、运行服务器端程序 7、运行客户端程序 服务器端应当显示: new total = 11000 new total = 9000 客户端应当显示: result = 11000 result = 9000,思 考 题,消息传递、互操作、协同工作之间的关系是什么? RPC是如何工作的? 不同互操作体系的异同点是什么?,
链接地址:https://www.31doc.com/p-3024787.html