Java学习笔记-网络编程(二)

1:Java 远程调用

Java的远程调用是一种分布式的技术,使用远程调用可以实现客户端请求服务器,即客户端请求服务器对象调用一定的方法,并且将返回值给到客户端的功能的实现。

1:远程对象及代理

1:远程对象
客户端要请求的对象资源位于服务器端,这个被请求的对象就是远程对象。
2:代理与存根(Stub)
远程调用是不希望客户端与远程对象直接完成交互的,因此需要一个代理来完成客户端与服务器端对象的交互工作的。代理的特点是他与远程对象实现了相同的接口,也就是与远程对象公开了相同的方法。
存根(Stub)是一个特殊的字节码,它的对象可以作为远程对象的代理,代理需要驻留在客户端。也就是需要把存根复制或下载到客户端。
3:Remote接口
为了标识一个对象是否是远程对象,规定只有实现接口Remote的对象为远程对象,该接口中没有方法,仅仅起到一个标识作用,因此必须扩展此接口。

2:RMI接口的设计细节

1:扩展Remote接口
扩展Remote接口就是定义一个Remote的子接口。
例如:

import java.rmi.*;
public interface RemoteSubject extends Remote{
public void setHeight(double height) throws RemoteException;
public void setWidth(double width) throws RemoteException;
public double getArea() throws emoteException;
}

此接口需要保存在服务器的目录中,并生成响应的.class字节码文件。同样此接口需要复制或者下载到客户端的目录中。
2:远程对象
由于远程对象必须实现接口Remote,而Remote接口是没有方法的,所以可让远程对象的类实现Remote接口的子接口。所以通常这个类是UnicastRemoteObject类的子类。下面的类是UnicastRemoteObject类的子类,并且实现了 上面的Remote的子接口RemoteSubject。

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class RemoteConcreteSubject extends UnicastRemoteObject implements  RemoteSubject{
	double width,height;
	public RemoteConcreteSubject() throws RemoteExpection{
	}
	public void SetHeight(double height) throws RemoteException{
		this.height=height;
	}
	public void SetWidth(double width) throws RemoteException{
		this.width=width;
	}
	public double getArea() throws RemoteException{
		retuen height*width;
	}

此文件会保存到服务器端。
3:存根与代理
RMI(远程代理)负责产生存根,如果创建远程对象的字节码是RemoteConcreteSubject.class,那存根的字节码文件是:RemoteConcreteSubject_Stub.class 存根创建可以通过rmic命令来完成:先进入服务器目录,执行下面的命令:

rmic RemoteConcreteSubject

客户端可以下载或者复制存根在自己的目录下。
4:启动注册:rmiregistry
在穿件远程对象之间,服务器端必须先注册:rmiregistry,只有启动了:rmiregistry的服务器可以创建远程对象。
启动方法。服务器中DOS输入命令:

rmiregistry

5:启动远程对象服务
注册完成服务器看就可以启动远程对象了——编写程序来创建和注册对象。并且运行。远程服务器使用Naming类中的方法:rebind(String name ,Remote obj)来绑定一个远程对象到remiregisty注册表中。其中参数name为url格式。obj为远程对象。
下面是启动远程服务对象的例子。

import java.rmi.Naming;

public class Test {
  public static void main(String[] args) {
    RemoteConcreateSubject remoteObject= null;
    try {
      remoteObject = new RemoteConcreateSubject();
      Naming.rebind("rmi://127.0.0.1/rect",remoteObject);
      System.out.println("be ready for client server..");
    } catch (Exception e) {
      e.printStackTrace();
    }
   
    
  }
}

6:运行客户端程序
客户端使用java.rmi.*包中的Naming类中的方法looku(String name)返回一个远程对象的代理。name与服务器的name一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值