TCP Networking with SocketChannel

Java Technologies - জাভা নিও (Java Nio)
98
98

Java NIO (New Input/Output) এর মাধ্যমে আপনি TCP সকারেট প্রোটোকল ব্যবহার করে নেটওয়ার্ক কমিউনিকেশন পরিচালনা করতে পারেন। SocketChannel হল Java NIO এর একটি কম্পোনেন্ট যা সোসকেটের মাধ্যমে TCP/IP নেটওয়ার্ক যোগাযোগ প্রতিষ্ঠিত করে। এটি ব্লকিং এবং নন-ব্লকিং মোডে কাজ করতে পারে, যা কার্যকরী এবং দ্রুত I/O অপারেশন পরিচালনা করতে সহায়ক।

এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Java NIO এর SocketChannel ব্যবহার করে TCP নেটওয়ার্কিং করা যায়।


SocketChannel কী?

SocketChannel একটি Java NIO ক্লাস যা নেটওয়ার্কিং অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। এটি Socket ক্লাসের একটি নন-ব্লকিং সংস্করণ, যা TCP/IP প্রোটোকলে ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশন তৈরি করতে সক্ষম। এটি দুটি মোডে কাজ করতে পারে:

  1. Blocking mode: যেখানে এক সময় একটি অপারেশন সম্পন্ন হওয়া পর্যন্ত থ্রেড অপেক্ষা করে।
  2. Non-blocking mode: যেখানে থ্রেড কোন অপারেশন সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা না করে অন্যান্য কাজ করতে পারে।

TCP Networking with SocketChannel

১. SocketChannel দিয়ে সার্ভার তৈরি করা

TCP সার্ভার তৈরি করতে ServerSocketChannel ব্যবহার করা হয়, যা ক্লায়েন্টের সংযোগ গ্রহণ করে। একটি SocketChannel এ সংযোগ করা হয়, যাতে ক্লায়েন্টের সাথে ডেটা আদান-প্রদান করা যায়।

উদাহরণ: TCP Server with ServerSocketChannel

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.*;

public class TCPServerExample {
    public static void main(String[] args) throws IOException {
        // সার্ভারের পোর্ট নম্বর
        int port = 12345;
        
        // ServerSocketChannel তৈরি
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(port));
        
        // ক্লায়েন্ট সংযোগ গ্রহণ
        System.out.println("Server is waiting for a connection...");
        SocketChannel socketChannel = serverSocketChannel.accept();
        
        // ক্লায়েন্টের সাথে ডেটা পাঠানো
        ByteBuffer buffer = ByteBuffer.allocate(256);
        buffer.put("Hello from the server!".getBytes());
        buffer.flip();
        
        socketChannel.write(buffer);
        
        System.out.println("Message sent to client.");
        
        // সংযোগ বন্ধ
        socketChannel.close();
        serverSocketChannel.close();
    }
}

এখানে, একটি ServerSocketChannel তৈরি করা হচ্ছে এবং পোর্ট 12345 এ ক্লায়েন্ট সংযোগ গ্রহণ করা হচ্ছে। তারপর, ক্লায়েন্টের সাথে একটি বার্তা পাঠানো হচ্ছে।


২. SocketChannel দিয়ে ক্লায়েন্ট তৈরি করা

TCP ক্লায়েন্ট তৈরি করতে SocketChannel ব্যবহার করা হয়। ক্লায়েন্ট সার্ভারের IP ঠিকানা এবং পোর্ট নম্বর দিয়ে সংযোগ তৈরি করে এবং সার্ভারের সাথে ডেটা পাঠানো বা গ্রহণ করে।

উদাহরণ: TCP Client with SocketChannel

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.*;

public class TCPClientExample {
    public static void main(String[] args) throws IOException {
        // সার্ভারের IP ঠিকানা এবং পোর্ট নম্বর
        String serverAddress = "localhost";
        int port = 12345;
        
        // সার্ভারের সাথে সংযোগ তৈরি
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress(serverAddress, port));
        
        // সার্ভার থেকে বার্তা গ্রহণ
        ByteBuffer buffer = ByteBuffer.allocate(256);
        socketChannel.read(buffer);
        
        buffer.flip();
        byte[] data = new byte[buffer.remaining()];
        buffer.get(data);
        
        System.out.println("Message from server: " + new String(data));
        
        // সংযোগ বন্ধ
        socketChannel.close();
    }
}

এখানে, SocketChannel ব্যবহার করে সার্ভারের সাথে TCP সংযোগ স্থাপন করা হচ্ছে এবং সার্ভার থেকে একটি বার্তা গ্রহণ করা হচ্ছে।


৩. Non-blocking Mode with SocketChannel

Java NIO এর সবচেয়ে শক্তিশালী বৈশিষ্ট্য হল এটি Non-blocking I/O সাপোর্ট করে। এর মানে হল যে, যখন কোন I/O অপারেশন সম্পন্ন হচ্ছে না, তখন থ্রেড অন্য কাজ করতে পারে। এটি একটি সার্ভার তৈরি করার সময় ক্লায়েন্টদের সাথে একাধিক সংযোগ পরিচালনা করতে খুবই কার্যকরী।

উদাহরণ: Non-blocking SocketChannel

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.*;

