分布式计算-RMI

        RMI能让一个Java程序去调用网络中另一台计算机的Java对象的方法,调用的效果就跟在本机上调用一样。RMI架构基于一个重要的原理:定义接口和定义接口的具体实现是分开的。

        现在来实现一个RMI编程的小例子,实现远程方法调用实现计算a+b。

定义接口部分

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

public interface SomeInterface extends Remote {               //要继承Remote类
    public int  add(int a, int b) throws RemoteException;   //抛出RemoteException类型的错误
}

    接口的实现部分

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

//要接口的实现要继承UnicastRemoteObject类
public class SomeImpl extends UnicastRemoteObject implements SomeInterface {
    private int a;
    private int b;

    //即使无参构造函数什么也做也要写上,因为要抛出RemoteException错误
    protected SomeImpl() throws RemoteException {
        a = 1;
        b = 1;
    }

    public SomeImpl(int a, int b) throws RemoteException{
        this.a = a;
        this.b = b;
    }
    
    //实现接口中声明的函数
    @Override
    public int add(int a, int b) throws RemoteException {
        System.out.println("结果为:" + (a + b));
        return a + b;
    }
}

接口声明和实现都完成后就开始编写服务器端和客户端的工作了。

服务器端

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


public class AddServer {
    public static void main(String[] args){
        try {
            LocateRegistry.createRegistry(1099);  //启动RMI注册服务,默认端口号1099。
            SomeImpl someimpl = new SomeImpl();   //创建远程对象的一个实例。
            Naming.rebind("add", someimpl);       //远程对象的绑定。
            System.out.println("success");
        } catch (RemoteException e) {
            System.out.println("false");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            System.out.println("false");
            e.printStackTrace();
        }
    }
}

最后编写客户端

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

public class AddClient {
    public static void main(String[] args){
        try {
            int a, b;
            Scanner input = new Scanner(System.in);

            //使用Naming.lookup()寻找注册的远程对象
            SomeInterface add = (SomeInterface) Naming.lookup("add");
            a = input.nextInt();
            b = input.nextInt();

            //调用远程方法
            System.out.println(add.add(a, b));
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

最终结果展示

客户端输入a和b的值,然后调用远程对象add中的add(a, b)方法,然后服务器端返回他们相加的结果。

服务器端

服务器端成功启动,并成功接收客户端的请求并返回相加结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值