Mengapa menggunakan RMI
Dalam proyek ini, saya memikirkan banyak cara untuk berkomunikasi antara klien dan server. Karena saya sedang mengerjakan aplikasi klien yang kaya, saya akhirnya memilih teknologi antara RMI dan soket Java. Baik klien maupun server harus ditulis dalam Java, namun lebih nyaman digunakan. Di sisi lain, soket java, meskipun lebih fleksibel, perlu menentukan protokol komunikasi antara server dan klien. Cukup merepotkan. Setelah menimbang beberapa kali, akhirnya saya memilih RMI untuk komunikasi server-client.
Masalah pengunggahan file
Dalam proses menggunakan java-rmi, Anda pasti akan menemui masalah pengunggahan file. Karena aliran file tidak dapat ditransmisikan di rmi (misalnya, parameter metode di rmi tidak boleh FileInputStream dan sejenisnya), maka kita harus memilih kompromi Cara terbaik adalah dengan terlebih dahulu menggunakan FileInputStream untuk membaca file ke dalam array Byte, kemudian meneruskan array Byte ini sebagai parameter ke dalam metode RMI, dan kemudian mengembalikan array Byte ke outputStream di sisi server, sehingga dapat menjadi. melewati RMI Ayo transfer file
Hal ini juga mempunyai kelemahan yaitu keakuratan data yang dikirimkan tidak dapat diverifikasi.
Izinkan saya menjelaskannya dengan contoh di bawah ini.
Klien File
Copy kode kodenya sebagai berikut:
paket rmiupload;
impor java.io.BufferedInputStream;
impor java.io.File;
impor java.io.FileInputStream;
impor java.io.FileNotFoundException;
impor java.io.IOException;
impor java.net.MalformedURLException;
import java.rmi.Penamaan;
impor java.rmi.NotBoundException;
impor java.rmi.RemoteException;
Klien File kelas publik {
Klien File publik() {
// TODO Stub konstruktor yang dibuat secara otomatis
}
public static void main(String[] args) {
mencoba {
FileDataService fileDataService = (FileDataService) Penamaan.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 Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
//Metode ini lebih penting. Melalui metode ini, file bernama nama file diubah menjadi array byte.
byte pribadi[] fileToByte(String nama file){
byte[] b = nol;
mencoba {
File file = File baru (nama file);
b = byte baru[(int) file.panjang()];
BufferedInputStream adalah = BufferedInputStream baru(FileInputStream(file) baru);
adalah.baca(b);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
kembali b;
}
}
Layanan FileData
paket rmiupload;
impor java.net.URL;
impor java.rmi.Remote;
impor java.rmi.RemoteException;
antarmuka publik FileDataService memperluas Remote{
//Nama file di sini harus berupa alamat tempat file disimpan di sisi server
unggahan kekosongan publik (nama file string, file byte[]) menampilkan RemoteException;
}
FileDataService_imp
Copy kode kodenya sebagai berikut:
paket rmiupload;
impor java.io.BufferedOutputStream;
impor java.io.File;
impor java.io.FileNotFoundException;
impor java.io.FileOutputStream;
impor java.io.IOException;
impor java.net.URL;
impor java.rmi.RemoteException;
impor java.rmi.server.RMIClientSocketFactory;
impor java.rmi.server.RMIServerSocketFactory;
impor java.rmi.server.UnicastRemoteObject;
kelas publik FileDataService_imp memperluas UnicastRemoteObject mengimplementasikan FileDataService{
public FileDataService_imp() menampilkan RemoteException {
}
@Mengesampingkan
unggahan kekosongan publik (nama file string, byte[] konten file) menampilkan RemoteException{
File file = File baru (nama file);
mencoba {
jika (!file.ada())
file.createNewFile();
BufferedOutputStream os = BufferedOutputStream baru(FileOutputStream(file) baru);
os.write(isi file);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
;
}
Server File
Copy kode kodenya sebagai berikut:
paket rmiupload;
impor java.net.MalformedURLException;
import java.rmi.Penamaan;
impor java.rmi.RemoteException;
impor java.rmi.registry.LocateRegistry;
FileServer kelas publik {
FileDataService fileDataService;
Server File publik() {
mencoba {
fileDataService = FileDataService_imp baru();
LocateRegistry.createRegistry(9001);
Penamaan.rebind("rmi://localhost:9001/FileDataService", fileDataService);
} tangkapan (RemoteException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
} tangkapan (MalformedURLException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
/**
* @param argumen
*/
public static void main(String[] args) {
FileServer baru();
}
}