public class NonBlockingTCPServer {
    public static void main(String[] args) throws IOException {
        // পোর্ট নম্বর
        int port = 12345;

        // ServerSocketChannel তৈরি এবং non-blocking মোডে সেট করা
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(port));
        serverSocketChannel.configureBlocking(false);

        // Selector তৈরি
        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        
        System.out.println("Server is waiting for connections...");

        while (true) {
            // Ready channels চেক করা
            selector.select();
            
            // Selector থেকে নির্বাচিত কীগুলির প্রক্রিয়া
            for (SelectionKey key : selector.selectedKeys()) {
                if (key.isAcceptable()) {
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                    System.out.println("New connection accepted.");
                }
                if (key.isReadable()) {
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(256);
                    socketChannel.read(buffer);
                    buffer.flip();
                    byte[] data = new byte[buffer.remaining()];
                    buffer.get(data);
                    System.out.println("Message from client: " + new String(data));
                }
            }
            selector.selectedKeys().clear();
        }
    }
}

এখানে, সার্ভারটি non-blocking মোডে চলে এবং Selector ব্যবহার করে একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগ স্থাপন করে। এটি একটি কার্যকরী উপায় যখন অনেক ক্লায়েন্টের সাথে একযোগে সংযোগ পরিচালনা করতে হয়।


SocketChannel ব্যবহার করে Java NIO তে TCP নেটওয়ার্কিং করা খুবই কার্যকরী এবং নমনীয়। Blocking এবং Non-blocking মোডে কাজ করার ক্ষমতা Java NIO কে দ্রুত এবং স্কেলেবল নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করতে সক্ষম করে। ServerSocketChannel এবং SocketChannel এর মাধ্যমে ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশন তৈরি করা সম্ভব, যেখানে ডেটা আদান-প্রদান এবং একাধিক ক্লায়েন্টের সাথে যোগাযোগ করা যায়।

Java NIO এর Selector ব্যবহার করে নন-ব্লকিং নেটওয়ার্ক সার্ভিস তৈরি করতে পারেন, যা একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগের জন্য আদর্শ। TCP/IP নেটওয়ার্কিং এর জন্য Java NIO একটি অত্যন্ত শক্তিশালী এবং কার্যকরী টুল।


Content added By

SocketChannel এর মাধ্যমে TCP Connection তৈরি করা

66
66

Java NIO (New Input/Output) API ব্লকিং এবং নন-ব্লকিং I/O অপারেশন পরিচালনা করার জন্য শক্তিশালী সমাধান প্রদান করে। বিশেষ করে TCP connections এ, Java NIO এর মাধ্যমে আপনি Blocking এবং Non-blocking কনেকশন পরিচালনা করতে পারেন, যা অ্যাপ্লিকেশনটির পারফরম্যান্স এবং স্কেলেবিলিটি বাড়াতে সাহায্য করে।

এই লেখায় আমরা TCP কনেকশনের ক্ষেত্রে Blocking এবং Non-blocking কনেকশনের ধারণা এবং তাদের মধ্যে পার্থক্য বিস্তারিতভাবে আলোচনা করব।


Blocking TCP Connections

Blocking TCP Connection হল একটি প্রথাগত I/O মডেল যেখানে একটি থ্রেড একটি TCP কনেকশনে ডেটা পাঠানোর বা গ্রহণ করার সময় পুরোপুরি থেমে থাকে (ব্লক হয়ে থাকে) যতক্ষণ না সেই অপারেশন সম্পন্ন হয়। এই ধরনের কনেকশনে, যখন একটি থ্রেড একটির পর এক I/O অপারেশন সম্পন্ন করতে থাকে, তখন পরবর্তী অপারেশন শুরু করার আগে আগেরটি সম্পন্ন হওয়া পর্যন্ত থ্রেডটি অপেক্ষা করে।

Blocking TCP Connection এর কার্যপ্রণালী

  • থ্রেড ব্লকিং: TCP কনেকশনের উপর একটি অপারেশন (যেমন, ডেটা পাঠানো বা গ্রহণ) করার সময় থ্রেডটি থেমে থাকে। অর্থাৎ, ডেটা পাঠানোর বা গ্রহণের জন্য পরবর্তী কার্যকলাপ করতে হবে না যতক্ষণ না বর্তমান অপারেশন সম্পন্ন হয়।
  • পারফরম্যান্স: ব্লকিং মডেল সোজা এবং সহজ হতে পারে, তবে এতে একাধিক কনেকশনের জন্য একাধিক থ্রেড পরিচালনা করতে হয়, যার ফলে থ্রেডের ব্যবস্থাপনা জটিল হতে পারে এবং পারফরম্যান্স কম হতে পারে।

Blocking TCP Connection উদাহরণ

import java.io.*;
import java.net.*;

public class BlockingTCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("Server started, waiting for client connection...");

        Socket socket = serverSocket.accept(); // Blocking call
        System.out.println("Client connected!");

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        String message = in.readLine(); // Blocking call
        System.out.println("Received: " + message);

        out.println("Hello Client!"); // Send response to client

        socket.close();
        serverSocket.close();
    }
}

