文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-17 08:57

关注

今天就跟大家聊聊有关如何利用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

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();             }                     }                        public static void main(String[] args) {             new FileServer();               }           }

看完上述内容,你们对如何利用java-RMI进行大文件传输有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