রুবিতে কাস্টম নেটওয়ার্ক ক্লায়েন্ট ও সার্ভার তৈরি করতে চান? অথবা কেবল জানতে চান এটি কীভাবে কাজ করে?
তবে আপনাকে অবশ্যই সকেট-এর সাথে কাজ করতে হবে।
আমার সাথে রুবি নেটওয়ার্ক প্রোগ্রামিং-এর এই ট্যুরে যোগ দিন বেসিকগুলো শিখতে, এবং রুবি ব্যবহার করে অন্যান্য সার্ভার ও ক্লায়েন্টের সাথে কথা বলতে শুরু করুন!
সকেট কী?
সকেট হলো কমিউনিকেশন চ্যানেলের এন্ডপয়েন্ট। ক্লায়েন্ট ও সার্ভার উভয়েই কমিউনিকেশনের জন্য সকেট ব্যবহার করে।
এটি খুব সহজভাবে কাজ করে:
একবার কানেকশন স্থাপন হলে আপনি আপনার সকেটে ডেটা দিতে পারেন, যা অন্য প্রান্তে চলে যাবে। সেখানে রিসিভার সকেট থেকে পড়ে ইনকামিং ডেটা প্রসেস করবে।
সকেটের ধরন
আপনার হাতে কিছু ধরনের সকেট রয়েছে। সবচেয়ে সাধারণ — TCP সকেট — আপনাকে HTTP বা FTP-এর মতো TCP-ভিত্তিক সার্ভিসের সাথে কানেক্ট করতে দেয়।
যদি আপনাকে UDP-ভিত্তিক প্রোটোকল ব্যবহার করতে হয়, তবে UDP সকেট ব্যবহার করতে পারেন।
অন্যান্য সকেটগুলো কিছুটা বাইরেের, Unix সকেট ফুল TCP কানেকশনের ওভারহেড ছাড়া Unix সিস্টেমে IPC (ইন্টার-প্রসেস কমিউনিকেশন) সম্ভব করে।
রুবিতে সকেট ব্যবহার
এখন সকেট কী করে তা জানলে, এটি ব্যবহার করার পালা।
প্রথমে, আপনার প্রোগ্রামে সকেট লাইব্রেরি রিকোয়ার করুন:
require 'socket'
TCP সকেট তৈরি করতে TCPSocket ক্লাস ব্যবহার করতে পারেন, যেখানে প্যারামিটার হিসেবে গন্তব্য IP অ্যাড্রেস ও পোর্ট দিতে হবে।
এটি কানেকশন স্থাপনের চেষ্টা করবে; যদি ব্যর্থ হয় তবে Errno::ECONNREFUSED এরর দেবে।
socket = TCPSocket.new('google.com', 80)
এখন আপনি সকেটের মাধ্যমে মেসেজ পাঠাতে পারবেন, তবে অন্য প্রান্তে আপনাকে বুঝাতে হলে প্রোটোকল মেনে চলতে হবে।
socket.write "GET / HTTP/1.1" socket.write "\r\n\r\n"
TCPSocket-এর প্যারেন্ট ক্লাস থেকে অনেক মেথড ব্যবহার করতে পারবেন।

সার্ভার থেকে রেসপন্স পড়তে recv মেথড ব্যবহার করুন।
প্যারামিটার হিসেবে সকেট থেকে কত বাইট পড়তে চান তা দিতে হবে:
puts socket.recv(100)
এখানে একটি ছোট সমস্যা আছে — আপনি কোনো ডেটা পাবেন না এবং অ্যাপ্লিকেশন যেন কিছু করছে না সেভাবে দেখাবে।
কারণ হলো: যদি পড়ার জন্য পর্যাপ্ত ডেটা না থাকে, তবে প্রোগ্রাম ব্লক হয়ে যাবে।
অর্থাৎ তবে কিছু ডেটা পাওয়া যায় না বা সার্ভার কানেকশন বন্ধ না করবে না পর্যন্ত এটি অপেক্ষা করবে।
আপনি যে প্রোটোকল দিয়ে কাজ করছেন তার ওপর নির্ভর করে পড়ার ডেটার পরিমাণ বাড়ানো বা কমানো যেতে পারে।
ব্লকিং সমস্যা হলে, IO ক্লাসের readpartial এবং read_nonblock মেথডগুলো দেখুন।
TCP সার্ভার কীভাবে লিখবেন
চলুন একটি সার্ভার বানাই! প্রসেস ক্লায়েন্ট লিখার মতোই, কিন্তু এখানে সকেটকে বাইন্ড করতে হবে একটি ইন্টারফেসের সাথে, তারপর লিসেন করতে হবে, এবং শেষে ইনকামিং কানেকশন অ্যাক্সেপ্ট করতে হবে।
TCPServer ক্লাস প্রথম দুটি কাজই স্বয়ংক্রিয়ভাবে করে দেয়।
উদাহরণ:
require 'socket'
socket = TCPServer.new('0.0.0.0', 8080)
client = socket.accept
puts "New client! #{client}"
client.write("Hello from server")
client.close
এই উদাহরণ সার্ভার পোর্ট ৮০৮০-এ লিসেন করবে এবং কানেক্ট হওয়া ক্লায়েন্টকে একটি মেসেজ দিয়ে স্বাগত জানাবে।
লক্ষ্য করুন এখানে শুধু একটি ক্লায়েন্ট এক্সেপ্ট করা সম্ভব এবং তারপর প্রোগ্রাম শেষ হয়ে যাবে।
একাধিক ক্লায়েন্ট এক্সেপ্ট করা
একাধিক ক্লায়েন্ট এক্সেপ্ট ও রেসপন্স করার জন্য, আমাদের একটি লুপ এবং থ্রেড দরকার।
উদাহরণ:
require 'socket'
PORT = 8081
socket = TCPServer.new('0.0.0.0', PORT)
def handle_connection(client)
puts "New client! #{client}"
client.write("Hello from server")
client.close
end
puts "Listening on #{PORT}. Press CTRL+C to cancel."
loop do
client = socket.accept
Thread.new { handle_connection(client) }
end
এটি একটি সার্ভার শুরু করবে যা আপনি বন্ধ না করার পর্যন্ত লিসেন করে থাকবে।
যদি আপনি এটি পরবর্তী লেভেলে নিয়ে যেতে চান এবং রুবিতে ওয়েব সার্ভার লিখতে চান, তবে এই ব্লগ পোস্টটি পড়ুন।
উপসংহার
আপনি শিখেছেন TCP সকেট কী, এটি কীভাবে কাজ করে, এবং TCPServer ও TCPSocket-এর মতো রুবি ক্লাস ব্যবহার করে কীভাবে অন্য মেশিনের সাথে ইন্টারঅ্যাক্ট করতে পারেন।
রুবি নেটওয়ার্ক প্রোগ্রামিং খুবই মজাদার!
এখন কিছু সুন্দর তৈরি করুন এবং সবার সাথে শেয়ার করুন কমেন্ট সেকশনে 🙂
নিউজলেটারে জয়েন করা ভুলবেন না যদি আপনি আপনার রুবি স্কিল বাড়াতে চান!