服务器之家

服务器之家 > 正文

java使用rmi传输大文件示例分享

时间:2019-10-27 12:19     来源/作者:java技术网

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

        } 

    } 
   
标签:

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字 2019-06-05
返回顶部