এখানে, accept() এবং readLine() মেথড দুটি ব্লকিং অপারেশন। ক্লায়েন্টের সাথে সংযোগ স্থাপন এবং ডেটা পড়ার জন্য থ্রেডটি ব্লক হয়ে থাকে।


Non-blocking TCP Connections

Non-blocking TCP Connection হল এমন একটি কনেকশন যেখানে একটি থ্রেড ব্লক না হয়ে অন্যান্য কাজ করতে পারে, এমনকি যখন এটি TCP কনেকশনে ডেটা পাঠানোর বা গ্রহণ করার জন্য অপেক্ষা করছে। নন-ব্লকিং মডেলে, I/O অপারেশনগুলি অবিলম্বে ফেরত দেয়, এবং থ্রেডকে অন্য কাজ করতে দেয় যতক্ষণ না I/O অপারেশন সম্পন্ন হয়। Java NIO তে এই ধরনের কাজের জন্য SocketChannel ব্যবহার করা হয়।

Non-blocking TCP Connection এর কার্যপ্রণালী

  • থ্রেড ব্লকিং না হওয়া: নন-ব্লকিং কনেকশনে, যখন ডেটা পাঠানো বা গ্রহণ করার জন্য অপারেশনটি করা হয়, তখন থ্রেডটি অপেক্ষা না করে অন্য কাজ করতে পারে।
  • পারফরম্যান্স: নন-ব্লকিং মডেল বিশেষ করে অ্যাপ্লিকেশনগুলির জন্য উপকারী যেখানে একাধিক TCP কনেকশনের সাথে যোগাযোগ করতে হয়। এটি থ্রেড ব্যবস্থাপনা সহজ করে এবং উচ্চ পারফরম্যান্স এবং স্কেলেবিলিটি নিশ্চিত করে।

Non-blocking TCP Connection উদাহরণ

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.net.*;

public class NonBlockingTCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);  // Set non-blocking mode

        System.out.println("Non-blocking server started, waiting for client connection...");

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            if (selector.select() > 0) {  // Non-blocking select
                for (SelectionKey key : selector.selectedKeys()) {
                    if (key.isAcceptable()) {
                        SocketChannel socketChannel = serverSocketChannel.accept();
                        socketChannel.configureBlocking(false); // Set non-blocking mode
                        socketChannel.register(selector, SelectionKey.OP_READ);
                        System.out.println("Client connected!");
                    } else if (key.isReadable()) {
                        SocketChannel socketChannel = (SocketChannel) key.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(256);
                        int bytesRead = socketChannel.read(buffer);  // Non-blocking read
                        if (bytesRead != -1) {
                            buffer.flip();
                            while (buffer.hasRemaining()) {
                                System.out.print((char) buffer.get());
                            }
                        }
                    }
                }
                selector.selectedKeys().clear();
            }
        }
    }
}

এখানে, select() মেথডটি একটি নন-ব্লকিং অপারেশন এবং যখন কোন নতুন সংযোগ আসে বা ডেটা আসে তখন সেগুলি পরবর্তী কাজে ব্যবহৃত হয়। থ্রেডটি কখনওই ব্লক হয় না এবং অন্য কাজ করতে পারে।


Blocking এবং Non-blocking TCP Connections এর মধ্যে পার্থক্য

বিষয়Blocking TCP ConnectionNon-blocking TCP Connection
থ্রেড ব্লকিংথ্রেড I/O অপারেশন সম্পন্ন না হওয়া পর্যন্ত থেমে থাকে।থ্রেড I/O অপারেশন চলাকালে অন্য কাজ করতে পারে।
পারফরম্যান্সএকাধিক কনেকশনের জন্য একাধিক থ্রেড পরিচালনা করা প্রয়োজন, যা পারফরম্যান্স কমিয়ে দিতে পারে।একাধিক কনেকশন একসাথে পরিচালনা করতে পারফরম্যান্স উন্নত হয়।
স্কেলেবিলিটিথ্রেড ব্যবস্থাপনা জটিল হয় এবং থ্রেড পুলের জন্য অতিরিক্ত রিসোর্স প্রয়োজন।থ্রেড ব্যবস্থাপনা সহজ এবং কম রিসোর্স খরচে অনেক কনেকশন পরিচালনা করা যায়।
ব্যবহারসাধারণ অ্যাপ্লিকেশন যেখানে থ্রেডগুলি একে অপরের সাথে নির্দিষ্ট কাজ সম্পাদন করে।উচ্চ পারফরম্যান্স এবং স্কেলেবিলিটি অ্যাপ্লিকেশন, যেমন নেটওয়ার্ক সার্ভার।
উদাহরণServerSocket.accept() এবং InputStream.read() ব্লকিং কল।SocketChannel.select() এবং SocketChannel.read() নন-ব্লকিং কল।

Blocking এবং Non-blocking TCP connections Java NIO তে দুটি গুরুত্বপূর্ণ কনসেপ্ট যা TCP/IP যোগাযোগ পরিচালনার জন্য ব্যবহৃত হয়।

  • Blocking Connections সাধারণত ছোট বা সিম্পল অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত, যেখানে একক থ্রেডে কাজ সম্পাদিত হয় এবং একের পর এক কাজ করা হয়।
  • Non-blocking Connections বৃহৎ স্কেল, উচ্চ পারফরম্যান্স অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত, যেখানে একাধিক কনেকশনের সাথে দ্রুত যোগাযোগ এবং পারফরম্যান্স উন্নত করা হয়।

