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 অপারেশন কার্যকরভাবে পরিচালনা করতে পারবেন।
Read more