Java NIO (New Input/Output) এর মাধ্যমে আপনি TCP সকারেট প্রোটোকল ব্যবহার করে নেটওয়ার্ক কমিউনিকেশন পরিচালনা করতে পারেন। SocketChannel হল Java NIO এর একটি কম্পোনেন্ট যা সোসকেটের মাধ্যমে TCP/IP নেটওয়ার্ক যোগাযোগ প্রতিষ্ঠিত করে। এটি ব্লকিং এবং নন-ব্লকিং মোডে কাজ করতে পারে, যা কার্যকরী এবং দ্রুত I/O অপারেশন পরিচালনা করতে সহায়ক।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Java NIO এর SocketChannel ব্যবহার করে TCP নেটওয়ার্কিং করা যায়।
SocketChannel একটি Java NIO ক্লাস যা নেটওয়ার্কিং অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। এটি Socket
ক্লাসের একটি নন-ব্লকিং সংস্করণ, যা TCP/IP প্রোটোকলে ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশন তৈরি করতে সক্ষম। এটি দুটি মোডে কাজ করতে পারে:
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
এ ক্লায়েন্ট সংযোগ গ্রহণ করা হচ্ছে। তারপর, ক্লায়েন্টের সাথে একটি বার্তা পাঠানো হচ্ছে।
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 সংযোগ স্থাপন করা হচ্ছে এবং সার্ভার থেকে একটি বার্তা গ্রহণ করা হচ্ছে।
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 একটি অত্যন্ত শক্তিশালী এবং কার্যকরী টুল।
Java NIO (New Input/Output) API ব্লকিং এবং নন-ব্লকিং I/O অপারেশন পরিচালনা করার জন্য শক্তিশালী সমাধান প্রদান করে। বিশেষ করে TCP connections এ, Java NIO এর মাধ্যমে আপনি Blocking এবং Non-blocking কনেকশন পরিচালনা করতে পারেন, যা অ্যাপ্লিকেশনটির পারফরম্যান্স এবং স্কেলেবিলিটি বাড়াতে সাহায্য করে।
এই লেখায় আমরা TCP কনেকশনের ক্ষেত্রে Blocking এবং Non-blocking কনেকশনের ধারণা এবং তাদের মধ্যে পার্থক্য বিস্তারিতভাবে আলোচনা করব।
Blocking TCP Connection হল একটি প্রথাগত I/O মডেল যেখানে একটি থ্রেড একটি TCP কনেকশনে ডেটা পাঠানোর বা গ্রহণ করার সময় পুরোপুরি থেমে থাকে (ব্লক হয়ে থাকে) যতক্ষণ না সেই অপারেশন সম্পন্ন হয়। এই ধরনের কনেকশনে, যখন একটি থ্রেড একটির পর এক I/O অপারেশন সম্পন্ন করতে থাকে, তখন পরবর্তী অপারেশন শুরু করার আগে আগেরটি সম্পন্ন হওয়া পর্যন্ত থ্রেডটি অপেক্ষা করে।
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 Connection হল এমন একটি কনেকশন যেখানে একটি থ্রেড ব্লক না হয়ে অন্যান্য কাজ করতে পারে, এমনকি যখন এটি TCP কনেকশনে ডেটা পাঠানোর বা গ্রহণ করার জন্য অপেক্ষা করছে। নন-ব্লকিং মডেলে, I/O অপারেশনগুলি অবিলম্বে ফেরত দেয়, এবং থ্রেডকে অন্য কাজ করতে দেয় যতক্ষণ না I/O অপারেশন সম্পন্ন হয়। Java NIO তে এই ধরনের কাজের জন্য SocketChannel
ব্যবহার করা হয়।
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 TCP Connection | Non-blocking TCP Connection |
---|---|---|
থ্রেড ব্লকিং | থ্রেড I/O অপারেশন সম্পন্ন না হওয়া পর্যন্ত থেমে থাকে। | থ্রেড I/O অপারেশন চলাকালে অন্য কাজ করতে পারে। |
পারফরম্যান্স | একাধিক কনেকশনের জন্য একাধিক থ্রেড পরিচালনা করা প্রয়োজন, যা পারফরম্যান্স কমিয়ে দিতে পারে। | একাধিক কনেকশন একসাথে পরিচালনা করতে পারফরম্যান্স উন্নত হয়। |
স্কেলেবিলিটি | থ্রেড ব্যবস্থাপনা জটিল হয় এবং থ্রেড পুলের জন্য অতিরিক্ত রিসোর্স প্রয়োজন। | থ্রেড ব্যবস্থাপনা সহজ এবং কম রিসোর্স খরচে অনেক কনেকশন পরিচালনা করা যায়। |
ব্যবহার | সাধারণ অ্যাপ্লিকেশন যেখানে থ্রেডগুলি একে অপরের সাথে নির্দিষ্ট কাজ সম্পাদন করে। | উচ্চ পারফরম্যান্স এবং স্কেলেবিলিটি অ্যাপ্লিকেশন, যেমন নেটওয়ার্ক সার্ভার। |
উদাহরণ | ServerSocket.accept() এবং InputStream.read() ব্লকিং কল। | SocketChannel.select() এবং SocketChannel.read() নন-ব্লকিং কল। |
Blocking এবং Non-blocking TCP connections Java NIO তে দুটি গুরুত্বপূর্ণ কনসেপ্ট যা TCP/IP যোগাযোগ পরিচালনার জন্য ব্যবহৃত হয়।
Java NIO এর মাধ্যমে Non-blocking I/O ব্যবহার করলে আপনার অ্যাপ্লিকেশনটি আরও স্কেলেবল, কার্যকর এবং রিসোর্স ব্যবহার কম হয়, বিশেষ করে যখন একাধিক TCP কনেকশনের মাধ্যমে ডেটা আদান-প্রদান করতে হয়।
SocketChannel
হল Java NIO এর একটি গুরুত্বপূর্ণ ক্লাস যা নেটওয়ার্কে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ করার জন্য ব্যবহৃত হয়। এটি non-blocking এবং blocking I/O অপারেশন পরিচালনা করতে সক্ষম এবং একটি SocketChannel সুনির্দিষ্ট পোর্টে ডেটা পাঠাতে বা গ্রহণ করতে সক্ষম হয়।
Java NIO এর মাধ্যমে, SocketChannel
এর সাহায্যে আপনি ক্লায়েন্ট এবং সার্ভার অ্যাপ্লিকেশন তৈরি করতে পারেন, যা একে অপরের সাথে TCP/IP সংযোগে ডেটা আদান-প্রদান করে। এটি একটি বিশেষ সুবিধা প্রদান করে, কারণ SocketChannel
নন-ব্লকিং মোডে কাজ করতে পারে, যার ফলে একাধিক কনেকশন এবং ডেটা প্রক্রিয়াকরণ একযোগে করা সম্ভব হয়।
SocketChannel
নন-ব্লকিং মোডে কাজ করতে সক্ষম, যেখানে একটি থ্রেড ডেটা পাঠানোর জন্য ব্লক না হয়ে অন্য কাজ করতে পারে। এটি মূলত যখন সার্ভার থেকে বা ক্লায়েন্টে ডেটা পাঠানোর জন্য অপেক্ষা করা হয় তখন ব্যবহৃত হয়।SocketChannel
এর মাধ্যমে পাঠানো বা গ্রহণ করা ডেটা একটি ByteBuffer
এর মাধ্যমে পরিচালনা করা হয়।এখানে আমরা দুটি অংশের উদাহরণ দেখব: একটি ক্লায়েন্ট এবং একটি সার্ভার যা SocketChannel
ব্যবহার করে TCP/IP সংযোগে ডেটা আদান-প্রদান করে।
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();
}
}
ServerSocketChannel.open()
ব্যবহার করে একটি সার্ভার সকেট চ্যানেল তৈরি করা হয়েছে।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();
}
}
SocketChannel.open()
ব্যবহার করে ক্লায়েন্ট একটি সকেট চ্যানেল তৈরি করছে এবং সার্ভারের সাথে সংযোগ স্থাপন করছে।ByteBuffer
ব্যবহার করে সার্ভারে একটি বার্তা পাঠানো হচ্ছে।Java NIO তে SocketChannel
non-blocking mode তে কাজ করতে সক্ষম। এটি ব্যবহৃত হলে, থ্রেডটি ব্লক না হয়ে অন্য কাজ করতে পারে। নন-ব্লকিং মোডে কাজ করার জন্য, SocketChannel.configureBlocking(false)
ব্যবহার করতে হয়।
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();
}
}
socketChannel.configureBlocking(false)
দিয়ে non-blocking mode সক্রিয় করা হয়েছে।finishConnect()
মেথড ব্যবহার করে সংযোগ সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করা হচ্ছে, তবে এটি ব্লক না হয়ে অন্য কাজ করতে পারে।Java NIO এর SocketChannel ক্লাস নেটওয়ার্ক সংযোগে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করার জন্য একটি গুরুত্বপূর্ণ উপাদান। এটি blocking এবং non-blocking মোডে কাজ করতে সক্ষম এবং এটি নেটওয়ার্ক অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করতে সহায়ক।
এটি Java NIO এর একটি অত্যন্ত শক্তিশালী এবং কার্যকরী ফিচার যা নেটওয়ার্ক I/O অপারেশনগুলির জন্য ব্যবহৃত হয়।
TCP (Transmission Control Protocol) একটি মূল নেটওয়ার্ক প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য যোগাযোগ স্থাপন করে। Java তে, Blocking এবং Non-blocking TCP সংযোগ ব্যবস্থাপনার জন্য বিভিন্ন পদ্ধতি রয়েছে। এই দুটি পদ্ধতির মধ্যে প্রধান পার্থক্য হল, যখন একটি সংযোগ স্থাপন বা ডেটা প্রক্রিয়া করা হয় তখন Blocking মোডে থ্রেডগুলি অপেক্ষা করে, কিন্তু Non-blocking মোডে থ্রেডগুলি অপেক্ষা না করে অন্য কাজ করতে পারে।
Java NIO (Non-blocking I/O) API ব্যবহার করে, আমরা নেটওয়ার্ক কনেকশনের জন্য ব্লকিং এবং নন-ব্লকিং উভয় অপশন ব্যবহার করতে পারি। নিচে এই দুটি কৌশল নিয়ে বিস্তারিত আলোচনা করা হবে।
Blocking TCP Connections একটি সাধারণ পদ্ধতি, যেখানে একবার সংযোগ স্থাপন হলে, ক্লায়েন্ট বা সার্ভার তার I/O অপারেশন সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা করে। একে সাধারণভাবে Blocking I/O বলা হয়। এতে, একটি থ্রেড ব্লক হয় যখন সে কিছু ডেটা প্রক্রিয়া করছে (যেমন, সার্ভার থেকে ডেটা গ্রহণ করা বা পাঠানো) এবং অন্য কোন কাজ করতে পারে না যতক্ষণ না সেই অপারেশন শেষ হয়।
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();
}
}
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 হলো এমন একটি পদ্ধতি যেখানে I/O অপারেশন চলাকালে থ্রেড ব্লক না হয়ে অন্য কাজ করতে পারে। Java NIO (Non-blocking I/O) এর মাধ্যমে নেটওয়ার্ক কনেকশনটি নন-ব্লকিং মোডে পরিচালিত হতে পারে, যেখানে থ্রেডগুলি ব্লক না হয়ে তার কাজ চালিয়ে যায়।
নন-ব্লকিং TCP সংযোগে, SocketChannel
ব্যবহার করা হয় যা TCP/IP কানেকশনকে নন-ব্লকিং মোডে পরিচালনা করে।
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();
}
}
}
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 সংযোগ |
---|---|---|
থ্রেড ব্লকিং | হ্যাঁ, থ্রেড ব্লক হয়ে অপেক্ষা করে | না, থ্রেড অন্য কাজ চালিয়ে যায় |
পারফরম্যান্স | কম পারফরম্যান্স (একই থ্রেডের মাধ্যমে একাধিক 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 অপারেশন কার্যকরভাবে পরিচালনা করতে পারবেন।
SocketChannel
হল Java NIO এর একটি ক্লাস যা নেটওয়ার্কে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। এটি non-blocking এবং blocking I/O অপারেশন পরিচালনা করতে সক্ষম এবং ক্লায়েন্ট এবং সার্ভারের মধ্যে TCP/IP সংযোগে ডেটা পাঠানো ও গ্রহণের জন্য একটি শক্তিশালী উপাদান।
এখানে, আমরা SocketChannel
ব্যবহার করে একটি ক্লায়েন্ট এবং সার্ভার তৈরি করার উদাহরণ দেখব। ক্লায়েন্ট এবং সার্ভার উভয়ই TCP সংযোগের মাধ্যমে একে অপরের সাথে ডেটা পাঠাবে ও গ্রহণ করবে। এটি blocking এবং non-blocking মোডে কাজ করতে পারে।
SocketChannel
ব্লকিং মোডে কাজ করে, যার মানে হল যে একটি I/O অপারেশন (যেমন ডেটা পাঠানো বা গ্রহণ করা) সম্পন্ন না হওয়া পর্যন্ত থ্রেডটি অপেক্ষা করবে।SocketChannel
কোনো I/O অপারেশনে ব্লক না হয়ে থ্রেডটি অন্য কাজ করতে পারবে। এটি একাধিক সংযোগ এবং I/O অপারেশনকে একযোগে পরিচালনা করতে সাহায্য করে।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();
}
}
socketChannel.read()
ব্যবহার করে ক্লায়েন্ট থেকে ডেটা পড়া হচ্ছে এবং প্রাপ্ত ডেটা প্রিন্ট করা হচ্ছে।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();
}
}
ByteBuffer.wrap()
ব্যবহার করে ক্লায়েন্ট একটি বার্তা সার্ভারে পাঠাচ্ছে।socketChannel.read()
ব্যবহার করা হচ্ছে।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();
}
}
}
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();
}
}
বৈশিষ্ট্য | ব্লকিং 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