কম্পিউটার টিউটোরিয়াল

পাইথনে লো-লেভেল নেটওয়ার্কিং ইন্টারফেস (socket)

পাইথনের স্ট্যান্ডার্ড লাইব্রেরির 'socket' মডিউল সংজ্ঞায়িত করে যে কীভাবে সার্ভার এবং ক্লায়েন্ট মেশিন অপারেটিং সিস্টেমের উপরে সকেট এন্ডপয়েন্ট ব্যবহার করে যোগাযোগ করতে পারে। 'socket' API-তে সংযোগ-উদ্দেশ্য (connection-oriented) এবং সংযোগ-রহিত (connectionless) নেটওয়ার্ক প্রোটোকলের জন্য ফাংশন রয়েছে।

সকেট একটি টু-ওয়ে কমিউনিকেশন লিংকের এন্ডপয়েন্ট। এটি IP ঠিকানা এবং পোর্ট নম্বর দ্বারা চরিত্রিত হয়। সার্ভার এবং ক্লায়েন্ট উভয় প্রান্তে সকেটের সঠিক কনফিগারেশন প্রয়োজন যাতে সংযোগ শুরু করা যায়। এটি ক্লায়েন্ট-সার্ভার পরিবেশে ইনকামিং মেসেজ শোনা এবং রেসপন্স পাঠানো সম্ভব করে।

সকেট অবজেক্ট তৈরি করা

'socket' মডিউলের socket() ফাংশন একটি সকেট অবজেক্ট সেট আপ করে:

import socket
obj = socket.socket(family, type, protocol)

'family' আর্গুমেন্টের ডিফল্ট মান AF_INET। অন্যান্য গ্রহণযোগ্য মান: AF_INET6, AF_UNIX, AF_CAN বা AF_RDS। 'type' আর্গুমেন্টের ডিফল্ট মান 'SOCK_STREAM' যা সংযোগ-উদ্দেশ্য প্রোটোকোল (TCP) নির্দেশ করে। সংযোগ-রহিত প্রোটোকোল (UDP) এর জন্য এটি 'SOCK_DGRAM' সেট করতে হয়। 'protocol' আর্গুমেন্ট সাধারণত ০ দ্বারা ডিফল্ট সেট থাকে।

সার্ভার এবং ক্লায়েন্টে সকেট অবজেক্টগুলো যথাক্রমে সার্ভার সকেট এবং ক্লায়েন্ট সকেট বলা হয়। সকেট অবজেক্ট নিচের মেথডগুলো ইমপ্লিমেন্ট করে:

bind() এই মেথড সকেটকে নির্দিষ্ট IP ঠিকানা এবং পোর্ট নম্বরের সাথে বাইন্ড করে।
listen() এই মেথড সার্ভার শুরু করে এবং ক্লায়েন্টের সংযোগ অনুরোধ খুঁজতে একটি লিসেন লুপে চলে যায়।
accept() যখন সার্ভার সংযোগ অনুরোধ বাধা দেয়, এই মেথড সেটি গ্রহণ করে এবং ক্লায়েন্ট সকেটকে তার ঠিকানার সাথে শনাক্ত করে।

সার্ভার সাইড কোড

import socket
ss = socket.socket()
ss.bind(('localhost', 12345))
ss.listen()
client, addr = ss.accept()
print("connection request from: " + str(addr))

যদি লোকাল মেশিনকে সার্ভার হিসেবে ব্যবহার করা হয় যাতে একই মেশিন ক্লায়েন্ট হিসেবে ইনকামিং মেসেজ শোনা যায়, তবে এর IP ঠিকানা '127.0.0.1' যাকে লুপব্যাক ঠিকানা বলা হয়। এটি 'localhost' হোস্টনেম দ্বারা শনাক্ত করা হয়। সকেটকে একটি خود Комбিনেশন খালি পোর্ট নম্বরে লিসেন করতে করা হয়। দূরবর্তী মেশিনগুলির মধ্যে নেটওয়ার্কে যোগাযোগের জন্য প্রকৃত IP ঠিকানা ব্যবহার করতে হয়।

ক্লায়েন্ট সাইড সংযোগ

connect()

obj = socket.socket()
obj.connect((host, port))

একবার ক্লায়েন্টের সংযোগ অনুরোধ সার্ভার দ্বারা গ্রহণ হলে, উভয় সকেট অবজেক্ট TCP প্রোটোকোল ব্যবহার করে সংযুক্ত হয় এবং ডেটা পাঠাতে/প্রাপ্ত করতে পারে।

ডেটা পাঠানো এবং গ্রহণ করা

send()

সার্ভার আটকানো ঠিকানা ব্যবহার করে ক্লায়েন্টকে ডেটা পাঠায়।

client.send(bytes)

ক্লায়েন্ট সকেট সাথে সংযুক্ত সকেটকে ডেটা পাঠায়।

obj.send(bytes)

sendall()

send()-এর মতো। এই মেথড ডেটা পাঠাতে থাকে যতক্ষণ না সকল ডেটা পাঠানো হয়।

sendto()

এই মেথড শুধু UDP প্রোটোকলের ক্ষেত্রে ব্যবহার করা হয়।

recv()

এই মেথড ক্লায়েন্টকে পাঠানো ডেটা পুনরুদ্ধার করতে ব্যবহৃত হয়। সার্ভারের ক্ষেত্রে, এটি সে রিমোট সকেট ব্যবহার করে যার অনুরোধ গ্রহণ করা হয়েছিল।

client.recv(bytes)

ক্লায়েন্টের ক্ষেত্রে:

obj.recv(bytes)

recvfrom()

এই মেথড UDP প্রোটোকলের ক্ষেত্রে ব্যবহার করা হয়।

সম্পূর্ণ সার্ভার কোড

import socket
host = "127.0.0.1"
port = 12345
ss = socket.socket()
ss.bind((host, port))
ss.listen()
cs, addr = ss.accept()
print("Connection from: " + str(addr))
while True:
    data = cs.recv(1024).decode()
    if not data:
        break
    print("from connected user: " + str(data))
    print("Received from User: " + str(data))
    data = input("type message: ")
    cs.send(data.encode())
cs.close()

সম্পূর্ণ ক্লায়েন্ট কোড

import socket
host = '127.0.0.1'
port = 12345
obj = socket.socket()
obj.connect((host, port))
message = input("type message: ")
while message != 'q':
    obj.send(message.encode())
    data = obj.recv(1024).decode()
    print('Received from server: ' + data)
    message = input("type message: ")
obj.close()

দুটি কমান্ড প্রম্পট উইন্ডো খুলুন। একটিতে প্রথম সার্ভার কোড চালান। তারপর অন্যটিতে ক্লায়েন্ট কোড চালান।

পাইথনে লো-লেভেল নেটওয়ার্কিং ইন্টারফেস (socket)

  1. পাইথনে লো-লেভেল নেটওয়ার্কিং ইন্টারফেস (socket)

  2. পাইথনে SMTP প্রোটোকল ক্লায়েন্ট (smtplib)

  3. Python Socket Error 48 সমাধান

  4. রুবি নেটওয়ার্ক প্রোগ্রামিং: সকেট দিয়ে কাস্টম ক্লায়েন্ট ও সার্ভার বানান