3.6.4 其他网络应用编程技术
套接字是最早解决了网络间进程通信的编程接口,随着网间通信需求越来越高,网络编程技术发展得很快,出现了多种网络应用编程技术,本节介绍常见的几种网络编程技术。
1.RPC
远程过程调用(RPC,Remote Procedure Call)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
平时在编制程序中所说的“调用”往往发生在同一个进程内,常见的情况是程序中某处“调用”了一个函数(或者称为过程),例如,在进程H1-P1中,函数A调用了函数B,函数B又调用了函数C,如图3-32所示。而在RPC中,调用者和被调用者不在一台主机中,而是分散在两台不同的主机中。但是对于调用者来说,它并不关心被调用的过程是否和它在一个进程里,甚至不关心是否在一台主机上,在它看来,被调用的过程就“好像”和它在同一个进程里一样。调用过程如图3-33所示。
图3-32 进程内调用
图3-33 RPC
很显然,要使调用者调用一个处于不同主机上的过程,必然要涉及网络协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC信息协议由两个不同结构组成:调用信息和答复信息。
RPC调用信息:每条远程过程调用信息包括以下字段,以独立识别远程过程。
2.RMI
远程方法调用(RMI,Remote Method Invocation)是Java 2的标准版本J2SE(Java 2 Standard Edition)中的一部分。程序员可以基于RMI开发出Java环境下的分布式应用。它允许在Java中调用一个远程对象的方法就像调用本地对象的方法一样,使分布在不同的JVM(Java Virtual Machine)中的对象的外表和行为都像本地对象一样。
RMI也可以看作RPC的Java版本,但由于它是Java的一部分,因此具备跨平台、面向对象等Java所独有的特点。
它的原理如图3-34所示。
在RMI中有两个概念:桩(Stub)和框架(Skeleton),它们是理解RMI工作原理的关键。
客户端的对象A想要调用某个远程对象D的方法,但是它不能直接找到D,于是委托代理B,代理B也不能找到D,但是它能找到D的代理C,于是B和C建立了联系,分别代理A和D,从而为A和D建立了联系。这里的B和C就是Stub和Skeleton。但是B是如何找到C的呢?这就需要D建立的时候,在服务器上先进行注册,而代理B(Stub)到服务器上找到D的注册信息,从而能跟D的代理C联系上。这个注册的过程在RMI中使用Rmi registry实现。
图3-34 RMI原理图
完成这一系列的动作后,A需要调用D的方法时,只需要跟B打交道,对于它来说,就像是在调用一个本地方法一样,并不关心这个方法的实现实际上位于另一台主机上。
从上面的过程可以看出,一个完整的RMI系统包括以下几个部分:
·远程服务的接口定义;
·远程服务接口的具体实现;
·Stub和Skeleton文件;
·一个运行远程服务的服务器;
·一个RMI命名服务,它允许客户端去发现这个远程服务;
·类文件的提供者(一个HTTP或者FTP服务器);
·一个需要这个远程服务的客户端程序。
RMI的开发包括以下几个步骤:
·生成一个远程接口;
·实现远程对象(服务器端程序);
·生成Stub模块和Skeleton模块;
·编写服务器程序;
·编写客户程序;
·注册远程对象;
·启动远程对象。
3.CORBA
公共对象请求代理体系结构(CORBA,Common Object Request Broker Architecture)是由对象管理组织(OMG,Object Management Group)制定的一种标准的面向对象应用程序体系规范,是为了满足在分布式处理环境中异质的软件系统之间协同工作的需求而提出的一种解决方案。
CORBA定义了接口定义语言(IDL,Interface Definition Language)和应用程序编程接口(API,Application Programming Interface),通过对象请求代理(ORB,Object Request Broker)使得运行在不同操作系统上的用不同语言编写的应用程序能够互相操作。
ORB是CORBA的核心,它是一个中间件,在对象间建立客户机/服务器的关系。通过ORB,一个客户机可以很简单地使用服务器对象的方法而不论服务器是在同一台机器上还是通过一个网络访问。ORB截获客户机的调用请求然后负责找到一个服务器对象来实现这个请求。客户机不用知道服务器对象的位置、使用的编程语言、操作系统等。
图3-35 CORBA的体系结构
IDL定义了客户端和服务器端之间的接口,通过这个接口,客户端可以获知服务器对象所能提供的方法。这种定义不是针对某种特定的编程语言,客户端和服务器端程序需要对接口使用各自的编程语言加以实现。例如,客户端使用C++,而服务器端使用Java。
CORBA的体系结构如图3-35所示。