Java NIO এর মাধ্যমে Non-blocking I/O ব্যবহার করলে আপনার অ্যাপ্লিকেশনটি আরও স্কেলেবল, কার্যকর এবং রিসোর্স ব্যবহার কম হয়, বিশেষ করে যখন একাধিক TCP কনেকশনের মাধ্যমে ডেটা আদান-প্রদান করতে হয়।


Content added By

ServerSocketChannel এবং ClientSocketChannel এর মাধ্যমে ডেটা আদান-প্রদান

67
67

SocketChannel হল Java NIO এর একটি গুরুত্বপূর্ণ ক্লাস যা নেটওয়ার্কে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ করার জন্য ব্যবহৃত হয়। এটি non-blocking এবং blocking I/O অপারেশন পরিচালনা করতে সক্ষম এবং একটি SocketChannel সুনির্দিষ্ট পোর্টে ডেটা পাঠাতে বা গ্রহণ করতে সক্ষম হয়।

Java NIO এর মাধ্যমে, SocketChannel এর সাহায্যে আপনি ক্লায়েন্ট এবং সার্ভার অ্যাপ্লিকেশন তৈরি করতে পারেন, যা একে অপরের সাথে TCP/IP সংযোগে ডেটা আদান-প্রদান করে। এটি একটি বিশেষ সুবিধা প্রদান করে, কারণ SocketChannel নন-ব্লকিং মোডে কাজ করতে পারে, যার ফলে একাধিক কনেকশন এবং ডেটা প্রক্রিয়াকরণ একযোগে করা সম্ভব হয়।


SocketChannel এর কার্যপ্রণালী

  1. Non-blocking Mode: SocketChannel নন-ব্লকিং মোডে কাজ করতে সক্ষম, যেখানে একটি থ্রেড ডেটা পাঠানোর জন্য ব্লক না হয়ে অন্য কাজ করতে পারে। এটি মূলত যখন সার্ভার থেকে বা ক্লায়েন্টে ডেটা পাঠানোর জন্য অপেক্ষা করা হয় তখন ব্যবহৃত হয়।
  2. TCP/IP Communication: এটি TCP/IP প্রোটোকল ব্যবহার করে নেটওয়ার্কে ডেটা ট্রান্সফার করতে পারে, তাই এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে দুটি প্রধান কাজ—ডেটা পাঠানো এবং গ্রহণ করার জন্য ব্যবহৃত হয়।
  3. Buffering: SocketChannel এর মাধ্যমে পাঠানো বা গ্রহণ করা ডেটা একটি ByteBuffer এর মাধ্যমে পরিচালনা করা হয়।

উদাহরণ: SocketChannel ব্যবহার করে ক্লায়েন্ট এবং সার্ভার তৈরি

এখানে আমরা দুটি অংশের উদাহরণ দেখব: একটি ক্লায়েন্ট এবং একটি সার্ভার যা SocketChannel ব্যবহার করে TCP/IP সংযোগে ডেটা আদান-প্রদান করে।

১. ServerSocketChannel দিয়ে সার্ভার তৈরি

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class SocketServerExample {
    public static void main(String[] args) throws IOException {
        // সার্ভারের জন্য ServerSocketChannel তৈরি করা
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8080));

        System.out.println("Server started, waiting for client connection...");

        // ক্লায়েন্ট কনেকশন গ্রহণ করা
        SocketChannel socketChannel = serverSocketChannel.accept();
        System.out.println("Client connected: " + socketChannel.getRemoteAddress());

        // ক্লায়েন্ট থেকে ডেটা পড়া
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        socketChannel.read(buffer);
        buffer.flip();

        // ডেটা প্রিন্ট করা
        String message = new String(buffer.array(), StandardCharsets.UTF_8).trim();
        System.out.println("Received from client: " + message);

        // সার্ভার বন্ধ করা
        socketChannel.close();
        serverSocketChannel.close();
    }
}

ব্যাখ্যা:

  1. ServerSocketChannel.open() ব্যবহার করে একটি সার্ভার সকেট চ্যানেল তৈরি করা হয়েছে।
  2. সার্ভারটি পোর্ট 8080 এ ক্লায়েন্টের সংযোগের জন্য অপেক্ষা করছে।
  3. ক্লায়েন্ট সংযোগ স্থাপন করলে, SocketChannel এর মাধ্যমে ডেটা পড়া হচ্ছে এবং সেটি প্রিন্ট করা হচ্ছে।

২. SocketChannel দিয়ে ক্লায়েন্ট তৈরি

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class SocketClientExample {
    public static void main(String[] args) throws IOException {
        // ক্লায়েন্টের জন্য SocketChannel তৈরি করা
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8080));

        // সার্ভারে পাঠানোর জন্য একটি বার্তা
        String message = "Hello from client!";
        ByteBuffer buffer = ByteBuffer.wrap(message.getBytes(StandardCharsets.UTF_8));

        // বার্তা সার্ভারে পাঠানো
        socketChannel.write(buffer);
        System.out.println("Message sent to server: " + message);

        // ক্লায়েন্ট বন্ধ করা
        socketChannel.close();
    }
}

