Java RMI远程方法调用

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

1、接口定义

package com.lxp.rmi;

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

public interface IHello extends Remote{
	public String HelloWorld() throws RemoteException;
	public String sayHelloToSomeBody(String name) throws RemoteException;
}
2、接口实现

package com.lxp.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
//必须继承UnicastRemoteObject
public class HelloImpl extends UnicastRemoteObject implements IHello{
	@Override
	public String HelloWorld() throws RemoteException {
		return "Hello World!";
	}

	@Override
	public String sayHelloToSomeBody(String name) throws RemoteException {
		return "你好"+name;
	}

	public HelloImpl() throws RemoteException {}
	
}
3、服务器端实现

package com.lxp.rmi;

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

public class HelloServer {
	public static void main(String[] args) {
		try {
			 //创建一个远程对象 
			IHello rhello = new HelloImpl();
			 //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 
			LocateRegistry.createRegistry(8889);
			//把远程对象注册到RMI注册服务器上,并命名为RHello 
            //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
			Naming.bind("rmi://localhost:8889/RHello", rhello);
//			Naming.bind("//localhost:8888/RHello", rhello);
			System.out.println(">>>>>>>Info:远程IHello对象绑定成功!");
		} catch(RemoteException e) {
			System.out.println("创建远程对象发生异常!");
			e.printStackTrace();
		} catch(AlreadyBoundException e) {
			System.out.println("发生重复绑定对象异常!");
			e.printStackTrace();
		} catch(MalformedURLException e) {
			System.out.println("发生URL畸形异常!");
			e.printStackTrace();
		}
	}
}
4、客户端实现

package com.lxp.rmi;

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

public class HelloClient {
	public static void main(String[] args) {
		try {
			IHello rhello = (IHello)Naming.lookup("rmi://localhost:8889/RHello");
			System.out.println(rhello.HelloWorld());
			System.out.println(rhello.sayHelloToSomeBody("鸣人"));
		} catch(RemoteException e) {
			e.printStackTrace();
		} catch(NotBoundException e) {
			e.printStackTrace();
		} catch(MalformedURLException e) {
			e.printStackTrace();
		}
	}
}





你可能感兴趣的:(Java RMI远程方法调用)