Warum RMI verwenden?
In diesem Projekt habe ich über viele Möglichkeiten nachgedacht, zwischen Client und Server zu kommunizieren. Da ich an einer Rich-Client-Anwendung gearbeitet habe, habe ich mich schließlich für die Technologie zwischen RMI und Java-Sockets entschieden. Die Flexibilität ist nicht hoch. Sowohl der Client als auch der Server müssen in Java geschrieben sein, aber die Verwendung ist bequemer. Andererseits müssen Java-Sockets, obwohl sie flexibler sind, das Kommunikationsprotokoll zwischen dem Server und dem Client definieren. Das ist ziemlich mühsam. Nach mehrmaligem Abwägen habe ich mich schließlich für RMI für die Server-Client-Kommunikation entschieden.
Problem beim Hochladen der Datei
Bei der Verwendung von Java-RMI treten zwangsläufig Probleme beim Hochladen von Dateien auf. Da Dateiströme nicht in RMI übertragen werden können (z. B. können die Methodenparameter in RMI nicht FileInputStream sein), müssen wir einen Kompromiss wählen Der beste Weg besteht darin, die Datei zunächst mit FileInputStream in ein Byte-Array einzulesen, dieses Byte-Array dann als Parameter an die RMI-Methode zu übergeben und das Byte-Array dann in einem OutputStream auf der Serverseite wiederherzustellen, damit es möglich ist durch RMI geleitet Lassen Sie uns Dateien übertragen
Dies hat auch den Nachteil, dass die Richtigkeit der übermittelten Daten nicht überprüft werden kann.
Lassen Sie es mich unten anhand eines Beispiels erklären.
FileClient
Kopieren Sie den Codecode wie folgt:
Paket rmiupload;
import java.io.BufferedInputStream;
java.io.File importieren;
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;
öffentliche Klasse FileClient {
public FileClient() {
// TODO Automatisch generierter Konstruktor-Stub
}
public static void main(String[] args) {
versuchen {
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 Automatisch generierter Catch-Block
e.printStackTrace();
}
}
//Diese Methode ist wichtiger. Durch diese Methode wird eine Datei mit dem Namen Dateiname in ein Byte-Array konvertiert.
privates Byte[] fileToByte(String Dateiname){
byte[] b = null;
versuchen {
Datei file = neue Datei(Dateiname);
b = neues Byte[(int) file.length()];
BufferedInputStream is = new BufferedInputStream(new FileInputStream(file));
is.read(b);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
Rückkehr b;
}
}
FileDataService
Paket rmiupload;
java.net.URL importieren;
import java.rmi.Remote;
import java.rmi.RemoteException;
öffentliche Schnittstelle FileDataService erweitert Remote{
//Der Dateiname hier sollte die Adresse sein, an der die Datei auf der Serverseite gespeichert ist
public void upload(String filename, byte[] file) löst RemoteException aus;
}
FileDataService_imp
Kopieren Sie den Codecode wie folgt:
Paket rmiupload;
import java.io.BufferedOutputStream;
java.io.File importieren;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
java.net.URL importieren;
import java.rmi.RemoteException;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
Die öffentliche Klasse FileDataService_imp erweitert UnicastRemoteObject und implementiert FileDataService{
public FileDataService_imp() löst RemoteException {
}
@Override
public void upload(String filename, byte[] fileContent) wirft RemoteException{
Datei file = neue Datei(Dateiname);
versuchen {
if (!file.exists())
file.createNewFile();
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));
os.write(fileContent);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
; }
}
FileServer
Kopieren Sie den Codecode wie folgt:
Paket rmiupload;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
öffentliche Klasse FileServer {
FileDataService fileDataService;
öffentlicher FileServer() {
versuchen {
fileDataService = new FileDataService_imp();
LocateRegistry.createRegistry(9001);
Naming.rebind("rmi://localhost:9001/FileDataService", fileDataService);
} Catch (RemoteException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
} Catch (MalformedURLException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
neuer FileServer();
}
}