溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2021-10-29 17:03:37 來源:億速云 閱讀:99 作者:柒染 欄目:編程語言

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

為什么要用RMI

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

文件上傳問題

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

這樣做也有缺點,就是無法檢驗傳輸過來的數(shù)據(jù)的準(zhǔn)確性,汗。。。

下面我就一個實例來講解一下

文件結(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();             }         }     //這個方法比較重要,通過這個方法把一個名為filename的文件轉(zhuǎn)化為一個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)容,你們對如何利用java-RMI進(jìn)行大文件傳輸有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI