转载

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

为什么要用RMI​

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

文件上传问题

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

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

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

文件结构

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

FileClient

  1. package rmiupload;
  2.     import java.io.BufferedInputStream;
  3.     import java.io.File;
  4.     import java.io.FileInputStream;
  5.     import java.io.FileNotFoundException;
  6.     import java.io.IOException;
  7.     import java.net.MalformedURLException;
  8.     import java.rmi.Naming;
  9.     import java.rmi.NotBoundException;
  10.     import java.rmi.RemoteException;
  11.     public class FileClient {
  12.         public FileClient() {
  13.             // TODO Auto-generated constructor stub
  14.         }
  15.         public static void main(String[] args) {
  16.             try {
  17.                 FileDataService fileDataService = (FileDataService) Naming.lookup("rmi://localhost:9001/FileDataService");
  18.                 fileDataService.upload("/Users/NeverDie/Documents/test.mp4", new FileClient().fileToByte("/Users/NeverDie/Music/test.mp4"));
  19.             } catch (MalformedURLException | RemoteException | NotBoundException e) {
  20.                 // TODO Auto-generated catch block
  21.                 e.printStackTrace();
  22.             }
  23.         }
  24.     //这个方法比较重要,通过这个方法把一个名为filename的文件转化为一个byte数组
  25.         private byte[] fileToByte(String filename){
  26.             byte[] b = null;
  27.             try {
  28.                 File file = new File(filename);
  29.                 b = new byte[(int) file.length()];
  30.                 BufferedInputStream is = new BufferedInputStream(new FileInputStream(file));
  31.                 is.read(b);
  32.             } catch (FileNotFoundException e) {
  33.             // TODO Auto-generated catch block
  34.                 e.printStackTrace();
  35.             } catch (IOException e) {
  36.                 // TODO Auto-generated catch block
  37.                 e.printStackTrace();
  38.             }
  39.             return b;
  40.         }
  41.     }
FileDataService
  1. package rmiupload;
  2.     import java.net.URL;
  3.     import java.rmi.Remote;
  4.     import java.rmi.RemoteException;
  5.     public interface FileDataService extends Remote{
  6.         //这里的filename应该是该文件存放在服务器端的地址
  7.         public void upload(String filename, byte[] file) throws RemoteException;
  8.     }
FileDataService_imp
  1. package rmiupload;
  2.     import java.io.BufferedOutputStream;
  3.     import java.io.File;
  4.     import java.io.FileNotFoundException;
  5.     import java.io.FileOutputStream;
  6.     import java.io.IOException;
  7.     import java.net.URL;
  8.     import java.rmi.RemoteException;
  9.     import java.rmi.server.RMIClientSocketFactory;
  10.     import java.rmi.server.RMIServerSocketFactory;
  11.     import java.rmi.server.UnicastRemoteObject;
  12.     public class FileDataService_imp extends UnicastRemoteObject implements FileDataService{
  13.         public FileDataService_imp() throws RemoteException {
  14.         }
  15.         @Override
  16.         public void upload(String filename, byte[] fileContent) throws RemoteException{
  17.             File file = new File(filename);
  18.             try {
  19.                 if (!file.exists())
  20.                     file.createNewFile();
  21.                 BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));
  22.                 os.write(fileContent);
  23.             } catch (FileNotFoundException e) {
  24.                 // TODO Auto-generated catch block
  25.                 e.printStackTrace();
  26.             } catch (IOException e) {
  27.                 // TODO Auto-generated catch block
  28.                 e.printStackTrace();
  29.             }
  30.     ;   }
  31.     }
FileServer
  1. package rmiupload;
  2.     import java.net.MalformedURLException;
  3.     import java.rmi.Naming;
  4.     import java.rmi.RemoteException;
  5.     import java.rmi.registry.LocateRegistry;
  6.     public class FileServer {
  7.         FileDataService fileDataService;
  8.         public FileServer() {
  9.             try {
  10.                 fileDataService = new FileDataService_imp();
  11.                 LocateRegistry.createRegistry(9001);
  12.                 Naming.rebind("rmi://localhost:9001/FileDataService", fileDataService);
  13.             } catch (RemoteException e) {
  14.                 // TODO Auto-generated catch block
  15.                 e.printStackTrace();
  16.             } catch (MalformedURLException e) {
  17.                 // TODO Auto-generated catch block
  18.                 e.printStackTrace();
  19.             }
  20.         }
  21.         /**
  22.          * @param args
  23.          */
  24.         public static void main(String[] args) {
  25.             new FileServer();
  26.         }
  27.     }
正文到此结束
Loading...