ব্যাখ্যা:

  1. SocketChannel.open() ব্যবহার করে ক্লায়েন্ট একটি সকেট চ্যানেল তৈরি করছে এবং সার্ভারের সাথে সংযোগ স্থাপন করছে।
  2. ByteBuffer ব্যবহার করে সার্ভারে একটি বার্তা পাঠানো হচ্ছে।
  3. বার্তা পাঠানো হলে, ক্লায়েন্টের সকেট চ্যানেলটি বন্ধ করা হচ্ছে।

SocketChannel এর নন-ব্লকিং মোড ব্যবহার

Java NIO তে SocketChannel non-blocking mode তে কাজ করতে সক্ষম। এটি ব্যবহৃত হলে, থ্রেডটি ব্লক না হয়ে অন্য কাজ করতে পারে। নন-ব্লকিং মোডে কাজ করার জন্য, SocketChannel.configureBlocking(false) ব্যবহার করতে হয়।

উদাহরণ: Non-blocking Mode এ SocketChannel ব্যবহার করা

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class NonBlockingSocketClient {
    public static void main(String[] args) throws IOException {
        // SocketChannel তৈরি করা
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);  // Non-blocking mode

        // সার্ভারের সাথে সংযোগ
        socketChannel.connect(new InetSocketAddress("localhost", 8080));

        while (!socketChannel.finishConnect()) {
            System.out.println("Connecting to server...");
        }

        // সার্ভারে ডেটা পাঠানো
        String message = "Hello from non-blocking client!";
        ByteBuffer buffer = ByteBuffer.wrap(message.getBytes(StandardCharsets.UTF_8));
        socketChannel.write(buffer);
        System.out.println("Message sent to server.");

        socketChannel.close();
    }
}

ব্যাখ্যা:

  1. socketChannel.configureBlocking(false) দিয়ে non-blocking mode সক্রিয় করা হয়েছে।
  2. finishConnect() মেথড ব্যবহার করে সংযোগ সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করা হচ্ছে, তবে এটি ব্লক না হয়ে অন্য কাজ করতে পারে।

Java NIO এর SocketChannel ক্লাস নেটওয়ার্ক সংযোগে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করার জন্য একটি গুরুত্বপূর্ণ উপাদান। এটি blocking এবং non-blocking মোডে কাজ করতে সক্ষম এবং এটি নেটওয়ার্ক অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করতে সহায়ক।

  • SocketChannel দিয়ে আপনি TCP/IP সংযোগ স্থাপন এবং ডেটা পাঠাতে পারেন।
  • Non-blocking mode ব্যবহারের মাধ্যমে আপনি একাধিক সংযোগ এবং ডেটা প্রক্রিয়াকরণ করতে সক্ষম হবেন, যা সিস্টেমের কার্যক্ষমতা বাড়ায়।

এটি Java NIO এর একটি অত্যন্ত শক্তিশালী এবং কার্যকরী ফিচার যা নেটওয়ার্ক I/O অপারেশনগুলির জন্য ব্যবহৃত হয়।


Content added By

Blocking এবং Non-blocking TCP Connections

131
131

TCP (Transmission Control Protocol) একটি মূল নেটওয়ার্ক প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য যোগাযোগ স্থাপন করে। Java তে, Blocking এবং Non-blocking TCP সংযোগ ব্যবস্থাপনার জন্য বিভিন্ন পদ্ধতি রয়েছে। এই দুটি পদ্ধতির মধ্যে প্রধান পার্থক্য হল, যখন একটি সংযোগ স্থাপন বা ডেটা প্রক্রিয়া করা হয় তখন Blocking মোডে থ্রেডগুলি অপেক্ষা করে, কিন্তু Non-blocking মোডে থ্রেডগুলি অপেক্ষা না করে অন্য কাজ করতে পারে।

Java NIO (Non-blocking I/O) API ব্যবহার করে, আমরা নেটওয়ার্ক কনেকশনের জন্য ব্লকিং এবং নন-ব্লকিং উভয় অপশন ব্যবহার করতে পারি। নিচে এই দুটি কৌশল নিয়ে বিস্তারিত আলোচনা করা হবে।


১. Blocking TCP Connections

Blocking TCP Connections একটি সাধারণ পদ্ধতি, যেখানে একবার সংযোগ স্থাপন হলে, ক্লায়েন্ট বা সার্ভার তার I/O অপারেশন সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা করে। একে সাধারণভাবে Blocking I/O বলা হয়। এতে, একটি থ্রেড ব্লক হয় যখন সে কিছু ডেটা প্রক্রিয়া করছে (যেমন, সার্ভার থেকে ডেটা গ্রহণ করা বা পাঠানো) এবং অন্য কোন কাজ করতে পারে না যতক্ষণ না সেই অপারেশন শেষ হয়।

