文章目录
一、远程方法调用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);
}
}
总结
如有错误欢迎指出