初学RMI被它搞了两天,写个博文记下笔记

1 篇文章 0 订阅

这两天一直在通过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”的文件内容。



注:如果在两台电脑上分别运行服务器和客户端,

服务器上的程序为:除去服务器启动程序之外的所有程序

客户端上的程序为:除去客户端测试层序之外的所有程序



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值