这两天一直在通过RMI来实现两台电脑之间的通信,因为初学Java,只好在网上找些例子,自己执行。
实现一台电脑上的RMI通信是很简单的,但是RMI在两台电脑之间通信,我在网上找了很多资料,个说不一,
只能一点点的实验,最后终于实现了。
身边的小伙伴都不懂java,自学起来太困难了,遇到问题只能到网上,或者群里面找大神寻求帮助。
虽然过程很是艰辛,但是最后实现了,心里面还是蛮愉快的。
其中几个关键点先讲一下:
其一。 客户端和服务器的包名必须是一样的。
其二。 _stub.class文件必须在class文件夹里面(eclipes的class文件在工程的bin文件夹下面)。
下面是参考网上的简单实例
实现最简单的远程文件访问。Client能够获取在Server上的远程文件信息。实例代码中,客户端获取了服务器端的文件“D:\\test\testDate.java”的内容和文件名。
首先在服务器端建立需要读取的文件目录为D:\\test\testDate.java
1. 服务器端实现的具体步骤:
a) 设计远程接口涉及的参数类型接口
package testRmi;
import java.io.Serializable;
public interface FileInformation extends Serializable{
public String getContent();
public String getFileName();
public String printfFileName();
public boolean setFileInformation (String name, String currentDir);
}
b) 设计远程接口
package testRmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
import testRmi.FileInformation;
public interface Hello extends Remote{
FileInformation getFile(String name) throws RemoteException;
}
c) 实现参数类型接口
package testRmi;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
public class FileInformationImple implements FileInformation{
// private static final Logger log = LoggerFactory.getLogger(FileInformationImple.class);
private static final long serialVersionUID = -8484348346023818166L;
private String fileName = null;
private String content = null;
private String namefine = null;
public String getContent(){
return content;
}
public String getFileName(){
return fileName;
}
public String printfFileName(){
return namefine;
}
public boolean setFileInformation(String name, String currentDir){
String path = currentDir +"/" + name;
try{
/*
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(new File(path)));
*/
FileInputStream in = new FileInputStream(new File(path));
byte[] b = new byte[100];
int i = in.read(b);
if(i == -1){
return false;
}
content = new String(b);
namefine = "liuxk----namefine";
// log.debug(content);
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
}
d) 实现远程接口
package testRmi;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import testRmi.Hello;
public class HelloImple extends UnicastRemoteObject implements Hello, Serializable{
protected HelloImple() throws RemoteException{
super();
}
private static final long serialVersionUID = -7671514615926445886L;
public FileInformation getFile(String name) throws RemoteException{
System.out.println("getFile");
FileInformation fInfor = new FileInformationImple();
if(!fInfor.setFileInformation(name, "D:/test")){
throw new RemoteException("invalid path");
}
return fInfor;
}
}
e) 编写服务器启动程序
package testRmi;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import testRmi.Hello;
import java.rmi.RMISecurityManager;
public class Server {
public static void main(String[] args){
try{
/*
if(System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
*/
LocateRegistry.createRegistry(1099);
Hello hello= new HelloImple();
Naming.bind("rmi://192.168.186.76:1099/RHello", hello);
System.out.println("start server:");
}catch(Exception e1){
e1.printStackTrace();
}
}
}
f)编写客户端测试用例
package testRmi;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import testRmi.FileInformation;
public class TestRmI {
//查找远程对象并调用远程方法
public static void main(String[] args){
try{
//System.setSecurityManager(new RMISecurityManager());
//从另一台启动了RMI注册服务的机器上查找hello实例
System.out.println("111");
Hello h = (Hello)Naming.lookup("rmi://192.168.186.76:1099/RHello");
System.out.println("222");
FileInformation f = h.getFile("testDate.java");
System.out.println("333");
System.out.println(f.getContent());
System.out.println(f.printfFileName());
}catch (Exception e){
e.printStackTrace();
}
}
}
2. 用rmic命令生产stub.class文件 ,只能用实现类,不能用接口,命令为:rmic testRMi.HelloImple
把生成的文件放到与class同一级目录里面。
3. rmi://192.168.186.76:1099/RHello 这里面的IP 是我们可以修改的。
4.执行程序:1. 可以在eclipse中直接执行,但是必须先运行服务器,再运行客户端。也可以在命令行下运行。次序要求同在eclipse中。步骤如下:
(1)打开一个Dos窗口,执行命令javarmi.Server 启动服务器。启动成功会在命令行显示“Server start!”
(2)打开另一个Dos窗口,执行命令java rmi.Test 运行客户端程序。运行成功则会在屏幕打印“D:\\test\testDate.java”的文件内容。
注:如果在两台电脑上分别运行服务器和客户端,
服务器上的程序为:除去服务器启动程序之外的所有程序
客户端上的程序为:除去客户端测试层序之外的所有程序