分布式-远程部署的RMI

参考HeadFirst java 看分布式,环境win 7

接口代码如下:

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

public interface MyRemote extends Remote{
	public String sayHello()throws RemoteException;
}

服务实现类:

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
	
	public MyRemoteImpl() throws RemoteException {
	}

	private static final long serialVersionUID = 2430212474440437524L;

	public String sayHello() {
		return "Server says,'Hey'";
	}
	public static void main(String[] args) {
		try {
			MyRemote service =new MyRemoteImpl();
			Naming.rebind("Remote", service);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}	

客户端实现类:

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

public class MyRemoteClient {
	public static void main(String[] args) {
		new MyRemoteClient().go();
	}
	public void go(){
		try{
			MyRemote service=(MyRemote) Naming.lookup("rmi://127.0.0.1/Remote");
			String s=service.sayHello();
			System.out.println(s);
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

命令行:

     当前目录下开一个命令行:

     javac *.java

     rmic -vcompat MyRemoteImpl

     rmiregistry

     当前目录下开新的命令行:

     java MyRemoteImpl

     当前目录下开新的命令行:

     java MyRemoteClient



使用RMI 时常犯的错误:

    1.忘记在启动远程服务前启动rmiregistry(使用Naming.rebind()注册服务前rmiregistry必须启动)

    2.忘记把参数和返回类型做成可序列化。

    3.忘记将stub类交给客户端。

客户端和服务端分别需要哪些:

    客户端:

    别忘记客户端是使用接口来调用stub上的方法,客户端的java 虚拟机必须要有stub类,但客户端不会在程序代码中引用到stub类,客户端总是通过接口来操作真正的远程对象。

    1.client.class

    2.MyRemoteImpl_Stub.class

    3.MyRemote.class

    服务端:

    服务器上必须要有stub和skeleton,以及服务器与远程的接口,它会需要stub类是因为stub会被代换成链接在RMIregistry上真正的服务。

    1.MyRemote.class

    2.MyRemoteImpl.class

    3.MyRemoteImpl_Stub.class

    4.MyRemoteImpl_Skel.class

要点:

   在某堆上的对象无法进行另外堆上的对象引用。

   Java Remote Method Invocation (RMI)让你感觉上像是调用远程调用对象的方法,但其实不是。

   当客户端调用远程对象的方法时,其实是调用代理上的方法,此代理被称为stub。

   stub是格处理低层网络细节的辅助性对象,它会把方法的调用包装起来送到服务器上。

   要创建远程服务的话,你就必须要以远程接口来启动。

   远程接口必须要extend过java.rmi.Remote这个接口,且所有的方法都必须声明RemoteException。

   你的远程服务会实现远程接口。

   远程服务应该要继承UnicastRemoteObject(技术上也有其他方法可以创建远程对象,但这是最简单的方式)。

   远程服务必须要声明RemoteExcption的构造函数(因为父类的构造函数声明了)。

   远程服务的对象必须要向RMI registry注册。

   使用静态的Naming.rebind()来注册远程服务。

   RMI registry 必须在同一台机器上与远程服务一块执行,且必须在对象的注册之前启动。

   客户端会以Naming.lookup()查询远程服务。

   几乎所有与RMI有关的都会抛出RemoteException(由编译器检查)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值