لماذا استخدام RMI؟
في هذا المشروع، فكرت في طرق عديدة للتواصل بين العميل والخادم، نظرًا لأنني كنت أعمل على تطبيق عميل غني، فقد اخترت أخيرًا التكنولوجيا بين RMI وJava-sockets، ومن بينها أن RMI ليست عالية المرونة. يجب كتابة كل من العميل والخادم بلغة Java، ولكنها أكثر ملاءمة للاستخدام. من ناحية أخرى، تحتاج مآخذ Java، على الرغم من أنها أكثر مرونة، إلى تحديد بروتوكول الاتصال بين الخادم والعميل. إنه أمر مزعج للغاية، وبعد تقييمه عدة مرات، اخترت أخيرًا RMI للتواصل بين الخادم والعميل.
مشكلة في تحميل الملف
في عملية استخدام Java-RMI، ستواجه حتمًا مشكلة في تحميل الملفات نظرًا لأنه لا يمكن نقل تدفقات الملفات في RMI (على سبيل المثال، لا يمكن أن تكون معلمات الطريقة في RMI هي FileInputStream وما شابه ذلك)، لذا يتعين علينا اختيار حل وسط. أفضل طريقة هي استخدام FileInputStream أولاً لقراءة الملف في صفيف Byte، ثم تمرير صفيف Byte هذا كمعلمة في طريقة RMI، ثم استعادة صفيف Byte إلى OutputStream على جانب الخادم، بحيث يمكن أن يكون كذلك. مرت عبر RMI دعونا نقل الملفات
وهذا أيضًا له عيب يتمثل في أنه لا يمكن التحقق من دقة البيانات المرسلة.
اسمحوا لي أن أشرح ذلك مع المثال أدناه.
FileClient
انسخ رمز الكود كما يلي:
حزمة rmiupload؛
import java.io.BufferedInputStream;
استيراد java.io.File؛
استيراد 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;
فئة عامة FileClient {
عميل الملف العام () {
// TODO كعب المنشئ الذي تم إنشاؤه تلقائيًا
}
public static void main(String[] args) {
يحاول {
FileDataService fileDataService = (FileDataService) Naming.lookup("rmi://localhost:9001/FileDataService");
fileDataService.upload("/Users/NeverDie/Documents/test.mp4", new FileClient().fileToByte("/Users/NeverDie/Music/test.mp4"));
} قبض على (MalformedURLException | RemoteException | NotBoundException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
// هذه الطريقة أكثر أهمية، حيث يتم تحويل الملف المسمى filename إلى مصفوفة بايت.
البايت الخاص[] fileToByte(اسم ملف السلسلة){
بايت[] ب = فارغ؛
يحاول {
ملف الملف = ملف جديد (اسم الملف)؛
ب = بايت جديد[(int) file.length()];
BufferedInputStream is = new BufferedInputStream(new FileInputStream(file));
is.read(ب);
} قبض على (FileNotFoundException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
العودة ب؛
}
}
FileDataService
حزمة rmiupload؛
استيراد java.net.URL؛
import java.rmi.Remote;
import java.rmi.RemoteException;
الواجهة العامة FileDataService تمتد عن بعد {
// يجب أن يكون اسم الملف هنا هو العنوان الذي تم تخزين الملف فيه على جانب الخادم
تحميل الفراغ العام (اسم ملف السلسلة، ملف البايت []) يطرح RemoteException؛
}
FileDataService_imp
انسخ رمز الكود كما يلي:
حزمة rmiupload؛
import java.io.BufferedOutputStream;
استيراد java.io.File؛
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
استيراد java.net.URL؛
import java.rmi.RemoteException;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
الطبقة العامة FileDataService_imp تمتد UnicastRemoteObject تنفذ FileDataService{
يطرح FileDataService_imp () العام RemoteException {
}
@تجاوز
تحميل الفراغ العام (اسم ملف السلسلة، بايت [] fileContent) يطرح RemoteException {
ملف الملف = ملف جديد (اسم الملف)؛
يحاول {
إذا (! file.exists())
file.createNewFile();
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));
os.write(fileContent);
} قبض على (FileNotFoundException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
}
خادم الملفات
انسخ رمز الكود كما يلي:
حزمة rmiupload؛
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
خادم ملفات الطبقة العامة {
FileDataService fileDataService;
خادم الملفات العام () {
يحاول {
fileDataService = new FileDataService_imp();
LocateRegistry.createRegistry(9001);
Naming.rebind("rmi://localhost:9001/FileDataService", fileDataService);
} قبض على (RemoteException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} التقاط (MalformedURLException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
خادم الملفات الجديد () ؛
}
}