为什么要用RMI
在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,反观java-sockets,虽然比较灵活,但需要自己规定服务器端和客户端之间的通信协议。比较麻烦,几经权衡,最终还是选择RMI来进行服务器-客户端通信
文件上传问题
在使用java-rmi的过程中,必然会遇到一个文件上传的问题,由于在rmi中无法传输文件流(比如rmi中的方法参数不能是FileInputStream之类的),那么我们只好选择一种折中的办法,就是先用FileInputStream将文件读到一个 Byte数组中,然后把这个Byte数组作为参数传进RMI的方法中,然后在服务器端将Byte数组还原为outputStream,这样就能通过RMI 来传输文件了
这样做也有缺点,就是无法检验传输过来的数据的准确性,汗。。。
下面我就一个实例来讲解一下
文件结构
FileClient
- package rmiupload;
- import java.io.BufferedInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.rmi.Naming;
- import java.rmi.NotBoundException;
- import java.rmi.RemoteException;
- public class FileClient {
- public FileClient() {
- // TODO Auto-generated constructor stub
- }
- public static void main(String[] args) {
- try {
- FileDataService fileDataService = (FileDataService) Naming.lookup("rmi://localhost:9001/FileDataService");
- fileDataService.upload("/Users/NeverDie/Documents/test.mp4", new FileClient().fileToByte("/Users/NeverDie/Music/test.mp4"));
- } catch (MalformedURLException | RemoteException | NotBoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //这个方法比较重要,通过这个方法把一个名为filename的文件转化为一个byte数组
- private byte[] fileToByte(String filename){
- byte[] b = null;
- try {
- File file = new File(filename);
- b = new byte[(int) file.length()];
- BufferedInputStream is = new BufferedInputStream(new FileInputStream(file));
- is.read(b);
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return b;
- }
- }
FileDataService
- package rmiupload;
- import java.net.URL;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- public interface FileDataService extends Remote{
- //这里的filename应该是该文件存放在服务器端的地址
- public void upload(String filename, byte[] file) throws RemoteException;
- }
FileDataService_imp
- package rmiupload;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.net.URL;
- import java.rmi.RemoteException;
- import java.rmi.server.RMIClientSocketFactory;
- import java.rmi.server.RMIServerSocketFactory;
- import java.rmi.server.UnicastRemoteObject;
- public class FileDataService_imp extends UnicastRemoteObject implements FileDataService{
- public FileDataService_imp() throws RemoteException {
- }
- @Override
- public void upload(String filename, byte[] fileContent) throws RemoteException{
- File file = new File(filename);
- try {
- if (!file.exists())
- file.createNewFile();
- BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));
- os.write(fileContent);
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- ; }
- }
FileServer
- package rmiupload;
- import java.net.MalformedURLException;
- import java.rmi.Naming;
- import java.rmi.RemoteException;
- import java.rmi.registry.LocateRegistry;
- public class FileServer {
- FileDataService fileDataService;
- public FileServer() {
- try {
- fileDataService = new FileDataService_imp();
- LocateRegistry.createRegistry(9001);
- Naming.rebind("rmi://localhost:9001/FileDataService", fileDataService);
- } catch (RemoteException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- new FileServer();
- }
- }
相关推荐
Java Remote Method Invocation (RMI) 是Java编程语言中的一种机制,允许在不同的Java虚拟机(JVM)之间进行远程调用。"java-rmi.zip_RMI java_rmi"这个文件很可能是包含了一些关于RMI实现的示例代码或库文件。RMI在...
Java文件传输RMI,全称为...总之,Java文件传输RMI是一种利用Java的分布式计算能力实现的文件传输方案,适合在同一网络环境下进行高效、便捷的文件交互。通过合理的优化和错误处理,可以构建稳定可靠的文件传输系统。
Java Remote Method Invocation (RMI) 是Java平台提供的一种强大的分布式计算技术,允许在不同网络节点上的Java对象之间进行远程调用。RMI是Java在分布式环境中实现对象间通信的重要手段,它简化了分布式应用程序的...
总结来说,RMI远程文件传输利用了Java的RMI技术,通过定义远程接口和实现该接口的服务器与客户端,实现了在网络中安全、高效地传输文件。这一过程涉及到了Java的序列化、网络通信、异常处理等多个方面,对于理解Java...
在你提供的实例中,“RMI实现远程文件传输”是利用RMI来传输“KEY文件”的具体应用。 首先,理解RMI的基本概念: 1. 远程对象:这是在远程服务器上运行并可以通过网络访问的对象。它们需要实现特定的接口,这个接口...
根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...
3. 高效:RMI利用Java的优化机制,减少网络通信开销。 四、RMI的局限性 1. 安全性:RMI默认的信任模型较弱,需要开发者额外加强安全措施。 2. 性能:对于大规模并发请求,RMI可能不如其他分布式计算框架如Hadoop、...
在这个“基于JAVA RMI的聊天室”项目中,开发者利用RMI技术构建了一个简单的多用户交互系统,让用户可以在不同的计算机上进行实时聊天。 ### 1. JAVA RMI原理 RMI允许Java对象在不同的Java虚拟机之间进行方法调用...
Java RMI(Remote Method Invocation,远程方法调用)是一种...总的来说,理解Java RMI反序列化漏洞及其危害至关重要,同时利用如`attackRMI.jar`这样的工具进行定期检测,可以帮助识别并及时修补这些潜在的安全隐患。
学习和理解RMI,开发者可以构建高效、可扩展的分布式系统,利用Java的强大功能来解决复杂的网络编程问题。不过,需要注意的是,随着Java技术的发展,例如Java EE和Web服务的出现,RMI在某些场景下可能已经被更现代的...
RMI(Remote Method Invocation,远程方法调用)是Java平台上的一个核心特性,它允许Java对象在不同的JVM之间进行通信,实现分布式计算。在这个场景中,“rmi远程调用读取文件”指的是通过RMI机制,使得一个JVM中的...
### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...
Java Remote Method Invocation (RMI) 是Java平台提供的一种分布式计算技术,它允许在不同网络节点上的Java对象之间进行远程调用。在这个例子中,我们将深入理解RMI的基本概念、工作原理以及如何创建一个完整的RMI...
Java Remote Method Invocation (RMI) 是Java平台提供的一种强大的分布式计算技术,允许在不同网络节点上的Java对象之间进行透明的远程方法调用。基于RMI的分布式计算模型,可以将复杂的计算任务分解到多台计算机上...
在Java编程领域,RMI(Remote Method Invocation,远程方法调用)是一种强大的技术,它允许在不同的Java虚拟机之间进行分布式计算。RMI使得对象可以在一个JVM上执行,而这个对象实际上驻留在另一个JVM上。在这个场景...
在本场景中,我们利用Java RMI来实现实时的远程文件下载功能。下面将详细阐述如何使用Java RMI来实现这一目标。 首先,我们需要理解Java RMI的基本工作原理。RMI系统包含两部分:服务器端(Server)和客户端...
这是一个典型的分布式系统应用,利用了Java的强类型和面向对象特性,以及RMI的跨JVM通信能力。在实际开发中,这样的系统可以扩展到更复杂的文件操作,如上传、删除、重命名等,且适用于多用户环境。
此外,为了保证文件传输的安全性和可靠性,可能还会涉及SSL/TLS加密、错误处理、断点续传、文件完整性校验(如MD5或SHA校验)等技术。同时,可能还需要考虑并发控制,以防多个客户端同时操作同一文件导致的问题。 ...
通过以上整合,开发者可以构建出一个分布式系统,其中客户端通过Hessian或RMI与服务端进行高效通信,同时利用Structs、Spring、Hibernate和Ibatis的特性,实现强大的业务逻辑处理、依赖管理、数据库操作和灵活的SQL...
总的来说,这个RMI-File-Submission-System-master项目提供了一个实用的示例,展示了如何利用Java RMI构建分布式文件提交系统。开发者可以从中学习到RMI的使用、远程对象的设计、网络通信的处理以及文件传输优化等...