SocketChannel হল Java NIO এর একটি গুরুত্বপূর্ণ ক্লাস যা নেটওয়ার্কে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ করার জন্য ব্যবহৃত হয়। এটি non-blocking এবং blocking I/O অপারেশন পরিচালনা করতে সক্ষম এবং একটি SocketChannel সুনির্দিষ্ট পোর্টে ডেটা পাঠাতে বা গ্রহণ করতে সক্ষম হয়।
Java NIO এর মাধ্যমে, SocketChannel এর সাহায্যে আপনি ক্লায়েন্ট এবং সার্ভার অ্যাপ্লিকেশন তৈরি করতে পারেন, যা একে অপরের সাথে TCP/IP সংযোগে ডেটা আদান-প্রদান করে। এটি একটি বিশেষ সুবিধা প্রদান করে, কারণ SocketChannel নন-ব্লকিং মোডে কাজ করতে পারে, যার ফলে একাধিক কনেকশন এবং ডেটা প্রক্রিয়াকরণ একযোগে করা সম্ভব হয়।
SocketChannel এর কার্যপ্রণালী
- Non-blocking Mode:
SocketChannelনন-ব্লকিং মোডে কাজ করতে সক্ষম, যেখানে একটি থ্রেড ডেটা পাঠানোর জন্য ব্লক না হয়ে অন্য কাজ করতে পারে। এটি মূলত যখন সার্ভার থেকে বা ক্লায়েন্টে ডেটা পাঠানোর জন্য অপেক্ষা করা হয় তখন ব্যবহৃত হয়। - TCP/IP Communication: এটি TCP/IP প্রোটোকল ব্যবহার করে নেটওয়ার্কে ডেটা ট্রান্সফার করতে পারে, তাই এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে দুটি প্রধান কাজ—ডেটা পাঠানো এবং গ্রহণ করার জন্য ব্যবহৃত হয়।
- 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();
}
}
ব্যাখ্যা:
ServerSocketChannel.open()ব্যবহার করে একটি সার্ভার সকেট চ্যানেল তৈরি করা হয়েছে।- সার্ভারটি পোর্ট 8080 এ ক্লায়েন্টের সংযোগের জন্য অপেক্ষা করছে।
- ক্লায়েন্ট সংযোগ স্থাপন করলে,
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();
}
}
ব্যাখ্যা:
SocketChannel.open()ব্যবহার করে ক্লায়েন্ট একটি সকেট চ্যানেল তৈরি করছে এবং সার্ভারের সাথে সংযোগ স্থাপন করছে।ByteBufferব্যবহার করে সার্ভারে একটি বার্তা পাঠানো হচ্ছে।- বার্তা পাঠানো হলে, ক্লায়েন্টের সকেট চ্যানেলটি বন্ধ করা হচ্ছে।
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();
}
}
ব্যাখ্যা:
socketChannel.configureBlocking(false)দিয়ে non-blocking mode সক্রিয় করা হয়েছে।finishConnect()মেথড ব্যবহার করে সংযোগ সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করা হচ্ছে, তবে এটি ব্লক না হয়ে অন্য কাজ করতে পারে।
Java NIO এর SocketChannel ক্লাস নেটওয়ার্ক সংযোগে TCP/IP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করার জন্য একটি গুরুত্বপূর্ণ উপাদান। এটি blocking এবং non-blocking মোডে কাজ করতে সক্ষম এবং এটি নেটওয়ার্ক অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করতে সহায়ক।
- SocketChannel দিয়ে আপনি TCP/IP সংযোগ স্থাপন এবং ডেটা পাঠাতে পারেন।
- Non-blocking mode ব্যবহারের মাধ্যমে আপনি একাধিক সংযোগ এবং ডেটা প্রক্রিয়াকরণ করতে সক্ষম হবেন, যা সিস্টেমের কার্যক্ষমতা বাড়ায়।
এটি Java NIO এর একটি অত্যন্ত শক্তিশালী এবং কার্যকরী ফিচার যা নেটওয়ার্ক I/O অপারেশনগুলির জন্য ব্যবহৃত হয়।
Read more