Java之RMI设计模式基本原理与示例

1. Name

RMI是Romote Method Invocation的缩写,就是远程方法调用。


2. Intent

具体的说,就是能够通过这种机制,实现在一个JVM上调用另一个JVM上的Java对象的方法。


3. Structure

(1)RMI Interface and Class

第一步:继承了Remote的interface

定义一个继承了Remote的interface,命名为TestRMIService。在其中有我们期望在Client端调用的方法testHello(),注意要抛出RemoteException。


第二步:继承了UnicastRemoteObject且实现了TestRMIService的class

定义一个继承了UnicastRemoteObject且实现了TestRMIService的class,命名为TestRMIServiceImpl。在其中实现testHello方法。


(2)RMI Server

第一步:

定义一个class,命名为TestServer,其中有main方法。在main方法中实例化TestRMIService一个远程对象,命名为testRMI。


第二步:

创建一个Registry,并向远程对象testRMI注册,注册名为“rmi://locahost:1234/testrmi”。


(3)RMI Client

第一步:

定义一个class,命名为TestClient,其中有main方法。查询注册


第二步:

查询注册名为“rmi://locahost:1234/testrmi”的TestRMIService远程对象,查询结果为testRMI。


第三步:

调用远程对象testRMI的方法testHello。


4. Sample Code

(1)TestRMIService

package com.sinosuperman.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface TestRMIService extends Remote {
	public String testHello() throws RemoteException;
}

(2)TestRMIServiceImpl

package com.sinosuperman.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class TestRMIServiceImpl extends UnicastRemoteObject implements TestRMIService {

	private static final long serialVersionUID = -9039976499370682232L;
	
	public TestRMIServiceImpl() throws RemoteException {
	}

	@Override
	public String testHello() throws RemoteException {
		return "I'm RMI, Hello World!";
	}
}

(3)TestServer

package com.sinosuperman.server;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import com.sinosuperman.rmi.TestRMIService;
import com.sinosuperman.rmi.TestRMIServiceImpl;

public class TestServer {
	
	public static void main(String[] args) {
		
		try {
			/* Create a Remote object. */
			TestRMIService testRMI = new TestRMIServiceImpl();
			
			/* Create a registry object with 1234 port. */
			LocateRegistry.createRegistry(1234);
			
			/* Register the Remote object to RMI registry server, and name it as testrmi. */
			Naming.bind("rmi://localhost:1234/testrmi", testRMI);
			
			System.out.println("注册远程对象成功");
			
		} catch (RemoteException e) {
			System.out.println("远程对象创建异常");
			e.printStackTrace();
		} catch (MalformedURLException e) {
			System.out.println("URL畸形异常");
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			System.out.println("重复绑定异常");
			e.printStackTrace();
		}
	}
}

(4)TestClient

package com.sinosuperman.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class TestRMIClient {
	public static void main(String[] args) {
		try {
			TestRMIService testService = (TestRMIService) Naming.lookup("rmi://localhost:1234/testrmi");
			System.out.println(testService.testHello());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
	}
}

5. Test

(1)运行TestServer

在Eclipse主界面的Package Explorer中你所创建的测试RMI的工程中的com.sinosuperman包中,右击TestServer,选择Run As,选择Java Application。

这时界面上会显示:

“注册远程对象成功”


(2)运行TestClient

在Eclipse主界面的Package Explorer中你所创建的测试RMI的工程中的com.sinosuperman.rmi包中,右击TestClient,选择Run As,选择Java Application。

这时界面上会显示:

“I'm RMI, Hello World!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值