Blocking TCP Connection এর কার্যপ্রণালী

  • ক্লায়েন্টের জন্য: ক্লায়েন্ট প্রথমে সার্ভারের সাথে সংযোগ স্থাপন করে এবং তার পরবর্তী সমস্ত I/O অপারেশন (যেমন, ডেটা পাঠানো বা গ্রহণ করা) সম্পন্ন না হওয়া পর্যন্ত থ্রেডটি ব্লক হয়।
  • সার্ভারের জন্য: সার্ভার ক্লায়েন্টের সাথে সংযোগ স্থাপন করে এবং ক্লায়েন্টের কাছে থেকে ডেটা প্রাপ্তি বা পাঠানো না হওয়া পর্যন্ত থ্রেডটি ব্লক থাকে।

উদাহরণ: Blocking TCP Connection ব্যবহার করে ক্লায়েন্ট এবং সার্ভার তৈরি

১. Blocking Server (TCP)

import java.io.*;
import java.net.*;

public class BlockingServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("Server started, waiting for client connection...");

        // ব্লকিং মোডে ক্লায়েন্ট সংযোগ গ্রহণ
        Socket clientSocket = serverSocket.accept();
        System.out.println("Client connected: " + clientSocket.getRemoteSocketAddress());

        // ক্লায়েন্টের কাছ থেকে ডেটা পড়া
        BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String message = reader.readLine();
        System.out.println("Received from client: " + message);

        // ক্লায়েন্টকে প্রতিক্রিয়া পাঠানো
        PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);
        writer.println("Hello from server!");

        // সোকেট বন্ধ করা
        clientSocket.close();
        serverSocket.close();
    }
}

২. Blocking Client (TCP)

import java.io.*;
import java.net.*;

public class BlockingClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 8080);

        // সোকেটের আউটপুট স্ট্রীমে ডেটা লেখা
        PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
        writer.println("Hello from client!");

        // সার্ভার থেকে ডেটা পড়া
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String response = reader.readLine();
        System.out.println("Received from server: " + response);

        // সোকেট বন্ধ করা
        socket.close();
    }
}

এখানে, ক্লায়েন্ট এবং সার্ভার উভয়ই ব্লকিং মোডে কাজ করছে। সার্ভার প্রথমে ক্লায়েন্টের সংযোগের জন্য অপেক্ষা করবে এবং একবার সংযোগ স্থাপিত হলে, ডেটা পাঠানো এবং গ্রহণ করার জন্য অপেক্ষা করবে।


২. Non-blocking TCP Connections

Non-blocking TCP Connections হলো এমন একটি পদ্ধতি যেখানে I/O অপারেশন চলাকালে থ্রেড ব্লক না হয়ে অন্য কাজ করতে পারে। Java NIO (Non-blocking I/O) এর মাধ্যমে নেটওয়ার্ক কনেকশনটি নন-ব্লকিং মোডে পরিচালিত হতে পারে, যেখানে থ্রেডগুলি ব্লক না হয়ে তার কাজ চালিয়ে যায়।

নন-ব্লকিং TCP সংযোগে, SocketChannel ব্যবহার করা হয় যা TCP/IP কানেকশনকে নন-ব্লকিং মোডে পরিচালনা করে।

Non-blocking TCP Connection এর কার্যপ্রণালী

  • ক্লায়েন্টের জন্য: ক্লায়েন্ট নন-ব্লকিং মোডে সার্ভারের সাথে সংযোগ স্থাপন করে এবং ডেটা প্রক্রিয়া করতে পারে, এমনকি যখন তার I/O অপারেশন চলমান থাকে।
  • সার্ভারের জন্য: সার্ভার একাধিক ক্লায়েন্টের সাথে নন-ব্লকিং কনেকশন পরিচালনা করতে পারে। যখন একটি ক্লায়েন্টের জন্য I/O অপারেশন চলমান থাকে, তখন অন্য ক্লায়েন্টদের জন্য সার্ভার অবরুদ্ধ থাকে না।

উদাহরণ: Non-blocking TCP Connection ব্যবহার করে ক্লায়েন্ট এবং সার্ভার তৈরি

১. Non-blocking Server (TCP)

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.IOException;

public class NonBlockingServer {
    public static void main(String[] args) throws IOException {
        // সার্ভার সকেট চ্যানেল তৈরি করা
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);  // Non-blocking mode

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            selector.select();  // Block until an event occurs

            // Handle all ready events
            for (SelectionKey key : selector.selectedKeys()) {
                if (key.isAcceptable()) {
                    // Accept new client connection
                    SocketChannel clientChannel = serverSocketChannel.accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(selector, SelectionKey.OP_READ);
                    System.out.println("Client connected: " + clientChannel.getRemoteAddress());
                } else if (key.isReadable()) {
                    // Read data from the client
                    SocketChannel clientChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = clientChannel.read(buffer);
                    if (bytesRead == -1) {
                        clientChannel.close();
                    } else {
                        buffer.flip();
                        String message = new String(buffer.array()).trim();
                        System.out.println("Received from client: " + message);
                    }
                }
            }
            selector.selectedKeys().clear();
        }
    }
}

২. Non-blocking Client (TCP)

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.io.IOException;

public class NonBlockingClient {
    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);  // Non-blocking mode
        socketChannel.connect(new InetSocketAddress("localhost", 8080));

        while (!socketChannel.finishConnect()) {
            System.out.println("Connecting to server...");
        }

        String message = "Hello from non-blocking client!";
        ByteBuffer buffer = ByteBuffer.wrap(message.getBytes(StandardCharsets.UTF_8));
        socketChannel.write(buffer);
        System.out.println("Message sent to server.");

        socketChannel.close();
    }
}

