一个相当经典的RMI实例源代码及详细说明
RMI技术
下面以一个例子说明怎么使用RMI技术。这个例子演示了怎样将一个文件上传到服务器和怎样将一个文件从服务器上下载下来。
使用RMI技术共有6个步骤要走:
(1)定义和实现远端接口中的参数
(2) 定义和实现远端接口
(3) 编写服务端代码
(4)编写客户端代码
(5)生成stub和skeltion ,并将stub打包到客户端jar中,将skeltion打包到服务端jar中 (6)启动rmiregistry , 并将服务注册到rmiregistry中,然后运行代码。下面就这六个方面说明rmi技术。
定义和实现远端接口中的参数
(1)定义远端接口中的参数
每一个远端接口中的参数都必须是可序列化的。那么,如何定义一个序列化的接口呢,简单,只需从java.io.Serializable继承即可,如下所示:
import java.io.Serializable; public interface FileInformation extends Serializable { String getName(); byte[] getContent(); void setInformation(String name , byte[] content); };
public class FileInformationSev implements FileInformation { private String name = null ; private byte[] content = null ; public String getName() { return name ; } public byte[] getContent() { return content; } public void setInformation(String name, byte[] content) { this.name = name ; this.content = content ; } }
import java.rmi.Remote; import java.rmi.RemoteException; public interface LoadFile extends Remote { void upLoadFile(FileInformation fileInof) throws RemoteException; FileInformation downLoadFile(String filename) throws RemoteException ; }
import java.rmi.Remote; import java.rmi.RemoteException; import java.io.IOException; import java.io.File; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.rmi.server.UnicastRemoteObject; public class LoadFileService extends UnicastRemoteObject implements LoadFile { private String currentDir= null ; // this contruction is needed public LoadFileService() throws RemoteException { bbs.bitsCN.com super(); } public void setCurrentDir(String currentDir){ this.currentDir = currentDir ; } public void upLoadFile(FileInformation fileInfo) throws RemoteException{ BufferedOutputStream output = null ; try{ // check paramter if(fileInfo == null ){ throw new RemoteException("the paramter is null "); } //check fileName and content String fileName = fileInfo.getName() ; byte [] content = fileInfo.getContent() ; if(fileName == null || content == null ){ throw new RemoteException("the file or the content is null "); } //create file String filePath = this.currentDir + "\" + fileName ; File file = new File(filePath); if(!file.exists()){ bitsCN.Com file.createNewFile(); } //save the content to the file output = new BufferedOutputStream(new FileOutputStream(file)); output.write(content); }catch(RemoteException ex){ throw ex ; }catch(Exception ex){ throw new RemoteException(ex.getLocalizedMessage()); }finally{ if(output != null ){ try{ output.close(); output = null ; }catch(Exception ex){ } } } } public FileInformation downLoadFile(String fileName) throws RemoteException { FileInformation fileInfo = null ; BufferedInputStream input = null ; try{ // check paramter if(fileName == null){ throw new RemoteException("the paramter is null ");bbs.bitsCN.com } // get path String filePath = this.currentDir + "\" + fileName ; File file = new File(filePath); if(!file.exists()){ throw new RemoteException("the file whose name is " + fileName + " not existed "); } // get content byte[] content = new byte[(int)file.length()]; input = new BufferedInputStream(new FileInputStream(file)); input.read(content); // set file name and content to fileInfo fileInfo = new FileInformationSev(); fileInfo.setInformation(fileName , content); }catch(RemoteException ex){ throw ex ; }catch(Exception ex){ throw new RemoteException(ex.getLocalizedMessage()); }finally{ if(input != null ){ try{ bitsCN_com input.close(); input = null ; }catch(Exception ex){ } } } return fileInfo ; } }
import java.rmi.RMISecurityManager; import java.rmi.Naming; public class RMIServer { public static void main(String[] args) { try{ //加载安全管理器 System.setSecurityManager(new RMISecurityManager() ); //创建一个服务对象 LoadFileService server = new LoadFileService(); server.setCurrentDir("c:\\rmiexample"); //将服务对象注册到rmi注册服务器上,而不是其他服务器 //(因为LoadFileService extends UnicastRemoteObject) Naming.rebind("//127.0.0.1:2000/LoadFileServer", server);bbs.bitsCN.com }catch(Exception ex){ System.out.println(ex.getLocalizedMessage()); ex.printStackTrace(); } } }