Skill

RMI এর কাজের প্রক্রিয়া

জাভা আরএমআই (Java RMI) - Java Technologies

449

Java RMI (Remote Method Invocation) হলো একটি প্রযুক্তি যা জাভা প্রোগ্রামগুলোকে নেটওয়ার্কে থাকা অন্য জাভা প্রোগ্রামগুলোর মেথড কল করার অনুমতি দেয়। এটি একটি ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন তৈরি করতে সহায়ক, যেখানে ক্লায়েন্ট এবং সার্ভার একে অপরের সাথে রিমোট পদ্ধতির মাধ্যমে যোগাযোগ করতে পারে।


RMI এর মূল কাজের প্রক্রিয়া

RMI মূলত নিচের ধাপগুলোতে কাজ করে:

1. Stub এবং Skeleton এর ভূমিকা

  • Stub:
    • ক্লায়েন্ট সাইডে একটি প্রক্সি অবজেক্ট, যা সার্ভারের রিমোট অবজেক্টকে উপস্থাপন করে।
    • এটি RMI API ব্যবহার করে মেথড কলের অনুরোধ ফরম্যাট করে এবং সার্ভারে পাঠায়।
  • Skeleton:
    • সার্ভার সাইডে অবস্থিত, যা ক্লায়েন্ট থেকে আসা মেথড কল ডিকোড করে এবং সঠিক সার্ভার অবজেক্টে রুট করে।

2. Naming/Registry Service

  • RMI Registry সার্ভারের অবজেক্টগুলো ক্লায়েন্টকে অ্যাক্সেসযোগ্য করতে একটি রেজিস্ট্রিতে রেজিস্টার করে।
  • ক্লায়েন্ট সার্ভারের অবজেক্ট lookup() এর মাধ্যমে খুঁজে বের করে।

3. Serialization এবং Marshaling

  • Serialization: ডেটাকে এমনভাবে রূপান্তর করা, যাতে তা নেটওয়ার্কে প্রেরণযোগ্য হয়।
  • Marshaling: পদ্ধতি কলের প্যারামিটার এবং রিটার্ন ভ্যালুগুলোকে নেটওয়ার্কে পাঠানোর জন্য প্যাক করা।

4. Transport Layer

  • RMI এর Transport Layer ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ নিশ্চিত করে।
  • এটি TCP/IP প্রোটোকলের উপর ভিত্তি করে কাজ করে।

RMI এর কাজের ধাপসমূহ

Step 1: RMI Registry শুরু করা

  • RMI Registry সার্ভার অবজেক্টকে একটি নির্দিষ্ট নামের অধীনে রেজিস্টার করে। ক্লায়েন্ট এই রেজিস্ট্রিতে সংযোগ স্থাপন করে।

Step 2: Remote Interface তৈরি করা

  • একটি ইন্টারফেস তৈরি করা হয় যা রিমোট সার্ভিসের মেথডগুলো ডিক্লেয়ার করে।
  • এই ইন্টারফেসটি java.rmi.Remote ইন্টারফেস এক্সটেন্ড করে।

    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    public interface Calculator extends Remote {
        int add(int a, int b) throws RemoteException;
        int subtract(int a, int b) throws RemoteException;
    }
    

Step 3: Remote Object (Implementation Class) তৈরি করা

  • সার্ভারের পক্ষে রিমোট ইন্টারফেস ইমপ্লিমেন্ট করা হয়।

    import java.rmi.server.UnicastRemoteObject;
    import java.rmi.RemoteException;
    
    public class CalculatorImpl extends UnicastRemoteObject implements Calculator {
    
        protected CalculatorImpl() throws RemoteException {
            super();
        }
    
        @Override
        public int add(int a, int b) throws RemoteException {
            return a + b;
        }
    
        @Override
        public int subtract(int a, int b) throws RemoteException {
            return a - b;
        }
    }
    