এখানে, Non-blocking Server এবং Non-blocking Client উভয়ই নন-ব্লকিং মোডে কাজ করছে। সার্ভারটি Selector ব্যবহার করে ক্লায়েন্টের কনেকশন এবং I/O অপারেশন পরিচালনা করছে, যখন ক্লায়েন্টটি সংযোগের জন্য অপেক্ষা না করে বার্তা পাঠাচ্ছে।


ব্লকিং এবং নন-ব্লকিং TCP সংযোগের তুলনা

বৈশিষ্ট্যব্লকিং TCP সংযোগনন-ব্লকিং TCP সংযোগ
থ্রেড ব্লকিংহ্যাঁ, থ্রেড ব্লক হয়ে অপেক্ষা করেনা, থ্রেড অন্য কাজ চালিয়ে যায়
পারফরম্যান্সকম পারফরম্যান্স (একই থ্রেডের মাধ্যমে একাধিক I/O অপারেশন)উচ্চ পারফরম্যান্স (একাধিক I/O অপারেশন একযোগে)
এমনকি একাধিক ক্লায়েন্টএকযোগে কাজ করা কঠিনএকযোগে অনেক ক্লায়েন্টকে পরিচালনা করা সহজ
অপারেশন টাইমদীর্ঘ I/O অপারেশন হতে পারেদ্রুত I/O অপারেশন

Java তে Blocking এবং Non-blocking TCP সংযোগ ব্যবস্থাপনার দুটি গুরুত্বপূর্ণ পদ্ধতি। ব্লকিং TCP সংযোগ একটি সাধারণ এবং সহজ পদ্ধতি হলেও, Non-blocking TCP সংযোগ I/O অপারেশনগুলির পারফরম্যান্স বাড়ায় এবং একাধিক ক্লায়েন্ট বা সংযোগকে দ্রুত এবং দক্ষভাবে পরিচালনা করতে সক্ষম। SocketChannel এবং ServerSocketChannel ব্যবহার করে Java NIO এ আপনি ব্লকিং এবং নন-ব্লকিং I/O অপারেশন কার্যকরভাবে পরিচালনা করতে পারবেন।


Content added By

উদাহরণ সহ SocketChannel এর ব্যবহার

78
78

SocketChannel হল Java NIO এর একটি ক্লাস যা নেটওয়ার্কে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। এটি non-blocking এবং blocking I/O অপারেশন পরিচালনা করতে সক্ষম এবং ক্লায়েন্ট এবং সার্ভারের মধ্যে TCP/IP সংযোগে ডেটা পাঠানো ও গ্রহণের জন্য একটি শক্তিশালী উপাদান।

এখানে, আমরা SocketChannel ব্যবহার করে একটি ক্লায়েন্ট এবং সার্ভার তৈরি করার উদাহরণ দেখব। ক্লায়েন্ট এবং সার্ভার উভয়ই TCP সংযোগের মাধ্যমে একে অপরের সাথে ডেটা পাঠাবে ও গ্রহণ করবে। এটি blocking এবং non-blocking মোডে কাজ করতে পারে।


SocketChannel এর কার্যপ্রণালী

  • Blocking Mode: সাধারণভাবে, SocketChannel ব্লকিং মোডে কাজ করে, যার মানে হল যে একটি I/O অপারেশন (যেমন ডেটা পাঠানো বা গ্রহণ করা) সম্পন্ন না হওয়া পর্যন্ত থ্রেডটি অপেক্ষা করবে।
  • Non-blocking Mode: নন-ব্লকিং মোডে, SocketChannel কোনো I/O অপারেশনে ব্লক না হয়ে থ্রেডটি অন্য কাজ করতে পারবে। এটি একাধিক সংযোগ এবং I/O অপারেশনকে একযোগে পরিচালনা করতে সাহায্য করে।

উদাহরণ: Blocking SocketChannel এর মাধ্যমে ক্লায়েন্ট এবং সার্ভার তৈরি

১. Blocking Server (TCP)

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;

public class BlockingServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8080));

        System.out.println("Server started. Waiting for client connection...");

        // Accepting client connection
        SocketChannel socketChannel = serverSocketChannel.accept();
        System.out.println("Client connected: " + socketChannel.getRemoteAddress());

        // Read data from client
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        socketChannel.read(buffer);
        buffer.flip();
        
        // Display the received message
        String message = new String(buffer.array(), 0, buffer.limit());
        System.out.println("Received from client: " + message);

        // Send a response to the client
        buffer.clear();
        buffer.put("Hello from server!".getBytes());
        buffer.flip();
        socketChannel.write(buffer);

        // Closing connection
        socketChannel.close();
        serverSocketChannel.close();
    }
}

ব্যাখ্যা:

  1. ServerSocketChannel ব্যবহার করে সার্ভার তৈরি করা হয়েছে যা 8080 পোর্টে ক্লায়েন্টের সংযোগ গ্রহণ করবে।
  2. socketChannel.read() ব্যবহার করে ক্লায়েন্ট থেকে ডেটা পড়া হচ্ছে এবং প্রাপ্ত ডেটা প্রিন্ট করা হচ্ছে।
  3. সার্ভার ক্লায়েন্টকে একটি বার্তা পাঠাচ্ছে এবং তারপর সংযোগ বন্ধ করছে।

