您的位置:首页 > 编程语言 > Java开发

Java远程方法调用,RMI入门教程

2016-03-29 18:17 609 查看


、什么是RMI

Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。

接口的两种常见实现方式是:最初使用JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现;此外还可以用与CORBA兼容的方法实现。RMI一般指的是编程接口,也有时候同时包括JRMP和API(应用程序编程接口),而RMI-IIOP则一般指RMI接口接管绝大部分的功能,以支持CORBA的实现。

最初的RMI API设计为通用地支持不同形式的接口实现。后来,CORBA增加了传值(pass by value)功能,以实现RMI接口。然而RMI-IIOP和JRMP实现的接口并不完全一致。


二、基本原理

要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面上来看,网络通信需要做的就是将流从一台计算机传输到另一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有HTTP、TCP、UDP等等,HTTP、TCP、UDP都是基于sokect概念上为某种应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都是基于这个原理而实现的,只是为了应用的易用,各种语言通常都会提供一些更为贴切应用易用的应用层协议。


三、开发步骤

1、创建远程接口(须继承 java.rmi.Remote接口);

2、实现远程接口(须继承 java.rmi.server.UnicastRemoteObject类);

3、生成Stub和Skeleton;

4、启动RMI注册服务;

5、启动远程服务;

6、客户端查找远程对象,并调用远程方法;


四、实例代码清单

1、创建远程接口,继承java.rmi.Remote接口

view
sourceprint?

01.
1
package
com.cnblogs.javalouvre.service;


02.
2


03.
3
import
java.rmi.RemoteException;


04.
4


05.
5
public
interface
GreetService
extends
java.rmi.Remote
{


06.
6


07.
7
String
sayHello(String name)
throws
RemoteException;


08.
8


09.
9
}


2、实现远程接口,继承 java.rmi.server.UnicastRemoteObject类

view
sourceprint?

01.
1
package
com.cnblogs.javalouvre.service;


02.
2


03.
3
import
java.rmi.RemoteException;


04.
4


05.
5
public
class
GreetServiceImpl
extends
java.rmi.server.UnicastRemoteObject
implements
GreetService
{


06.
6


07.
7
private
static
final
long
serialVersionUID
= 3434060152387200042L;


08.
8


09.
9
public
GreetServiceImpl()
throws
RemoteException
{


10.
10
super
();


11.
11
}


12.
12


13.
13
@Override


14.
14
public
String
sayHello(String name)
throws
RemoteException
{


15.
15
return
"Hello
"
+
name;


16.
16
}


17.
17


18.
18
}


3、生成Stub和Skeleton;

要生成Stub和Skeleton,首先需要编译上述源文件得到类文件,然后执行rmic命令,具体如下

view
sourceprint?

1.
[root
@oracle
~]#javac
-source
1.6
-target
1.6
-d
. *.java


2.
[root
@oracle
~]#rmic
com.cnblogs.javalouvre.service.GreetServiceImpl


4、注册服务

注册服务执行rmiregistry命令,如下

view
sourceprint?

1.
[root
@oracle
~]#rmiregistry


5、启动服务

view
sourceprint?

01.
1
package
com.cnblogs.javalouvre.server;


02.
2


03.
3
import
java.net.MalformedURLException;


04.
4
import
java.rmi.AlreadyBoundException;


05.
5
import
java.rmi.Naming;


06.
6
import
java.rmi.RemoteException;


07.
7
import
java.rmi.registry.LocateRegistry;


08.
8


09.
9
import
com.cnblogs.javalouvre.service.GreetServiceImpl;


10.
10


11.
11
public
class
Server
{


12.
12


13.
13
public
static
void
main(String[]
args) {


14.
14
try
{


15.
15
LocateRegistry.createRegistry(
1098
);


16.
16
Naming.bind(
"rmi://10.108.1.138:1098/GreetService"
,
new
GreetServiceImpl());


17.
17
}
catch
(RemoteException
e) {


18.
18
e.printStackTrace();


19.
19
}
catch
(MalformedURLException
e) {


20.
20
e.printStackTrace();


21.
21
}
catch
(AlreadyBoundException
e) {


22.
22
e.printStackTrace();


23.
23
}


24.
24
}


25.
25


26.
26
}


编译、启动服务

view
sourceprint?

1.
[root
@oracle
~]#javac
-source
1.6
-target
1.6
-d
. Server.java


2.
[root
@oracle
~]#java
-server com.cnblogs.javalouvre.server.Server


6、客户端调用

view
sourceprint?

01.
1
package
com.cnblogs.javalouvre.client;


02.
2


03.
3
import
java.net.MalformedURLException;


04.
4
import
java.rmi.Naming;


05.
5
import
java.rmi.NotBoundException;


06.
6
import
java.rmi.RemoteException;


07.
7


08.
8
import
com.cnblogs.javalouvre.service.GreetService;


09.
9


10.
10
public
class
Client
{


11.
11


12.
12
public
static
void
main(String[]
args) {


13.
13
try
{


14.
14
GreetService
greetService = (GreetService) Naming.lookup(
"rmi://10.108.1.138:1098/GreetService"
);


15.
15
System.out.println(greetService.sayHello(
"Jobs"
));


16.
16
}
catch
(MalformedURLException
e) {


17.
17
e.printStackTrace();


18.
18
}
catch
(RemoteException
e) {


19.
19
e.printStackTrace();


20.
20
}
catch
(NotBoundException
e) {


21.
21
e.printStackTrace();


22.
22
}


23.
23
}


24.
24


25.
25
}


编译,执行

view
sourceprint?

1.
[root
@oracle
~]#javac
-source
1.6
-target
1.6
-d
. Client.java


2.
[root
@oracle
~]#java
-client com.cnblogs.javalouvre.client.Client


3.
[root
@oracle
~]#Hello
Jobs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: