`

利用java-RMI进行大文件传输

 
阅读更多

为什么要用RMI​

在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,反观java-sockets,虽然比较灵活,但需要自己规定服务器端和客户端之间的通信协议。比较麻烦,几经权衡,最终还是选择RMI来进行服务器-客户端通信

文件上传问题

在使用java-rmi的过程中,必然会遇到一个文件上传的问题,由于在rmi中无法传输文件流(比如rmi中的方法参数不能是FileInputStream之类的),那么我们只好选择一种折中的办法,就是先用FileInputStream将文件读到一个 Byte数组中,然后把这个Byte数组作为参数传进RMI的方法中,然后在服务器端将Byte数组还原为outputStream,这样就能通过RMI 来传输文件了

这样做也有缺点,就是无法检验传输过来的数据的准确性,汗。。。

下面我就一个实例来讲解一下

文件结构

FileClient

  1. package rmiupload; 
  2.       
  3.     import java.io.BufferedInputStream; 
  4.     import java.io.File; 
  5.     import java.io.FileInputStream; 
  6.     import java.io.FileNotFoundException; 
  7.     import java.io.IOException; 
  8.     import java.net.MalformedURLException; 
  9.     import java.rmi.Naming; 
  10.     import java.rmi.NotBoundException; 
  11.     import java.rmi.RemoteException; 
  12.       
  13.     public class FileClient { 
  14.       
  15.         public FileClient() { 
  16.             // TODO Auto-generated constructor stub 
  17.         } 
  18.       
  19.         public static void main(String[] args) { 
  20.             try { 
  21.                 FileDataService fileDataService = (FileDataService) Naming.lookup("rmi://localhost:9001/FileDataService"); 
  22.                 fileDataService.upload("/Users/NeverDie/Documents/test.mp4"new FileClient().fileToByte("/Users/NeverDie/Music/test.mp4")); 
  23.             } catch (MalformedURLException | RemoteException | NotBoundException e) { 
  24.                 // TODO Auto-generated catch block 
  25.                 e.printStackTrace(); 
  26.             } 
  27.         } 
  28.     //这个方法比较重要,通过这个方法把一个名为filename的文件转化为一个byte数组 
  29.         private byte[] fileToByte(String filename){ 
  30.             byte[] b = null
  31.             try { 
  32.                 File file = new File(filename); 
  33.                 b = new byte[(int) file.length()]; 
  34.                 BufferedInputStream is = new BufferedInputStream(new FileInputStream(file)); 
  35.                 is.read(b); 
  36.             } catch (FileNotFoundException e) { 
  37.             // TODO Auto-generated catch block 
  38.                 e.printStackTrace(); 
  39.             } catch (IOException e) { 
  40.                 // TODO Auto-generated catch block 
  41.                 e.printStackTrace(); 
  42.             } 
  43.             return b; 
  44.         } 
  45.     } 

FileDataService

  1. package rmiupload; 
  2.       
  3.     import java.net.URL; 
  4.     import java.rmi.Remote; 
  5.     import java.rmi.RemoteException; 
  6.       
  7.     public interface FileDataService extends Remote{ 
  8.       
  9.         //这里的filename应该是该文件存放在服务器端的地址 
  10.         public void upload(String filename, byte[] file) throws RemoteException; 
  11.       
  12.     } 

FileDataService_imp

  1. package rmiupload; 
  2.       
  3.     import java.io.BufferedOutputStream; 
  4.     import java.io.File; 
  5.     import java.io.FileNotFoundException; 
  6.     import java.io.FileOutputStream; 
  7.     import java.io.IOException; 
  8.     import java.net.URL; 
  9.     import java.rmi.RemoteException; 
  10.     import java.rmi.server.RMIClientSocketFactory; 
  11.     import java.rmi.server.RMIServerSocketFactory; 
  12.     import java.rmi.server.UnicastRemoteObject; 
  13.       
  14.     public class FileDataService_imp extends UnicastRemoteObject implements FileDataService{ 
  15.       
  16.         public FileDataService_imp() throws RemoteException { 
  17.       
  18.         } 
  19.       
  20.         @Override 
  21.         public void upload(String filename, byte[] fileContent) throws RemoteException{ 
  22.             File file = new File(filename); 
  23.             try { 
  24.                 if (!file.exists()) 
  25.                     file.createNewFile(); 
  26.                 BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file)); 
  27.                 os.write(fileContent); 
  28.             } catch (FileNotFoundException e) { 
  29.                 // TODO Auto-generated catch block 
  30.                 e.printStackTrace(); 
  31.             } catch (IOException e) { 
  32.                 // TODO Auto-generated catch block 
  33.                 e.printStackTrace(); 
  34.             } 
  35.       
  36.     ;   } 
  37.       
  38.     } 

FileServer

  1. package rmiupload; 
  2.       
  3.     import java.net.MalformedURLException; 
  4.     import java.rmi.Naming; 
  5.     import java.rmi.RemoteException; 
  6.     import java.rmi.registry.LocateRegistry; 
  7.       
  8.     public class FileServer { 
  9.       
  10.         FileDataService fileDataService; 
  11.       
  12.         public FileServer() { 
  13.             try { 
  14.                 fileDataService = new FileDataService_imp(); 
  15.                 LocateRegistry.createRegistry(9001); 
  16.                 Naming.rebind("rmi://localhost:9001/FileDataService", fileDataService); 
  17.             } catch (RemoteException e) { 
  18.                 // TODO Auto-generated catch block 
  19.                 e.printStackTrace(); 
  20.             } catch (MalformedURLException e) { 
  21.                 // TODO Auto-generated catch block 
  22.                 e.printStackTrace(); 
  23.             } 
  24.       
  25.       
  26.         } 
  27.       
  28.         /** 
  29.          * @param args 
  30.          */ 
  31.         public static void main(String[] args) { 
  32.             new FileServer(); 
  33.       
  34.         } 
  35.       
  36.     } 

原文链接:http://my.oschina.net/wangxuanyihaha/blog/133894

分享到:
评论

相关推荐

    java-rmi.zip_RMI java_rmi

    Java Remote Method Invocation (RMI) 是Java编程语言中的一种机制,允许在不同的Java虚拟机(JVM)之间进行远程调用。"java-rmi.zip_RMI java_rmi"这个文件很可能是包含了一些关于RMI实现的示例代码或库文件。RMI在...

    java文件传输RMI

    Java文件传输RMI,全称为...总之,Java文件传输RMI是一种利用Java的分布式计算能力实现的文件传输方案,适合在同一网络环境下进行高效、便捷的文件交互。通过合理的优化和错误处理,可以构建稳定可靠的文件传输系统。

    Java-RMI:Java 的 RMI 实现,在 Java 中

    Java Remote Method Invocation (RMI) 是Java平台提供的一种强大的分布式计算技术,允许在不同网络节点上的Java对象之间进行远程调用。RMI是Java在分布式环境中实现对象间通信的重要手段,它简化了分布式应用程序的...

    RMI远程文件传输

    总结来说,RMI远程文件传输利用了Java的RMI技术,通过定义远程接口和实现该接口的服务器与客户端,实现了在网络中安全、高效地传输文件。这一过程涉及到了Java的序列化、网络通信、异常处理等多个方面,对于理解Java...

    RMI实现远程文件传输实例

    在你提供的实例中,“RMI实现远程文件传输”是利用RMI来传输“KEY文件”的具体应用。 首先,理解RMI的基本概念: 1. 远程对象:这是在远程服务器上运行并可以通过网络访问的对象。它们需要实现特定的接口,这个接口...

    java rmi java rmi

    根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...

    java-rmi-example

    3. 高效:RMI利用Java的优化机制,减少网络通信开销。 四、RMI的局限性 1. 安全性:RMI默认的信任模型较弱,需要开发者额外加强安全措施。 2. 性能:对于大规模并发请求,RMI可能不如其他分布式计算框架如Hadoop、...

    基于JAVA RMI的聊天室

    在这个“基于JAVA RMI的聊天室”项目中,开发者利用RMI技术构建了一个简单的多用户交互系统,让用户可以在不同的计算机上进行实时聊天。 ### 1. JAVA RMI原理 RMI允许Java对象在不同的Java虚拟机之间进行方法调用...

    javaRMI反序列化漏洞验证工具

    Java RMI(Remote Method Invocation,远程方法调用)是一种...总的来说,理解Java RMI反序列化漏洞及其危害至关重要,同时利用如`attackRMI.jar`这样的工具进行定期检测,可以帮助识别并及时修补这些潜在的安全隐患。

    RMI.zip_Java RMI_RMI java_rmi

    学习和理解RMI,开发者可以构建高效、可扩展的分布式系统,利用Java的强大功能来解决复杂的网络编程问题。不过,需要注意的是,随着Java技术的发展,例如Java EE和Web服务的出现,RMI在某些场景下可能已经被更现代的...

    rmi远程调用读取文件

    RMI(Remote Method Invocation,远程方法调用)是Java平台上的一个核心特性,它允许Java对象在不同的JVM之间进行通信,实现分布式计算。在这个场景中,“rmi远程调用读取文件”指的是通过RMI机制,使得一个JVM中的...

    JavaRMI分布式编程心得

    ### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...

    一个完整的Java RMI通讯的例子

    Java Remote Method Invocation (RMI) 是Java平台提供的一种分布式计算技术,它允许在不同网络节点上的Java对象之间进行远程调用。在这个例子中,我们将深入理解RMI的基本概念、工作原理以及如何创建一个完整的RMI...

    基于-JavaRMI的分布式计算.doc

    Java Remote Method Invocation (RMI) 是Java平台提供的一种强大的分布式计算技术,允许在不同网络节点上的Java对象之间进行透明的远程方法调用。基于RMI的分布式计算模型,可以将复杂的计算任务分解到多台计算机上...

    rmi上传文件到远程服务器

    在Java编程领域,RMI(Remote Method Invocation,远程方法调用)是一种强大的技术,它允许在不同的Java虚拟机之间进行分布式计算。RMI使得对象可以在一个JVM上执行,而这个对象实际上驻留在另一个JVM上。在这个场景...

    javarmi来实现远程下载文件

    在本场景中,我们利用Java RMI来实现实时的远程文件下载功能。下面将详细阐述如何使用Java RMI来实现这一目标。 首先,我们需要理解Java RMI的基本工作原理。RMI系统包含两部分:服务器端(Server)和客户端...

    RMI远程下载文件

    这是一个典型的分布式系统应用,利用了Java的强类型和面向对象特性,以及RMI的跨JVM通信能力。在实际开发中,这样的系统可以扩展到更复杂的文件操作,如上传、删除、重命名等,且适用于多用户环境。

    rmi文件下载与上传代码

    此外,为了保证文件传输的安全性和可靠性,可能还会涉及SSL/TLS加密、错误处理、断点续传、文件完整性校验(如MD5或SHA校验)等技术。同时,可能还需要考虑并发控制,以防多个客户端同时操作同一文件导致的问题。 ...

    Hessian RPC-RMI技术 整合Structs Spring Hibernate Ibatis

    通过以上整合,开发者可以构建出一个分布式系统,其中客户端通过Hessian或RMI与服务端进行高效通信,同时利用Structs、Spring、Hibernate和Ibatis的特性,实现强大的业务逻辑处理、依赖管理、数据库操作和灵活的SQL...

    RMI-File-Submission-System-master.zip_java_submission_tornkaj

    总的来说,这个RMI-File-Submission-System-master项目提供了一个实用的示例,展示了如何利用Java RMI构建分布式文件提交系统。开发者可以从中学习到RMI的使用、远程对象的设计、网络通信的处理以及文件传输优化等...

Global site tag (gtag.js) - Google Analytics