২. Blocking Client (TCP)

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;

public class BlockingClient {
    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("localhost", 8080));

        // Sending data to server
        String message = "Hello from client!";
        ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
        socketChannel.write(buffer);
        System.out.println("Message sent to server: " + message);

        // Read the response from the server
        buffer.clear();
        socketChannel.read(buffer);
        buffer.flip();
        String response = new String(buffer.array(), 0, buffer.limit());
        System.out.println("Received from server: " + response);

        // Closing connection
        socketChannel.close();
    }
}

ব্যাখ্যা:

  1. SocketChannel ব্যবহার করে ক্লায়েন্ট সার্ভারের সাথে সংযুক্ত হচ্ছে।
  2. ByteBuffer.wrap() ব্যবহার করে ক্লায়েন্ট একটি বার্তা সার্ভারে পাঠাচ্ছে।
  3. সার্ভার থেকে উত্তর গ্রহণ করার জন্য socketChannel.read() ব্যবহার করা হচ্ছে।

উদাহরণ: Non-blocking SocketChannel এর মাধ্যমে ক্লায়েন্ট এবং সার্ভার তৈরি

১. Non-blocking Server (TCP)

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.IOException;

public class NonBlockingServer {
    public static void main(String[] args) throws IOException {
        // Create a non-blocking server
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            selector.select();  // Block until an event occurs

            for (SelectionKey key : selector.selectedKeys()) {
                if (key.isAcceptable()) {
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                    System.out.println("Client connected: " + socketChannel.getRemoteAddress());
                } else if (key.isReadable()) {
                    SocketChannel clientChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = clientChannel.read(buffer);
                    if (bytesRead == -1) {
                        clientChannel.close();
                    } else {
                        buffer.flip();
                        String message = new String(buffer.array(), 0, buffer.limit());
                        System.out.println("Received from client: " + message);
                    }
                }
            }
            selector.selectedKeys().clear();
        }
    }
}

ব্যাখ্যা:

  1. ServerSocketChannel.configureBlocking(false) দিয়ে সার্ভারকে non-blocking mode এ কনফিগার করা হয়েছে।
  2. Selector ব্যবহার করে সার্ভার একাধিক ক্লায়েন্ট সংযোগ এবং I/O অপারেশন একযোগে পরিচালনা করছে।

২. Non-blocking Client (TCP)

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.io.IOException;

public class NonBlockingClient {
    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);  // Non-blocking mode
        socketChannel.connect(new InetSocketAddress("localhost", 8080));

        while (!socketChannel.finishConnect()) {
            System.out.println("Connecting to server...");
        }

        String message = "Hello from non-blocking client!";
        ByteBuffer buffer = ByteBuffer.wrap(message.getBytes(StandardCharsets.UTF_8));
        socketChannel.write(buffer);
        System.out.println("Message sent to server.");

        socketChannel.close();
    }
}

ব্যাখ্যা:

  1. SocketChannel.configureBlocking(false) দিয়ে non-blocking mode সক্রিয় করা হয়েছে।
  2. finishConnect() মেথড ব্যবহার করে ক্লায়েন্ট সার্ভারের সাথে সংযোগ স্থাপন করার জন্য অপেক্ষা করছে।

ব্লকিং এবং নন-ব্লকিং TCP সংযোগের তুলনা

বৈশিষ্ট্যব্লকিং TCP সংযোগনন-ব্লকিং TCP সংযোগ
থ্রেড ব্লকিংহ্যাঁ, থ্রেড ব্লক হয়ে অপেক্ষা করেনা, থ্রেড অন্য কাজ চালিয়ে যায়
পারফরম্যান্সকম পারফরম্যান্স (একই থ্রেডের মাধ্যমে একাধিক I/O অপারেশন)উচ্চ পারফরম্যান্স (একাধিক I/O অপারেশন একযোগে)
এমনকি একাধিক ক্লায়েন্টএকযোগে কাজ করা কঠিনএকযোগে অনেক ক্লায়েন্টকে পরিচালনা করা সহজ
অপারেশন টাইমদীর্ঘ I/O অপারেশন হতে পারেদ্রুত I/O অপারেশন

Java তে Blocking এবং Non-blocking TCP সংযোগ ব্যবস্থাপনার দুটি গুরুত্বপূর্ণ পদ্ধতি। ব্লকিং TCP সংযোগ একটি সাধারণ এবং সহজ পদ্ধতি হলেও, Non-blocking TCP সংযোগ I/O অপারেশনগুলির পারফরম্যান্স বাড়ায় এবং একাধিক ক্লায়েন্ট বা সংযোগকে দ্রুত এবং দক্ষভাবে পরিচালনা করতে সক্ষম। SocketChannel এবং ServerSocketChannel ব্যবহার করে Java NIO এ আপনি ব্লকিং এবং নন-ব্লকিং I/O অপারেশন কার্যকরভাবে পরিচালনা করতে পারবেন।


Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion