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

开发 后端
Java RMI指的是远程方法调用 ,它不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

为什么要用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

责任编辑:陈四芳 来源: 开源中国博客
相关推荐

2014-04-28 09:29:36

2009-10-27 16:52:41

VB.NET文件传输

2013-12-20 11:05:13

IBM大数据Aspera

2020-11-23 17:25:37

镭速联合架构存储

2010-07-01 15:55:54

FTP文件传输协议

2017-02-27 20:24:27

Linux文件传输命令

2010-06-28 14:25:16

2012-03-19 10:35:51

ibmdw

2010-11-09 17:28:27

嗅探嗅探网络TFTP

2013-06-10 16:28:23

2021-02-25 15:09:24

微信文件传输助手录音

2010-12-08 12:34:46

文件传输

2021-06-07 00:03:31

HTTP大文件方案

2010-06-09 15:40:01

FTP文件传输协议

2013-11-19 20:07:18

远程桌面文件文件传输

2009-09-07 13:38:03

C# HTTP文件传输HTTP文件传输

2014-09-17 09:24:30

2020-11-13 08:30:57

Socket

2011-03-04 11:23:55

FileZilla

2023-06-06 08:57:27

点赞
收藏

51CTO技术栈公众号