Step 4: Server Class তৈরি করা

  • সার্ভার সাইডে রিমোট অবজেক্ট রেজিস্ট্রি সার্ভিসে রেজিস্টার করা হয়।

    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    public class Server {
        public static void main(String[] args) {
            try {
                // Create the remote object
                Calculator calculator = new CalculatorImpl();
    
                // Bind the object in the registry
                Registry registry = LocateRegistry.createRegistry(1099);
                registry.rebind("CalculatorService", calculator);
    
                System.out.println("Server is ready.");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

Step 5: Client Class তৈরি করা

  • ক্লায়েন্ট সাইডে রিমোট অবজেক্ট ব্যবহার করে মেথড কল করা হয়।

    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    public class Client {
        public static void main(String[] args) {
            try {
                // Locate the registry
                Registry registry = LocateRegistry.getRegistry("localhost", 1099);
    
                // Lookup the remote object
                Calculator calculator = (Calculator) registry.lookup("CalculatorService");
    
                // Call remote methods
                System.out.println("Addition: " + calculator.add(10, 20));
                System.out.println("Subtraction: " + calculator.subtract(30, 15));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

RMI কাজের প্রক্রিয়া (ডেটাফ্লো)

  1. Client Request Initiation: ক্লায়েন্ট একটি রিমোট মেথড কল করে।
  2. Stub Serialization এবং Marshaling:
    • Stub প্যারামিটার এবং মেথড কল প্যাকেট হিসেবে পরিবহন করে।
  3. Transport Layer Communication:
    • মেথড কল এবং প্যাকেটটি নেটওয়ার্কের মাধ্যমে সার্ভারে পাঠানো হয়।
  4. Skeleton Demarshaling এবং Execution:
    • Skeleton ইনকামিং রিকোয়েস্ট ডিকোড করে এবং সংশ্লিষ্ট মেথড কল করে।
  5. Result Serialization এবং Return:
    • রিটার্ন ভ্যালু ক্লায়েন্টে পাঠানোর জন্য প্যাকেট আকারে পরিবহন করা হয়।
  6. Client Deserialization এবং Display:
    • ক্লায়েন্ট প্যাকেট ডিকোড করে এবং রিটার্ন ভ্যালু ব্যবহার করে।

RMI এর সুবিধা

  1. Distributed Computing সহজ করে।
  2. Java Object Serialization সমর্থন করে।
  3. আলাদা Stub এবং Skeleton ব্যবস্থাপনার দরকার হয় না (RMI 2.0 থেকে)।
  4. Platform-independent Communication

RMI এর সীমাবদ্ধতা

  1. শুধুমাত্র জাভা-টু-জাভা কমিউনিকেশন সমর্থন করে।
  2. ফায়ারওয়াল এবং নেটওয়ার্ক নিরাপত্তা সমস্যার সম্মুখীন হতে পারে।
  3. JAR ফাইলের ভার্সন ম্যানেজমেন্ট সমস্যাযুক্ত হতে পারে।

RMI হলো জাভার একটি শক্তিশালী টুল যা রিমোট মেথড কলের মাধ্যমে ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন নির্মাণ সহজ করে। এর মাধ্যমে ক্লায়েন্ট এবং সার্ভার একে অপরের সাথে নেটওয়ার্কের মাধ্যমে কার্যকর যোগাযোগ স্থাপন করতে পারে। RMI ব্যবহারে Naming Service, Serialization, এবং Transport Layer Communication এর সঠিক জ্ঞান প্রয়োজন।

Content added By

Java RMI (Remote Method Invocation) হল একটি প্রযুক্তি যা একটি জাভা অ্যাপ্লিকেশন থেকে দূরবর্তী (remote) মেশিনে অবস্থিত একটি অবজেক্টের মেথড কল করার অনুমতি দেয়। এটি Distributed Applications তৈরিতে ব্যবহৃত হয়। RMI কাজ করার জন্য কিছু নির্দিষ্ট ধাপ অনুসরণ করতে হয়।


RMI এর কাজের ধাপগুলো

1. Interface তৈরি করা

RMI-তে, প্রথম ধাপ হল একটি Remote Interface তৈরি করা। এটি সেই মেথডগুলোকে ডিফাইন করে যেগুলো ক্লায়েন্ট রিমোট সার্ভারে কল করবে।

উদাহরণ:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
    String sayHello(String name) throws RemoteException;
}

2. Server Implementation তৈরি করা

Remote Interface এর একটি বাস্তবায়ন (implementation) তৈরি করা হয়। এই ক্লাসটি Remote Interface কে implements করে।

উদাহরণ:

import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;

public class HelloImpl extends UnicastRemoteObject implements Hello {
    protected HelloImpl() throws RemoteException {
        super();
    }

    @Override
    public String sayHello(String name) throws RemoteException {
        return "Hello, " + name + "!";
    }
}

3. Server তৈরি এবং Remote Object Bind করা

RMI Registry-তে Remote Object রেজিস্টার করা হয় যাতে ক্লায়েন্ট এটি খুঁজে পেতে পারে।

উদাহরণ:

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {
    public static void main(String[] args) {
        try {
            // Remote Object তৈরি
            HelloImpl obj = new HelloImpl();

            // RMI Registry শুরু করা
            Registry registry = LocateRegistry.createRegistry(1099);

            // Remote Object Bind করা
            registry.rebind("HelloService", obj);

            System.out.println("Server is ready!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. Client তৈরি করা

ক্লায়েন্ট RMI Registry থেকে রিমোট অবজেক্ট খুঁজে বের করে এবং মেথড কল করে।

উদাহরণ:

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {
    public static void main(String[] args) {
        try {
            // RMI Registry থেকে রিমোট অবজেক্ট খুঁজে বের করা
            Registry registry = LocateRegistry.getRegistry("localhost", 1099);
            Hello stub = (Hello) registry.lookup("HelloService");

            // রিমোট মেথড কল করা
            String response = stub.sayHello("John");
            System.out.println("Response from server: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. RMI Registry চালু করা

RMI Registry চালু করার জন্য rmiregistry কমান্ড ব্যবহার করতে হয়:

rmiregistry

6. Server এবং Client কোড চালানো

  1. Server চালান:

    java Server
    
  2. Client চালান:

    java Client
    

RMI কাজের পূর্ণাঙ্গ ধাপ:

  1. Interface তৈরি করা: ক্লায়েন্ট-সার্ভারের মধ্যে Remote মেথডের জন্য একটি ইন্টারফেস তৈরি করুন।
  2. Implementation তৈরি করা: Remote Interface এর বাস্তবায়ন করুন।
  3. Registry তৈরি এবং Bind করা: সার্ভারে অবজেক্ট রেজিস্টার করুন।
  4. Client তৈরি করা: RMI Registry থেকে রিমোট অবজেক্ট পান এবং মেথড কল করুন।
  5. RMI Registry চালু করা: RMI Registry চালু করুন।
  6. Server এবং Client চালান।

RMI এর সুবিধা:

  1. Distributed Systems: বিভিন্ন মেশিনের মধ্যে যোগাযোগ সহজ করে।
  2. Abstract Communication: ক্লায়েন্ট-সার্ভার কমিউনিকেশন সহজ এবং ব্যবহারকারী থেকে কমপ্লেক্সিটি গোপন থাকে।
  3. Java-to-Java Communication: পুরোপুরি জাভা বেসড পরিবেশে ব্যবহার করা যায়।

RMI এর সীমাবদ্ধতা:

  1. শুধুমাত্র জাভা অ্যাপ্লিকেশনগুলোর মধ্যে কাজ করে।
  2. Security এবং Firewall সমস্যা হতে পারে।
  3. অন্যান্য Distributed Technologies এর তুলনায় তুলনামূলকভাবে ধীর।
Content added By

Java RMI (Remote Method Invocation) হল একটি প্রযুক্তি যা জাভার মাধ্যমে বিভিন্ন JVM (Java Virtual Machine) এর মধ্যে দূরবর্তী পদ্ধতি (Remote Methods) কল করতে সক্ষম করে। RMI ব্যবহারের মূল ধারণা হল, একটি JVM এ চলমান একটি অবজেক্টের পদ্ধতি অন্য JVM থেকে কল করা যায়। RMI এর মধ্যে Stub এবং Skeleton গুরুত্বপূর্ণ ভূমিকা পালন করে।


Stub এবং Skeleton কী?

  1. Stub:
    • Stub হল ক্লায়েন্ট সাইড প্রক্সি অবজেক্ট, যা রিমোট অবজেক্টের একটি লুকানো প্রতিনিধি।
    • ক্লায়েন্ট যখন কোনো রিমোট মেথড কল করে, Stub সেই মেথড কল ধরে এবং এটিকে নেটওয়ার্কের মাধ্যমে সার্ভারে পাঠায়।
    • Stub মূলত:
      • মেথড প্যারামিটারগুলিকে সিরিয়ালাইজ করে (serialize)।
      • নেটওয়ার্কের মাধ্যমে রিমোট মেথড কল সার্ভারে পাঠায়।
      • সার্ভার থেকে রিটার্ন করা মান বা এক্সসেপশন গ্রহণ করে এবং ক্লায়েন্টকে রিটার্ন করে।
  2. Skeleton:
    • Skeleton হল সার্ভার সাইড প্রক্সি অবজেক্ট, যা Stub থেকে আসা কল গ্রহণ করে।
    • Skeleton মূলত:
      • Stub থেকে আসা ডেটা ডিসিরিয়ালাইজ করে (deserialize)।
      • সার্ভারে সংশ্লিষ্ট রিমোট অবজেক্টে মেথড কল ফরোয়ার্ড করে।
      • রিমোট মেথড থেকে রিটার্ন হওয়া মান বা এক্সসেপশন Stub এ পাঠিয়ে দেয়।

Stub এবং Skeleton এর কাজের ধাপ

  1. ক্লায়েন্ট মেথড কল:
    • ক্লায়েন্ট একটি রিমোট মেথড কল করে। Stub এই কল গ্রহণ করে।
  2. মেথড কল সিরিয়ালাইজেশন:
    • Stub কল করা মেথডের প্যারামিটারগুলিকে সিরিয়ালাইজ করে এবং নেটওয়ার্কের মাধ্যমে Skeleton এর কাছে পাঠায়।
  3. Skeleton ডিসিরিয়ালাইজেশন:
    • Skeleton Stub থেকে আসা ডেটাকে ডিসিরিয়ালাইজ করে।
  4. রিমোট অবজেক্টে মেথড কল:
    • Skeleton রিমোট অবজেক্টে সংশ্লিষ্ট মেথড কল করে।
  5. ফলাফল (Result) পাঠানো:
    • মেথড কল শেষে Skeleton এর মাধ্যমে রিটার্ন মান Stub এ ফিরে যায়।
    • Stub ফলাফলটি ক্লায়েন্টকে প্রদান করে।

উদাহরণ: Stub এবং Skeleton এর ভূমিকা

1. Stub উদাহরণ

public interface MyRemote extends java.rmi.Remote {
    String sayHello() throws java.rmi.RemoteException;
}
public class MyRemoteImpl extends java.rmi.server.UnicastRemoteObject implements MyRemote {
    public MyRemoteImpl() throws java.rmi.RemoteException {
        super();
    }

    @Override
    public String sayHello() {
        return "Hello from RMI Server!";
    }
}

Stub এর কাজ:

  • ক্লায়েন্ট যখন sayHello() মেথড কল করে, Stub এই কল গ্রহণ করে এবং Skeleton এর কাছে পাঠায়।

2. Skeleton উদাহরণ

// Skeleton (সার্ভার সাইডে) Stub থেকে কল গ্রহণ করে:
public static void main(String[] args) {
    try {
        MyRemoteImpl server = new MyRemoteImpl();
        java.rmi.Naming.rebind("RemoteHello", server);
        System.out.println("RMI Server is ready.");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Skeleton এর কাজ:

  • Stub থেকে sayHello() কল গ্রহণ করে এবং MyRemoteImpl অবজেক্টে মেথড চালায়।

Java RMI (Stub এবং Skeleton এর প্রক্রিয়া)

ধাপ ১: Stub থেকে Skeleton এর ডেটা পাঠানো

  1. ক্লায়েন্ট sayHello() কল করে।
  2. Stub মেথড কল ও প্যারামিটার সিরিয়ালাইজ করে এবং নেটওয়ার্কের মাধ্যমে Skeleton এ পাঠায়।

ধাপ ২: Skeleton এর মাধ্যমে রিমোট অবজেক্টে কাজ সম্পন্ন

  1. Skeleton সিরিয়ালাইজড ডেটা গ্রহণ করে এবং ডেসিরিয়ালাইজ করে।
  2. Skeleton রিমোট অবজেক্টের সংশ্লিষ্ট মেথড কল চালায়।

ধাপ ৩: ফলাফল Stub এ পাঠানো

  1. Skeleton রিটার্ন মান গ্রহণ করে।
  2. Stub রিটার্ন মান ক্লায়েন্টে পাঠায়।

Stub এবং Skeleton এর ভবিষ্যৎ (Java 1.5 এর পরবর্তী পরিবর্তন)

Java RMI এর প্রাথমিক সংস্করণগুলিতে Stub এবং Skeleton আলাদা ক্লাস হিসাবে বিদ্যমান ছিল। তবে, Java 1.5 (JDK 5.0) এর পর থেকে Skeleton এর ভূমিকা সরাসরি JVM এর দ্বারা পরিচালিত হয়। বর্তমানে:

  1. Stub নিজেই Skeleton এর কিছু কাজ করে।
  2. Dynamic Proxy ব্যবহারের মাধ্যমে Skeleton এর সরাসরি প্রয়োজনীয়তা কমে গেছে।

Stub প্রজন্ম:

  • Java 5.0 এর পর, Stub জেনারেট করার জন্য rmic কমান্ড আর প্রয়োজন হয় না। এটি Dynamic Proxy ব্যবহার করে স্বয়ংক্রিয়ভাবে তৈরি হয়।

Stub এবং Skeleton হল Java RMI এর মূল উপাদান যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের মাধ্যম হিসেবে কাজ করে:

  1. Stub ক্লায়েন্টের পক্ষ থেকে রিমোট মেথড কল পরিচালনা করে।
  2. Skeleton সার্ভারের পক্ষ থেকে Stub এর কল প্রসেস করে।

Java RMI এর ডায়নামিক প্রক্সি এবং নতুন সংস্করণগুলো Stub এবং Skeleton এর ব্যবস্থাপনা আরও সহজ ও কার্যকর করেছে।

Content added By

জাভার RMI (Remote Method Invocation) একটি টেকনোলজি যা প্রোগ্রামারদের বিভিন্ন JVM (Java Virtual Machine) এর মধ্যে মেথড কল করতে দেয়, ঠিক যেভাবে একটি লকল মেথড কল করা হয়। RMI-তে RMI Registry এবং Remote Object এই দুটি গুরুত্বপূর্ণ উপাদান রয়েছে।


RMI Registry এর ধারণা

RMI Registry হলো একটি সার্ভার প্রোগ্রাম যা একটি কেন্দ্রীয় স্থান সরবরাহ করে যেখানে Remote Object রেজিস্টার করা হয়। ক্লায়েন্টরা RMI Registry-এর মাধ্যমে রিমোট অবজেক্টের রেফারেন্স পায় এবং সেই রিমোট অবজেক্ট ব্যবহার করে সার্ভারের সাথে যোগাযোগ করে।

RMI Registry এর বৈশিষ্ট্য:

  1. Remote Object Binding: রিমোট অবজেক্ট একটি নির্দিষ্ট নামের সাথে রেজিস্টার করা হয় (binding)।
  2. Lookup Mechanism: ক্লায়েন্ট নির্দিষ্ট নাম ব্যবহার করে রিমোট অবজেক্ট খুঁজে পায়।
  3. Naming Service: এটি এক ধরনের নামকরণ পরিষেবা যা অবজেক্টকে একটি সহজবোধ্য এবং ইউনিক নাম দেয়।
  4. Standard Port: RMI Registry সাধারণত 1099 পোর্টে রান করে।

Remote Object এর ধারণা

Remote Object হলো একটি অবজেক্ট যা একটি JVM থেকে অন্য একটি JVM-এ মেথড কল গ্রহণ করতে পারে। এই অবজেক্টগুলি বিশেষভাবে RMI Remote Interface ইমপ্লিমেন্ট করে এবং রিমোট ক্লাস হিসেবে চিহ্নিত হয়।

Remote Object এর বৈশিষ্ট্য:

  1. Remote Interface: এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের জন্য একটি কন্ট্রাক্ট প্রদান করে।
  2. Serialization: Remote Object এর ডেটা নেটওয়ার্কের মাধ্যমে পাঠানোর জন্য Serialization ব্যবহার করে।
  3. Stub এবং Skeleton: ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের জন্য Stub এবং Skeleton ব্যবহার করা হয়।
    • Stub: ক্লায়েন্টের জন্য একটি প্রক্সি অবজেক্ট যা সার্ভারে মেথড কল ফরওয়ার্ড করে।
    • Skeleton: সার্ভারে Stub থেকে আসা রিকোয়েস্ট প্রসেস করে।

RMI Registry এবং Remote Object এর কাজের প্রবাহ

  1. Server Side:
    • একটি Remote Interface তৈরি করা হয়।
    • Remote Object সেই ইন্টারফেস ইমপ্লিমেন্ট করে।
    • Remote Object RMI Registry-তে একটি নির্দিষ্ট নাম দিয়ে রেজিস্টার করা হয়।
  2. Client Side:
    • ক্লায়েন্ট RMI Registry থেকে Remote Object-এর রেফারেন্স পায়।
    • রেফারেন্স ব্যবহার করে ক্লায়েন্ট রিমোট মেথড কল করে।

RMI Registry এবং Remote Object এর উদাহরণ

Step 1: Remote Interface তৈরি

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyRemote extends Remote {
    String sayHello() throws RemoteException;
}

Step 2: Remote Object ইমপ্লিমেন্টেশন

import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
    protected MyRemoteImpl() throws RemoteException {
        super();
    }

    @Override
    public String sayHello() throws RemoteException {
        return "Hello from the Remote Object!";
    }
}

Step 3: Server Side Implementation

import java.rmi.Naming;

public class RMIServer {
    public static void main(String[] args) {
        try {
            // Remote Object তৈরি
            MyRemote remoteObject = new MyRemoteImpl();

            // RMI Registry-তে Remote Object রেজিস্টার
            Naming.rebind("rmi://localhost:1099/RemoteHello", remoteObject);

            System.out.println("Remote Object is registered and ready.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Step 4: Client Side Implementation

import java.rmi.Naming;

public class RMIClient {
    public static void main(String[] args) {
        try {
            // RMI Registry থেকে Remote Object রেফারেন্স নেওয়া
            MyRemote remoteObject = (MyRemote) Naming.lookup("rmi://localhost:1099/RemoteHello");

            // Remote Method কল করা
            String message = remoteObject.sayHello();
            System.out.println("Received from server: " + message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

RMI Registry চালু করার ধাপ

  1. RMI Registry শুরু করা:

    rmiregistry
    
  2. Server Side কোড রান করা:

    java RMIServer
    
  3. Client Side কোড রান করা:

    java RMIClient
    

Stub এবং Skeleton এর কাজ

RMI ব্যবহারকারীকে সরাসরি নেটওয়ার্কের কাজ বুঝতে হয় না। Stub এবং Skeleton ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ সহজ করা হয়:

  • Stub: ক্লায়েন্টের জন্য একটি প্রক্সি হিসেবে কাজ করে।
  • Skeleton: সার্ভারের জন্য ইনকামিং রিকোয়েস্ট প্রসেস করে।

  • RMI Registry হলো Remote Object রেজিস্টার এবং ক্লায়েন্টের জন্য সহজলভ্য করার একটি কেন্দ্রীয় স্থান।
  • Remote Object হলো এমন অবজেক্ট যা দূরবর্তী JVM থেকে অ্যাক্সেসযোগ্য।
  • RMI প্রযুক্তি বিতরণকৃত সিস্টেম তৈরির জন্য একটি কার্যকর সমাধান, যেখানে বিভিন্ন JVM একে অপরের সাথে ইন্টারঅ্যাক্ট করতে পারে।
Content added By

Java RMI (Remote Method Invocation) হল একটি মেকানিজম যা ব্যবহার করে একটি জাভা অ্যাপ্লিকেশন একটি রিমোট মেশিনে অবস্থিত অবজেক্টের মেথডকে কল করতে পারে। এটি Distributed Systems-এর গুরুত্বপূর্ণ অংশ এবং Client-SideServer-Side এর মধ্যে সরাসরি যোগাযোগ স্থাপন করতে সাহায্য করে।


Java RMI এর মূল ধারণা

  1. RMI Server:
    • রিমোট সার্ভারে অবজেক্ট তৈরি করে এবং ক্লায়েন্টের জন্য এটি প্রকাশ করে।
    • রিমোট মেথড বাস্তবায়ন করে।
  2. RMI Client:
    • সার্ভারের রিমোট অবজেক্ট ব্যবহার করে মেথড কল করে।
  3. RMI Registry:
    • একটি সার্ভার সাইড রেজিস্ট্রি যেখানে রিমোট অবজেক্টগুলো bind করা থাকে এবং ক্লায়েন্ট এটি ব্যবহার করে রিমোট অবজেক্টকে খুঁজে বের করে।
  4. Stubs এবং Skeletons:
    • Stub: ক্লায়েন্ট সাইডে রিমোট অবজেক্টের একটি প্রক্সি। এটি মেথড কলকে সার্ভারে পাঠায়।
    • Skeleton: সার্ভার সাইডে মেথড কল গ্রহণ করে এবং এর বাস্তবায়নকে পরিচালনা করে (Java 5 থেকে Skeleton অপ্রচলিত হয়েছে)।

RMI এর জন্য প্রয়োজনীয় ধাপসমূহ

1. Interface তৈরি করুন (Remote Interface)

রিমোট অবজেক্টে কল করা যাবে এমন মেথডগুলো ডিফাইন করুন।

2. Server-Side Implementation তৈরি করুন

রিমোট ইন্টারফেসের মেথডগুলোর বাস্তবায়ন করুন।

3. Client-Side Implementation তৈরি করুন

সার্ভারের রিমোট অবজেক্ট ব্যবহার করে প্রয়োজনীয় কাজ করুন।

4. RMI Registry চালান

সার্ভারের রিমোট অবজেক্ট RMI Registry-তে bind করুন।


RMI উদাহরণ: Client এবং Server এর মধ্যে যোগাযোগ

1. Remote Interface তৈরি করা

import java.rmi.Remote;
import java.rmi.RemoteException;

// Remote Interface
public interface HelloService extends Remote {
    String sayHello(String name) throws RemoteException;
}

2. Server-Side Implementation

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

// Server-Side Implementation
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {
    public HelloServiceImpl() throws RemoteException {
        super();
    }

    @Override
    public String sayHello(String name) throws RemoteException {
        return "Hello, " + name + "!";
    }
}

3. RMI Server চালু করা

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {
    public static void main(String[] args) {
        try {
            // Create and export a remote object
            HelloService helloService = new HelloServiceImpl();

            // Bind the remote object in the RMI registry
            Registry registry = LocateRegistry.createRegistry(1099);
            registry.bind("HelloService", helloService);

            System.out.println("Server is running...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. RMI Client তৈরি করা

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {
    public static void main(String[] args) {
        try {
            // Get the RMI registry
            Registry registry = LocateRegistry.getRegistry("localhost", 1099);

            // Look up the remote object
            HelloService helloService = (HelloService) registry.lookup("HelloService");

            // Call the remote method
            String response = helloService.sayHello("Java RMI");
            System.out.println("Response from Server: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

RMI স্ট্রাকচার এবং ওয়ার্কফ্লো

  1. Server-side Work:
    • রিমোট অবজেক্ট তৈরি এবং RMI Registry-তে bind করা।
  2. Client-side Work:
    • RMI Registry থেকে রিমোট অবজেক্ট খুঁজে বের করা এবং মেথড কল করা।
  3. Communication Flow:
    • ক্লায়েন্ট সাইডে Stub মেথড কল রিমোট সার্ভারে পাঠায়।
    • সার্ভার মেথড প্রক্রিয়াকরণ করে ফলাফল ক্লায়েন্টে ফেরত পাঠায়।

RMI এর সুবিধা

  1. Distributed Systems তৈরি সহজ হয়
  2. ক্লায়েন্ট এবং সার্ভারের মধ্যে Low-Level Networking লুকিয়ে রাখে।
  3. Object-Oriented Approach সমর্থন করে।
  4. কোড পুনঃব্যবহারযোগ্য এবং রিমোট মেথড কলে টাইপ সেফটি নিশ্চিত করে।

RMI এর সীমাবদ্ধতা

  1. শুধুমাত্র জাভা-জাভা যোগাযোগের জন্য ব্যবহৃত হয়।
  2. Firewall এবং Network Configuration সমস্যার সম্মুখীন হতে পারে।
  3. কনফিগারেশন ও ডিপ্লয়মেন্ট প্রক্রিয়া জটিল।

Java RMI ক্লায়েন্ট এবং সার্ভারের মধ্যে Distributed Object Communication নিশ্চিত করার জন্য একটি শক্তিশালী টুল। এটি Remote Method Invocation সহজ করে এবং Object-Oriented Programming এর সঙ্গে একত্রে কাজ করে। RMI ব্যবহার করলে ক্লায়েন্ট-সার্ভার মডেল আরও কার্যকর ও টাইপ-সেফ হয়ে ওঠে।

Content added By
Promotion

Are you sure to start over?

Loading...