如何利用java-RMI進(jìn)行大文件傳輸

今天就跟大家聊聊有關(guān)如何利用java-RMI進(jìn)行大文件傳輸,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司在網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、app軟件開(kāi)發(fā)公司、網(wǎng)站運(yùn)營(yíng)等方面均有出色的表現(xiàn),憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,我們更提供一系列營(yíng)銷型網(wǎng)站建設(shè),網(wǎng)站制作和網(wǎng)站推廣的服務(wù),以推動(dòng)各中小企業(yè)全面信息化,并利用創(chuàng)新技術(shù)幫助各行業(yè)提升企業(yè)形象和運(yùn)營(yíng)效率。

為什么要用RMI

在這次的項(xiàng)目中,對(duì)于客戶端與服務(wù)器之間的通信,想了許多辦法,由于做的是富客戶端應(yīng)用,最終將技術(shù)選定在了RMI和Java-sockets兩種之間,其中RMI的靈活性不高,客戶端和服務(wù)器端都必須是java編寫(xiě),但使用比較方便,反觀java-sockets,雖然比較靈活,但需要自己規(guī)定服務(wù)器端和客戶端之間的通信協(xié)議。比較麻煩,幾經(jīng)權(quán)衡,最終還是選擇RMI來(lái)進(jìn)行服務(wù)器-客戶端通信

文件上傳問(wèn)題

在使用java-rmi的過(guò)程中,必然會(huì)遇到一個(gè)文件上傳的問(wèn)題,由于在rmi中無(wú)法傳輸文件流(比如rmi中的方法參數(shù)不能是FileInputStream之類的),那么我們只好選擇一種折中的辦法,就是先用FileInputStream將文件讀到一個(gè) Byte數(shù)組中,然后把這個(gè)Byte數(shù)組作為參數(shù)傳進(jìn)RMI的方法中,然后在服務(wù)器端將Byte數(shù)組還原為outputStream,這樣就能通過(guò)RMI 來(lái)傳輸文件了

這樣做也有缺點(diǎn),就是無(wú)法檢驗(yàn)傳輸過(guò)來(lái)的數(shù)據(jù)的準(zhǔn)確性,汗。。。

下面我就一個(gè)實(shí)例來(lái)講解一下

文件結(jié)構(gòu)

如何利用java-RMI進(jìn)行大文件傳輸

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();             }         }     //這個(gè)方法比較重要,通過(guò)這個(gè)方法把一個(gè)名為filename的文件轉(zhuǎn)化為一個(gè)byte數(shù)組         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應(yīng)該是該文件存放在服務(wù)器端的地址         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();               }           }

看完上述內(nèi)容,你們對(duì)如何利用java-RMI進(jìn)行大文件傳輸有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

當(dāng)前名稱:如何利用java-RMI進(jìn)行大文件傳輸
網(wǎng)頁(yè)鏈接:http://muchs.cn/article42/isphhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、微信公眾號(hào)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)