"হাই, অ্যামিগো!"

"হ্যালো, ঋষি!"

"আজকের পাঠের বিষয় হল সকেট।"

"আপনি ইতিমধ্যে জানেন যে নেটওয়ার্কের প্রতিটি কম্পিউটারের নিজস্ব অনন্য আইপি ঠিকানা রয়েছে।"

"হ্যাঁ।"

"এখন কল্পনা করুন আপনার কাছে বেশ কয়েকটি কম্পিউটার আছে, প্রতিটিতে এক ডজন প্রোগ্রাম চলছে যা ইন্টারনেট অ্যাক্সেস করে: স্কাইপ, আইসিকিউ ইত্যাদি।"

"এবং এই প্রোগ্রামগুলি একে অপরের সাথে যোগাযোগ করতে চায়।"

"আমাদের একে অপরের সাথে হস্তক্ষেপ করা থেকে তাদের থামাতে হবে। আমাদের এটি তৈরি করতে হবে যাতে স্কাইপ স্কাইপের সাথে সংযুক্ত হয়, স্ল্যাক স্ল্যাকের সাথে সংযোগ করে ইত্যাদি।"

"মনে রাখবেন কিভাবে এই সমস্যাটি URL এবং ওয়েব সার্ভারের সাথে সমাধান করা হয়েছিল?"

"হ্যাঁ, আমরা পোর্ট যোগ করেছি।"

"ঠিক।"

"এটি একটি বাড়িতে একটি গুচ্ছ ছোট কক্ষ তৈরি করার মতো এবং বলা যে বাড়িটি একটি অ্যাপার্টমেন্ট বিল্ডিং। প্রতিটি বন্দর একটি পৃথক অ্যাপার্টমেন্টের মতো। "

"যদি একটি IP ঠিকানা একটি কম্পিউটারের জন্য একটি অনন্য শনাক্তকারী হয়, তাহলে একটি পোর্টের সাথে মিলিত একটি IP ঠিকানা কম্পিউটারের একটি নির্দিষ্ট 'অ্যাপার্টমেন্ট'-এর জন্য একটি অনন্য সনাক্তকারী, যেখানে একটি প্রোগ্রাম থাকতে পারে। "

"এই অনন্য অবস্থানটিকে একটি সকেট বলা হয় ।"

"একটি সকেটের নিজস্ব অনন্য নম্বর থাকে যা একটি IP ঠিকানা এবং একটি পোর্ট নম্বর নিয়ে গঠিত। "

"আহ। অন্য কথায়, একটি সকেট হল কিছু ভার্চুয়াল কম্পিউটার অবস্থানের জন্য একটি সনাক্তকারী যেখানে একটি প্রোগ্রাম থাকতে পারে? এবং অন্য একটি প্রোগ্রাম এই অবস্থানে বার্তা পাঠায়, যা দুটি প্রোগ্রামকে যোগাযোগ করতে দেয়?"

"আমি জানি না আপনি কীভাবে এটি বুঝতে পেরেছেন, তবে এটি একেবারে সঠিক।"

"আমার রোবো-সেন্স আমাকে বলেছে।"

"দারুণ। তাহলে একটু বিস্তারিত জানাই।"

"সকেটগুলি আসলে প্রোগ্রামগুলির যোগাযোগের জন্য সবচেয়ে মৌলিক এবং আদিম উপায়।"

"সকেটের সাথে কাজ করার জন্য জাভাতে দুটি ক্লাস আছে। সেগুলো হল সকেট এবং সার্ভারসকেট ।"

" সার্ভারসকেট হল একটি বিশেষ শ্রেণী যার বস্তুগুলি সার্ভারকে প্রতিনিধিত্ব করে, অর্থাৎ তারা আমাকে একটি নির্দিষ্ট সকেটে আসা পরিষেবার অনুরোধগুলি করতে দেয়।"

" সকেট ক্লাসটি আসলে একটি ক্লায়েন্ট সকেট। আমরা অন্য সকেটে বার্তা পাঠাতে এবং প্রতিক্রিয়া পেতে এটি ব্যবহার করি।"

"এখানে কিভাবে একটি সকেটে একটি বার্তা পাঠাতে হয়:"

উদাহরণ
// Create a socket
Socket clientSocket = new Socket("localhost", 4444);

// Get an OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

// Read the response
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

