Java RMI (Remote Method Invocation) একটি ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন ফ্রেমওয়ার্ক যা রিমোট অবজেক্টের মধ্যে ডেটা এবং মেথড অ্যাক্সেস করতে সাহায্য করে। RMI এর মাধ্যমে Serializable Object ব্যবহার করে ডেটা ট্রান্সফার করা সম্ভব। Serializable Object হল এমন একটি অবজেক্ট যা Serialization প্রক্রিয়া ব্যবহার করে একটি বাইট স্ট্রিমে রূপান্তরিত হতে পারে এবং নেটওয়ার্ক বা স্টোরেজ মিডিয়ার মাধ্যমে প্রেরণ করা যায়।
Serializable Interface
Java-এর Serializable ইন্টারফেস ব্যবহার করে একটি ক্লাসকে Serializable হিসেবে চিহ্নিত করা হয়। এটি একটি Marker Interface, যার কোনো মেথড ডিফাইন করা নেই। Serializable Object-কে RMI ব্যবহার করে সহজেই সার্ভার থেকে ক্লায়েন্ট বা ক্লায়েন্ট থেকে সার্ভারে প্রেরণ করা যায়।
Serializable Object তৈরি করার ধাপ:
- একটি ক্লাস
java.io.Serializableইন্টারফেস ইমপ্লিমেন্ট করবে। - ক্লাসের সমস্ত ফিল্ড Serializable হতে হবে (অ-Serializable ফিল্ডগুলো
transientহিসেবে চিহ্নিত করতে হবে)। - ডিফল্টভাবে Object Input/Output Streams ব্যবহার করে Serialization এবং Deserialization করা হবে।
উদাহরণ: Serializable Object এর মাধ্যমে ডেটা ট্রান্সফার
1. Remote Interface তৈরি করা
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface StudentService extends Remote {
// Serializable Object এর মাধ্যমে ডেটা ফেরত দেওয়ার মেথড
Student getStudentDetails(int id) throws RemoteException;
}
2. Serializable Object তৈরি করা
import java.io.Serializable;
// Serializable Object
public class Student implements Serializable {
private static final long serialVersionUID = 1L; // Serialization ID
private int id;
private String name;
private double gpa;
// Constructor
public Student(int id, String name, double gpa) {
this.id = id;
this.name = name;
this.gpa = gpa;
}
// Getter Methods
public int getId() {
return id;
}
public String getName() {
return name;
}
public double getGpa() {
return gpa;
}
// toString Method
@Override
public String toString() {
return "Student [ID=" + id + ", Name=" + name + ", GPA=" + gpa + "]";
}
}
3. Remote Object Implementation
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class StudentServiceImpl extends UnicastRemoteObject implements StudentService {
protected StudentServiceImpl() throws RemoteException {
super();
}
@Override
public Student getStudentDetails(int id) throws RemoteException {
// উদাহরণস্বরূপ একটি Student অবজেক্ট ফেরত দেওয়া হচ্ছে
return new Student(id, "John Doe", 3.8);
}
}
4. RMI Server তৈরি করা
import java.rmi.Naming;
public class Server {
public static void main(String[] args) {
try {
// Remote Object তৈরি
StudentServiceImpl service = new StudentServiceImpl();
// Remote Object RMI Registry-তে bind করা
Naming.rebind("StudentService", service);
System.out.println("RMI Server is running...");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
5. RMI Client তৈরি করা
import java.rmi.Naming;
public class Client {
public static void main(String[] args) {
try {
// RMI Registry থেকে Remote Object খুঁজে বের করা
StudentService service = (StudentService) Naming.lookup("rmi://localhost:1099/StudentService");
// Remote Method কল করে Serializable Object ফেরত নেওয়া
Student student = service.getStudentDetails(101);
// Serializable Object থেকে ডেটা প্রিন্ট করা
System.out.println("Received Student Details: " + student);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
Serialization এবং Deserialization প্রক্রিয়া
- Serialization:
- Serializable Object কে একটি ObjectOutputStream এর মাধ্যমে বাইট স্ট্রিম-এ রূপান্তর করা হয়।
- এটি Object এর পুরো অবস্থা সংরক্ষণ করে।
- Deserialization:
- বাইট স্ট্রিম থেকে Object কে পুনরুদ্ধার করতে ObjectInputStream ব্যবহার করা হয়।
- এটি Serializable Object পুনরায় তৈরি করে।
Serializable Object ব্যবহারের সুবিধা
- ডেটা ট্রান্সফার সহজতর করা:
Object কে সরাসরি নেটওয়ার্ক বা স্টোরেজ মিডিয়ার মাধ্যমে প্রেরণ করা যায়। - ডিস্ট্রিবিউটেড অ্যাপ্লিকেশনে ব্যবহার:
RMI এর মাধ্যমে Server থেকে Client এবং Client থেকে Server এ Object আদান-প্রদান করা যায়। - বহুমুখিতা:
কোনো Object এর অবস্থা সহজে সংরক্ষণ বা স্থানান্তরযোগ্য।
সতর্কতা
- Serialization Overhead:
Serialization এবং Deserialization প্রক্রিয়ায় পারফরম্যান্স ওভারহেড থাকতে পারে। - Security Risks:
Deserialization-এ অবজেক্ট পরিবর্তনের মাধ্যমে অরক্ষিত কোড চালানো হতে পারে। তাই শুধুমাত্র নির্ভরযোগ্য উত্সের ডেটা Deserialization করুন। - transient এবং static ফিল্ড:
transientফিল্ডগুলো Serialization-এ অন্তর্ভুক্ত হয় না, এবংstaticফিল্ডগুলো Class-এর অংশ হওয়ায় Serialize করা যায় না।
Java RMI-তে Serializable Object ব্যবহার করে ডেটা ট্রান্সফার একটি সাধারণ এবং কার্যকর উপায়। এটি ক্লাসের অবস্থা সংরক্ষণ এবং দূরবর্তী অবজেক্টের মধ্যে ডেটা আদান-প্রদানে সহায়তা করে। তবে Serialization সংক্রান্ত নিরাপত্তা এবং পারফরম্যান্সের বিষয়গুলো বিবেচনা করা উচিত।
Read more