আপনি কি রুবিতে কাস্টম নেটওয়ার্ক ক্লায়েন্ট এবং সার্ভার তৈরি করতে চান? অথবা এটা কিভাবে কাজ করে বুঝবেন?
তারপর আপনাকে সকেটের সাথে মোকাবিলা করতে হবে।
রুবি নেটওয়ার্ক প্রোগ্রামিং-এর এই সফরে আমার সাথে যোগ দিন বুনিয়াদি শিখতে, এবং রুবি ব্যবহার করে অন্যান্য সার্ভার এবং ক্লায়েন্টদের সাথে কথা বলা শুরু করুন!
তাহলে সকেট কি? ?
সকেট হল কমিউনিকেশন চ্যানেলের শেষ পয়েন্ট, ক্লায়েন্ট এবং সার্ভার উভয়ই যোগাযোগের জন্য সকেট ব্যবহার করে।
তারা যেভাবে কাজ করে তা খুবই সহজ :
একবার সংযোগ স্থাপন হয়ে গেলে আপনি আপনার সকেটে ডেটা রাখতে পারেন এবং এটি অন্য প্রান্তে চলে যাবে, যেখানে রিসিভার ইনকামিং ডেটা প্রক্রিয়া করতে সকেট থেকে পড়বে৷
সকেটের ধরন
আপনার কাছে কয়েকটি ধরণের সকেট উপলব্ধ রয়েছে, সবচেয়ে সাধারণ — TCP সকেট — আপনাকে HTTP বা FTP-এর মতো TCP-ভিত্তিক পরিষেবাগুলিতে সংযোগ করতে দেয়৷
যদি আপনাকে একটি UDP ভিত্তিক প্রোটোকল ব্যবহার করতে হয় তাহলে আপনি UDP সকেট ব্যবহার করতে পারেন।
অন্যান্য ধরণের সকেটগুলি একটু বেশি রহস্যময়, ইউনিক্স সকেটগুলি সম্পূর্ণ TCP সংযোগের ওভারহেড ছাড়াই ইউনিক্স সিস্টেমে IPC (আন্তঃ-প্রক্রিয়া যোগাযোগ) অনুমোদন করে।
রুবিতে সকেট ব্যবহার করা
এখন যেহেতু আমরা জানি সকেটগুলি আমাদের জন্য কী করতে পারে এখন সেগুলি ব্যবহার শুরু করার সময় এসেছে৷
৷প্রথমে, আপনার প্রোগ্রামে সকেট লাইব্রেরি প্রয়োজন:
require 'socket'
একটি TCP সকেট তৈরি করতে আপনি TCPSocket ব্যবহার করতে পারেন ক্লাস, প্যারামিটার হিসাবে আপনার গন্তব্য আইপি ঠিকানা এবং পোর্টের প্রয়োজন হবে।
এটি একটি সংযোগ স্থাপনের চেষ্টা করবে, যদি এটি প্রতিষ্ঠিত না হয় তবে আপনি একটি 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
আমাদের উদাহরণ সার্ভার পোর্ট 8080 এ শুনবে এবং একটি বার্তার মাধ্যমে একটি সংযোগকারী ক্লায়েন্টকে অভিবাদন জানাবে৷
লক্ষ্য করুন কিভাবে আমরা শুধুমাত্র একজন ক্লায়েন্টকে গ্রহণ করতে পারি এবং প্রোগ্রাম শেষ হবে।
একাধিক ক্লায়েন্ট গ্রহণ করা
একাধিক ক্লায়েন্ট গ্রহণ করতে এবং প্রতিক্রিয়া জানাতে, আমাদের একটি লুপ এবং কিছু থ্রেডের প্রয়োজন হবে৷
উদাহরণ :
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
এটি একটি নতুন সার্ভার শুরু করা উচিত যা আপনি এটি বন্ধ না করা পর্যন্ত শুনতে থাকবে৷
আপনি যদি এটিকে পরবর্তী স্তরে নিয়ে যেতে এবং রুবিতে একটি ওয়েব সার্ভার লিখতে শিখতে চান তবে এই ব্লগ পোস্টটি পড়ুন৷
উপসংহার
আপনি শিখেছেন টিসিপি সকেট কি, তারা কিভাবে কাজ করে এবং কিভাবে আপনি কিছু রুবি ক্লাস যেমন TCPServer
ব্যবহার করতে পারেন &TCPSocket
রুবি অ্যাপ্লিকেশন তৈরি করতে যা ইন্টারনেটে অন্যান্য মেশিনের সাথে যোগাযোগ করতে পারে।
রুবি নেটওয়ার্ক প্রোগ্রামিং এর সাথে খেলা মজাদার!
এখন যান কিছু চমৎকার তৈরি করুন এবং সবার সাথে শেয়ার করুন মন্তব্য বিভাগে 🙂
এছাড়াও আপনি যদি আপনার রুবি দক্ষতার উন্নতি চালিয়ে যেতে চান তবে আমার নিউজলেটারে যোগ দিতে ভুলবেন না!