"এটি সবই ইন্টারনেট থেকে একটি ফাইল ডাউনলোড করার মতোই।"

"এটা, আমার ছেলে, কারণ সেখানেও সকেট ব্যবহার করা হয়।"

"সকেটগুলি একটি নেটওয়ার্কের সাথে যুক্ত সমস্ত কিছুর কেন্দ্রে থাকে - ভাল, প্রায় সবকিছু।"

"আপনি এখানে অতিরিক্ত তথ্য পড়তে পারেন "

"পাঠের জন্য ধন্যবাদ, ঋষি।"

"আমি এখনও সম্পন্ন করিনি। এটা ইচ্ছাপূরণের চিন্তা।"

"এখন আমরা অনুসন্ধান করব কিভাবে একটি সার্ভার সকেট কাজ করে।"

"এটা একটু বেশি জটিল।"

উদাহরণ
// Create a server socket object
ServerSocket serverSocket = new ServerSocket(4444); // Port

// Process incoming connections in a loop
while (true)
{
 // The accept method waits for someone to connect
 Socket socket = serverSocket.accept();

 // Read the response
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 // Create a response - we'll just reverse the string
 String reverseMessage = new StringBuilder(message).reverse().toString();

 // Send the response
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

"আমি কয়েকটি পয়েন্টে আপনার দৃষ্টি আকর্ষণ করতে চাই।"

"পয়েন্ট 1: একটি (ক্লায়েন্ট) সকেট তৈরি করতে, আপনাকে একটি আইপি ঠিকানা (বা ডোমেন নাম) এবং পোর্ট নির্দিষ্ট করতে হবে। একটি সার্ভার সকেট তৈরি করতে, আপনাকে শুধুমাত্র একটি পোর্ট নির্দিষ্ট করতে হবে। সার্ভার সকেট শুধুমাত্র কম্পিউটারে বিদ্যমান যেখানে এটি তৈরি করা হয়েছিল।"

"পয়েন্ট 2: সার্ভারসকেট ক্লাসে একটি গ্রহণ () পদ্ধতি রয়েছে যা একটি ইনকামিং সংযোগের জন্য অপেক্ষা করে৷ অন্য কথায়, কিছু ক্লায়েন্ট সকেট সংযোগ করার চেষ্টা না করা পর্যন্ত পদ্ধতিটি চিরতরে চলবে৷ তারপর স্বীকার() পদ্ধতিটি সংযোগ গ্রহণ করে, একটি সকেট তৈরি করে৷ যোগাযোগের অনুমতি দেওয়ার জন্য বস্তু, এবং তারপর এই বস্তুটি ফেরত দেয়।"

"একজন জাভা প্রোগ্রামারের দৃষ্টিকোণ থেকে, একটি সকেট হল দুটি স্ট্রীম: একটি ইনপুটস্ট্রিম যেখান থেকে আপনি বার্তা/ডেটা পড়েন এবং একটি আউটপুট স্ট্রীম যেখানে আপনি বার্তা/ডেটা লেখেন।"

"যখন আপনি একটি সার্ভার সকেট তৈরি করেন, আপনি আসলে একটি পোর্ট তৈরি করছেন যা অন্য কম্পিউটারের ক্লায়েন্ট সকেটগুলি সংযুক্ত করতে পারে৷ কিন্তু এটি করার জন্য, তাদের অবশ্যই আমাদের সকেটের পোর্ট নম্বর এবং আমাদের কম্পিউটারের IP ঠিকানা সঠিকভাবে উল্লেখ করতে হবে৷ ভাল, অথবা এর ডোমেইন নাম।"

"এখানে আপনার জন্য একটি আকর্ষণীয় উদাহরণ। আপনি এটি খনন করে এটি চালানোর চেষ্টা করতে পারেন:"

https://www.logicbig.com/tutorials/core-java-tutorial/http-server/http-server-basic.html

"পুরো বিষয় হল একটি সুপার আদিম ওয়েব সার্ভার লিখতে একটি সার্ভার সকেট ব্যবহার করা যা আপনি কেবল একটি ব্রাউজার থেকে অ্যাক্সেস করতে পারেন।"

"বাহ! একটি ওয়েব সার্ভার? দুর্দান্ত! আমি খুব মনোযোগ সহকারে এটি অধ্যয়ন করব।"

"ধন্যবাদ, ঋষি।"

"এটাই সব, আমিগো। যাও আরাম কর!"