0
点赞
收藏
分享

微信扫一扫

远程方法调用RMI编程实践

kiliwalk 2022-03-31 阅读 29

文章目录


一、远程方法调用RMI

  • 与RPC(远程过程调用)紧密联系,RMI扩展到了分布式对的范畴
  • 访问对象能够调用位于潜在的远程对象上的方法
  • RPC和RMI的共性如下:
    都支持接口编程。
    都是典型的基于请求-应答协议构造的,并提供一系列如最少一次、最多一次调用语义。
    都提供相似程度的透明性。
  • RMI特殊性
    程序员能够在分布式系统软件开发中使用所有面向对象编程的功能。
    基于面向对象系统中对象标识的概念,在基于RMI系统中的所有对象都有唯一的对象引用。
  • 完成远程方法调用涉及的独立对象和模块

在这里插入图片描述


二、Java RMI编程实例

实验目标

在这里插入图片描述

源代码

FindScoreByID接口

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

public interface FindScoreByID extends Remote {
	String getScore(String id) throws RemoteException;
}

FindScoreByIDService类

FindScoreByID接口的实现类FindScoreByIDService

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

public class FindScoreByIDService implements FindScoreByID {

	@Override
	public String getScore(String id) throws RemoteException {
		BufferedReader i = null;
		try {
			i = new BufferedReader(new FileReader("C:\\Users\\Linyz\\Desktop\\data.txt"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		String str;
		List IDhList = new ArrayList();
		List ScoreList = new ArrayList();
    	try {
			while ((str = i.readLine()) != null) {
				String[] tokens = str.split(",");
				IDhList.add(tokens[0]);
				ScoreList.add(tokens[1]);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
    if (IDhList.contains(id)) {
		int n =IDhList.indexOf(id);
		return "该学号的学生的成绩:"+(String)ScoreList.get(n);
	}
		return "没有该学号!";
	}
	
}

客户端Client

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws RemoteException, NotBoundException {
        // 连接到服务器localhost,端口8080:
        Registry registry = LocateRegistry.getRegistry("localhost", 8080);
        // 查找名称为"FindScoreByID"的服务并强制转型为FindScoreByID接口:
        FindScoreByID getScore = (FindScoreByID) registry.lookup("FindScoreByID");
        // 正常调用接口方法:
        System.out.println("请输入学生学号:");
        Scanner sc = new Scanner(System.in);
        String id = sc.next();
        String Score = getScore.getScore(id);
        // 打印调用结果:
        System.out.println(Score);
    }
}

服务端Server

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Server {
    public static void main(String[] args) throws RemoteException {
        System.out.println("create FindScoreByID remote service...");
        // 实例化一个FindScoreByID:
        FindScoreByID getScore = new FindScoreByIDService();
        // 将此服务转换为远程服务接口:
        FindScoreByID skeleton = (FindScoreByID) UnicastRemoteObject.exportObject(getScore, 0);
        // 将RMI服务注册到8080端口:
        Registry registry = LocateRegistry.createRegistry(8080);
        // 注册此服务,服务名为"FindScoreByID":
        registry.rebind("FindScoreByID", skeleton);
    }
}


总结

如有错误欢迎指出
在这里插入图片描述

举报

相关推荐

0 条评论