Python এ সকেট প্রোগ্রামিং নেটওয়ার্ক প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপনের জন্য ব্যবহৃত হয়। Python এর socket
লাইব্রেরি এই প্রোগ্রামিংয়ের জন্য প্রয়োজনীয় সব ফাংশন সরবরাহ করে। এটি TCP/IP, UDP, এবং অন্যান্য নেটওয়ার্ক প্রোটোকল ভিত্তিক যোগাযোগে ব্যবহৃত হতে পারে।
Python এ সকেট প্রোগ্রামিং করার মাধ্যমে আপনি ইন্টারনেট বা লোকাল নেটওয়ার্কে দুটি সিস্টেমের মধ্যে ডেটা আদান-প্রদান করতে পারবেন। এখানে আমরা বিভিন্ন ধরনের সকেট প্রোগ্রামিংয়ের উদাহরণ এবং তার ব্যবহারের বিষয়ে আলোচনা করব।
TCP/IP প্রোটোকলটি সংযোগ-ভিত্তিক এবং এটি ডেটা প্রেরণের জন্য একটি নির্ভরযোগ্য পথ নিশ্চিত করে। একটি TCP/IP সার্ভার এবং ক্লায়েন্ট তৈরি করা হবে যেখানে সার্ভার ডেটা গ্রহণ করবে এবং ক্লায়েন্ট সার্ভারে ডেটা পাঠাবে।
import socket
# TCP/IP সকেট তৈরি করা
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সার্ভার বाइন্ড করা
server_socket.bind(('localhost', 65432))
# সংযোগ শোনা শুরু করা
server_socket.listen()
print("Server is listening for connections...")
# ক্লায়েন্টের সাথে সংযোগ করা
client_socket, client_address = server_socket.accept()
print(f"Connection established with {client_address}")
# ক্লায়েন্ট থেকে ডেটা গ্রহণ করা
data = client_socket.recv(1024)
print(f"Received data: {data.decode()}")
# ক্লায়েন্টকে রিপ্লাই পাঠানো
client_socket.sendall(b"Hello from the server!")
# সংযোগ বন্ধ করা
client_socket.close()
server_socket.close()
import socket
# TCP/IP সকেট তৈরি করা
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সার্ভারের সাথে সংযোগ করা
client_socket.connect(('localhost', 65432))
# সার্ভারে ডেটা পাঠানো
client_socket.sendall(b"Hello, Server!")
# সার্ভার থেকে রিপ্লাই গ্রহণ করা
data = client_socket.recv(1024)
print(f"Received from server: {data.decode()}")
# সংযোগ বন্ধ করা
client_socket.close()
কী হচ্ছে এখানে?
UDP একটি কানেকশনলেস প্রোটোকল এবং এটি কম লেটেন্সি প্রয়োজনীয় অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত, যেখানে প্যাকেট হারানো মেনে নেওয়া যায়।
import socket
# UDP সকেট তৈরি করা
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# সার্ভারের পোর্টে বাউন্ড করা
server_socket.bind(('localhost', 65432))
print("UDP server is listening for messages...")
# ক্লায়েন্ট থেকে ডেটা গ্রহণ করা
data, client_address = server_socket.recvfrom(1024)
print(f"Received message: {data.decode()} from {client_address}")
# ক্লায়েন্টকে রিপ্লাই পাঠানো
server_socket.sendto(b"Hello from UDP server!", client_address)
server_socket.close()
import socket
# UDP সকেট তৈরি করা
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# সার্ভারে মেসেজ পাঠানো
client_socket.sendto(b"Hello, UDP Server!", ('localhost', 65432))
# সার্ভার থেকে রিপ্লাই গ্রহণ করা
data, server_address = client_socket.recvfrom(1024)
print(f"Received from server: {data.decode()}")
client_socket.close()
কী হচ্ছে এখানে?
নন-ব্লকিং সকেট ব্যবহার করে একটি সকেট কোনো I/O অপারেশন সম্পন্ন হওয়ার জন্য অপেক্ষা করবে না, বরং অবিলম্বে কাজ করতে যাবে। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন একাধিক ক্লায়েন্টের সাথে যোগাযোগ করতে হয়।
import socket
# TCP/IP সকেট তৈরি করা
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# নন-ব্লকিং সকেট তৈরি করা
server_socket.setblocking(False)
# সার্ভার বাউন্ড করা
server_socket.bind(('localhost', 65432))
# সংযোগ শোনা শুরু করা
server_socket.listen()
print("Non-blocking server is listening for connections...")
while True:
try:
# ক্লায়েন্টের সাথে সংযোগ করা
client_socket, client_address = server_socket.accept()
print(f"Connection established with {client_address}")
# ক্লায়েন্ট থেকে ডেটা গ্রহণ করা
data = client_socket.recv(1024)
print(f"Received data: {data.decode()}")
# ক্লায়েন্টকে রিপ্লাই পাঠানো
client_socket.sendall(b"Hello from the non-blocking server!")
client_socket.close()
except BlockingIOError:
continue # কোনো ক্লায়েন্ট সংযোগ না আসলে আবার চেষ্টা করা
এখানে, setblocking(False)
কল ব্যবহার করা হয়েছে যাতে সকেট নন-ব্লকিং মোডে চলে যায় এবং সার্ভার অন্য কাজ করতে পারে যখন ক্লায়েন্ট সংযোগের জন্য অপেক্ষা করছে।
select()
বা poll()
) ব্যবহার করে একাধিক ক্লায়েন্ট পরিচালনা করা যায়।Python এ সকেট প্রোগ্রামিং একটি শক্তিশালী টুল, যা নেটওয়ার্কের মধ্যে কম্পিউটারগুলোকে একে অপরের সাথে যোগাযোগ করতে সক্ষম করে। TCP এবং UDP প্রোটোকল সহ, নন-ব্লকিং সকেট, এবং নিরাপত্তা প্রোটোকলগুলো যেমন SSL/TLS ব্যবহার করে আপনি নিরাপদ এবং দক্ষ নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করতে পারবেন।
সকেট প্রোগ্রামিং হল একটি নেটওয়ার্ক প্রোগ্রামিং কৌশল যা বিভিন্ন প্রোগ্রাম বা প্রসেসের মধ্যে যোগাযোগ তৈরি করতে ব্যবহৃত হয়। Python এ সকেট প্রোগ্রামিং এর মাধ্যমে দুটি বা তার বেশি সিস্টেমের মধ্যে ডেটা ট্রান্সফার করা সম্ভব। এটি ক্লায়েন্ট-সার্ভার মডেল অনুসরণ করে, যেখানে একটি প্রোগ্রাম (সার্ভার) অন্য একটি প্রোগ্রাম (ক্লায়েন্ট) এর সাথে যোগাযোগ স্থাপন করে।
Python-এ সকেট প্রোগ্রামিংয়ের জন্য socket
নামক বিল্ট-ইন লাইব্রেরি ব্যবহৃত হয়, যা সকেট তৈরি, সংযোগ স্থাপন, ডেটা পাঠানো, গ্রহণ করা ইত্যাদি কাজ পরিচালনা করতে সাহায্য করে।
Python-এ সকেট প্রোগ্রামিং শুরু করার জন্য আপনাকে socket
লাইব্রেরিটি ইমপোর্ট করতে হবে। নিচে Python দিয়ে TCP সকেট সার্ভার এবং ক্লায়েন্ট তৈরি করার উদাহরণ দেওয়া হয়েছে।
একটি TCP সার্ভার ক্লায়েন্টের সাথে সংযোগ স্থাপন করে এবং ক্লায়েন্টের পাঠানো বার্তা গ্রহণ করে সাড়া দেয়।
import socket
# সার্ভারের হোস্ট নাম এবং পোর্ট নম্বর
host = '127.0.0.1'
port = 65432
# সকেট তৈরি করা
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সকেটটি সুনির্দিষ্ট হোস্ট এবং পোর্টে বেঁধে দেওয়া
server_socket.bind((host, port))
# সকেটটি ক্লায়েন্ট সংযোগের জন্য শুনছে
server_socket.listen()
print("Server listening on", host, ":", port)
# ক্লায়েন্টের সাথে সংযোগ স্থাপন
client_socket, client_address = server_socket.accept()
print(f"Connection established with {client_address}")
# ক্লায়েন্ট থেকে বার্তা গ্রহণ করা
data = client_socket.recv(1024)
print("Received message:", data.decode())
# সার্ভার থেকে ক্লায়েন্টকে সাড়া পাঠানো
client_socket.sendall(b"Hello, Client!")
# সংযোগ বন্ধ করা
client_socket.close()
কোডের ব্যাখ্যা:
bind()
ফাংশন দিয়ে একটি নির্দিষ্ট হোস্ট এবং পোর্ট নম্বর সেট করে।listen()
ফাংশনটি সার্ভারকে ক্লায়েন্টের সংযোগের জন্য প্রস্তুত করে।accept()
ফাংশনটি ক্লায়েন্টের সাথে সংযোগ গ্রহণ করে এবং একটি ক্লায়েন্ট সকেট তৈরি করে।recv()
ফাংশন ক্লায়েন্ট থেকে ডেটা গ্রহণ করে এবং sendall()
ফাংশন ক্লায়েন্টে সাড়া পাঠায়।এখন, TCP ক্লায়েন্ট তৈরি করা হবে, যা সার্ভারের সাথে সংযোগ স্থাপন করবে এবং সার্ভারকে একটি বার্তা পাঠাবে।
import socket
# সার্ভারের হোস্ট নাম এবং পোর্ট নম্বর
host = '127.0.0.1'
port = 65432
# ক্লায়েন্ট সকেট তৈরি করা
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সার্ভারের সাথে সংযোগ স্থাপন
client_socket.connect((host, port))
# সার্ভারকে বার্তা পাঠানো
message = "Hello, Server!"
client_socket.sendall(message.encode())
# সার্ভার থেকে সাড়া গ্রহণ করা
data = client_socket.recv(1024)
print("Received from server:", data.decode())
# সংযোগ বন্ধ করা
client_socket.close()
কোডের ব্যাখ্যা:
connect()
ফাংশন দিয়ে সার্ভারের সাথে সংযোগ স্থাপন করা হয়।sendall()
ফাংশন ব্যবহার করে ক্লায়েন্ট একটি বার্তা সার্ভারে পাঠায়।recv()
ফাংশন ব্যবহার করে সার্ভার থেকে সাড়া গ্রহণ করা হয়।UDP (User Datagram Protocol) প্রোটোকলটি একটি কানেকশনলেস প্রোটোকল, যা কম দেরিতে ডেটা প্রেরণ করতে সাহায্য করে। UDP সিস্টেমে সংযোগের প্রয়োজন হয় না, তবে এটি ডেটার গ্যারান্টি দেয় না (যেমন, ডেটা হারানো হতে পারে)।
import socket
# সার্ভারের হোস্ট নাম এবং পোর্ট নম্বর
host = '127.0.0.1'
port = 65432
# UDP সকেট তৈরি করা
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# সার্ভারের হোস্ট এবং পোর্টে বেঁধে দেওয়া
server_socket.bind((host, port))
print("UDP Server is listening...")
# ডেটা গ্রহণ করা
data, client_address = server_socket.recvfrom(1024)
print(f"Received message: {data.decode()} from {client_address}")
# সাড়া পাঠানো
server_socket.sendto(b"Hello, Client!", client_address)
import socket
# সার্ভারের হোস্ট নাম এবং পোর্ট নম্বর
host = '127.0.0.1'
port = 65432
# UDP সকেট তৈরি করা
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# সার্ভারে বার্তা পাঠানো
message = "Hello, Server!"
client_socket.sendto(message.encode(), (host, port))
# সার্ভার থেকে সাড়া গ্রহণ করা
data, server_address = client_socket.recvfrom(1024)
print("Received from server:", data.decode())
# সংযোগ বন্ধ করা
client_socket.close()
যেহেতু সকেট প্রোগ্রামিংয়ের মাধ্যমে নেটওয়ার্কের মাধ্যমে ডেটা পাঠানো হয়, সুতরাং নিরাপত্তা অত্যন্ত গুরুত্বপূর্ণ। কিছু নিরাপত্তা কৌশল হল:
Python এর মাধ্যমে সকেট প্রোগ্রামিং খুবই শক্তিশালী একটি কৌশল যা আপনি সার্ভার এবং ক্লায়েন্ট অ্যাপ্লিকেশন তৈরি করতে ব্যবহার করতে পারেন। TCP এবং UDP প্রোটোকল ব্যবহার করে আপনি যোগাযোগ স্থাপন করতে পারবেন এবং ডেটা আদান-প্রদান করতে পারবেন। সঠিকভাবে প্রোগ্রামিং এবং নিরাপত্তা কৌশল ব্যবহার করে এই প্রোগ্রামগুলির কার্যকারিতা এবং সুরক্ষা নিশ্চিত করা সম্ভব।
TCP (Transmission Control Protocol) এবং UDP (User Datagram Protocol) উভয়ই কম্পিউটার নেটওয়ার্কে ডেটা ট্রান্সফারের জন্য ব্যবহৃত প্রোটোকল, তবে তাদের কাজ করার ধরন ভিন্ন। TCP একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ডেটা ট্রান্সফার করতে আগে একটি সংযোগ স্থাপন করে এবং ডেটার পাঠানো নিশ্চিত করার জন্য নির্ভরযোগ্যতা প্রদান করে। অন্যদিকে, UDP একটি কানেকশনলেস প্রোটোকল, যা দ্রুত কিন্তু কম নির্ভরযোগ্য ডেটা ট্রান্সফার করে।
এখানে TCP এবং UDP এর জন্য কিছু উদাহরণ দেওয়া হল।
TCP হল একটি নির্ভরযোগ্য এবং কানেকশন-অরিয়েন্টেড প্রোটোকল। এটি সংযোগ স্থাপন করার আগে ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি হ্যান্ডশেক প্রক্রিয়া সম্পন্ন করে এবং ডেটা পাঠানোর পূর্বে সংযোগ নিশ্চিত করা হয়।
import socket
# TCP ক্লায়েন্ট সকেট তৈরি
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সার্ভারের আইপি ঠিকানা এবং পোর্ট
server_address = ('127.0.0.1', 65432)
# সার্ভারের সাথে সংযোগ স্থাপন
client_socket.connect(server_address)
try:
# সার্ভারে একটি বার্তা পাঠানো
message = "Hello, Server!"
client_socket.sendall(message.encode())
# সার্ভার থেকে উত্তর গ্রহণ
data = client_socket.recv(1024)
print(f"Received: {data.decode()}")
finally:
# সংযোগ বন্ধ করা
client_socket.close()
import socket
# TCP সার্ভার সকেট তৈরি
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সার্ভারের আইপি ঠিকানা এবং পোর্ট
server_socket.bind(('127.0.0.1', 65432))
# ক্লায়েন্ট সংযোগের জন্য শোনা শুরু করা
server_socket.listen(1)
print("Waiting for a connection...")
# ক্লায়েন্টের সংযোগ গ্রহণ
client_socket, client_address = server_socket.accept()
with client_socket:
print(f"Connected by: {client_address}")
# ক্লায়েন্ট থেকে ডেটা গ্রহণ করা
data = client_socket.recv(1024)
if data:
print(f"Received: {data.decode()}")
# ক্লায়েন্টকে উত্তর পাঠানো
client_socket.sendall(b"Hello, Client!")
এখানে, TCP ক্লায়েন্ট প্রথমে সার্ভারের সাথে সংযোগ স্থাপন করে, একটি বার্তা পাঠায়, এবং সার্ভার থেকে একটি উত্তর গ্রহণ করে। সার্ভারটি ক্লায়েন্টের সাথে সংযোগ স্থাপন করে এবং ডেটা গ্রহণ করার পর একটি উত্তর পাঠায়।
UDP হল একটি কানেকশনলেস প্রোটোকল, যা ডেটা পাঠানোর জন্য পূর্ববর্তী সংযোগের প্রয়োজন নেই এবং এটি দ্রুত ডেটা ট্রান্সফার করে। তবে, এটি নির্ভরযোগ্যতা এবং অর্ডারিং প্রদান করে না।
import socket
# UDP ক্লায়েন্ট সকেট তৈরি
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# সার্ভারের আইপি ঠিকানা এবং পোর্ট
server_address = ('127.0.0.1', 65432)
# সার্ভারে একটি বার্তা পাঠানো
message = "Hello, UDP Server!"
client_socket.sendto(message.encode(), server_address)
# সার্ভার থেকে উত্তর গ্রহণ
data, server = client_socket.recvfrom(1024)
print(f"Received: {data.decode()}")
# সকেট বন্ধ করা
client_socket.close()
import socket
# UDP সার্ভার সকেট তৈরি
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# সার্ভারের আইপি ঠিকানা এবং পোর্ট
server_socket.bind(('127.0.0.1', 65432))
print("Waiting for a message...")
# ক্লায়েন্ট থেকে বার্তা গ্রহণ
data, client_address = server_socket.recvfrom(1024)
print(f"Received message: {data.decode()}")
# ক্লায়েন্টকে উত্তর পাঠানো
server_socket.sendto(b"Hello, UDP Client!", client_address)
# সকেট বন্ধ করা
server_socket.close()
UDP উদাহরণে, ক্লায়েন্ট সরাসরি সার্ভারে একটি বার্তা পাঠায় এবং সার্ভার থেকে উত্তর গ্রহণ করে। UDP তে কোনও সংযোগ স্থাপন বা নিশ্চিতকরণ নেই, এবং বার্তা দ্রুত পাঠানো হয়।
বৈশিষ্ট্য | TCP | UDP |
---|---|---|
কানেকশন | কানেকশন-অরিয়েন্টেড (Connection-oriented) | কানেকশনলেস (Connectionless) |
নির্ভরযোগ্যতা | নির্ভরযোগ্য (Reliable) | অ-নির্ভরযোগ্য (Unreliable) |
তথ্য প্রেরণ | ডেটা অর্ডার মেনে পাঠানো হয় | ডেটা অর্ডার ছাড়াই পাঠানো হয় |
সংযোগ স্থাপন | সংযোগ স্থাপনের প্রক্রিয়া (Handshake) | কোন সংযোগ স্থাপন নেই |
পর্যাপ্ততা | কম গতিতে, কিন্তু নির্ভরযোগ্য | দ্রুত, তবে প্যাকেট লস হতে পারে |
ব্যবহার | ফাইল ট্রান্সফার, ওয়েব ব্রাউজিং | স্ট্রিমিং, গেমিং, ভয়েস কল |
TCP এবং UDP উভয়ই গুরুত্বপূর্ণ নেটওয়ার্ক প্রোটোকল, তবে তাদের ব্যবহারের ক্ষেত্র এবং উদ্দেশ্য ভিন্ন। যেখানে TCP নির্ভরযোগ্য সংযোগ এবং ডেটা আদান-প্রদান প্রয়োজন, সেখানে UDP দ্রুত যোগাযোগ এবং কম লেটেন্সির জন্য উপযুক্ত। আপনার প্রয়োজনে নির্ভর করে আপনি যে প্রোটোকলটি ব্যবহার করবেন তা নির্বাচন করতে পারবেন।
socket
মডিউল ব্যবহার করে Server এবং Client তৈরিPython এর socket
মডিউল নেটওয়ার্ক প্রোগ্রামিংয়ের জন্য একটি শক্তিশালী টুল। এটি TCP/IP প্রোটোকলের মাধ্যমে সার্ভার এবং ক্লায়েন্টের মধ্যে যোগাযোগ স্থাপন করতে ব্যবহৃত হয়। এখানে আমরা একটি সহজ TCP/IP সার্ভার এবং ক্লায়েন্ট তৈরি করব, যেখানে সার্ভার একটি পোর্টে অপেক্ষা করবে এবং ক্লায়েন্ট সেই পোর্টে সংযোগ করে সার্ভারের সাথে ডেটা আদান-প্রদান করবে।
সার্ভার একটি নির্দিষ্ট পোর্টে ক্লায়েন্টের সংযোগের জন্য অপেক্ষা করবে এবং ক্লায়েন্ট থেকে আসা ডেটা গ্রহণ করবে। এটি একটি সাধারণ TCP সার্ভার হবে যা একটি ক্লায়েন্টের কাছ থেকে ডেটা নিয়ে উত্তর পাঠাবে।
import socket
# সার্ভার সেটআপ
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সার্ভারের IP এবং পোর্ট সেট করা
server_socket.bind(('127.0.0.1', 65432))
# সার্ভারের লিসেনিং শুরু
server_socket.listen()
print("Server is listening for incoming connections...")
# ক্লায়েন্ট সংযোগ গ্রহণ
client_socket, client_address = server_socket.accept()
print(f"Connection established with {client_address}")
# ক্লায়েন্ট থেকে ডেটা গ্রহণ করা
data = client_socket.recv(1024)
print(f"Received data: {data.decode()}")
# ক্লায়েন্টকে রিপ্লাই পাঠানো
client_socket.sendall(b"Hello, Client!")
# সংযোগ বন্ধ করা
client_socket.close()
127.0.0.1
(লোকালহোস্ট) আইপি এবং 65432
পোর্টে সংযোগ গ্রহণের জন্য অপেক্ষা করবে।accept()
মেথডের মাধ্যমে সংযোগ গ্রহণ করবে।ক্লায়েন্ট সার্ভারের সাথে সংযোগ স্থাপন করবে এবং একটি মেসেজ পাঠাবে। সার্ভার থেকে উত্তর পেলে সেটি ক্লায়েন্টের দিকে ফেরত পাঠাবে।
import socket
# ক্লায়েন্ট সেটআপ
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# সার্ভারের IP এবং পোর্টে সংযোগ করা
client_socket.connect(('127.0.0.1', 65432))
# সার্ভারকে একটি মেসেজ পাঠানো
client_socket.sendall(b"Hello, Server!")
# সার্ভার থেকে উত্তর গ্রহণ করা
data = client_socket.recv(1024)
print(f"Received from server: {data.decode()}")
# সংযোগ বন্ধ করা
client_socket.close()
127.0.0.1
আইপি এবং 65432
পোর্টে সংযোগ করবে।সার্ভার আউটপুট:
Server is listening for incoming connections...
Connection established with ('127.0.0.1', 51234)
Received data: Hello, Server!
ক্লায়েন্ট আউটপুট:
Received from server: Hello, Client!
এটি একটি সাধারণ TCP/IP সার্ভার এবং ক্লায়েন্টের উদাহরণ যা Python এর socket
মডিউল ব্যবহার করে তৈরি করা হয়েছে। সার্ভার ক্লায়েন্টের সংযোগ গ্রহণ করে ডেটা গ্রহণ করে এবং একটি উত্তর পাঠায়, এবং ক্লায়েন্ট সার্ভারে সংযোগ করে ডেটা পাঠায় এবং উত্তর গ্রহণ করে। socket
মডিউল এর মাধ্যমে আপনি আরও উন্নত নেটওয়ার্ক প্রোগ্রামিং করতে পারেন, যেমন মাল্টি-ক্লায়েন্ট হ্যান্ডলিং, আসিঙ্ক্রোনাস যোগাযোগ, এবং সিকিউরড (SSL/TLS) সংযোগ তৈরি।
Concurrency এবং Asynchronous Sockets হল নেটওয়ার্ক প্রোগ্রামিংয়ের গুরুত্বপূর্ণ ধারণা যা একাধিক টাস্ক একযোগে পরিচালনা করার জন্য ব্যবহৃত হয়। এই ধারণাগুলি সিস্টেমের কার্যকারিতা বৃদ্ধি করতে সহায়ক, বিশেষ করে যখন একাধিক ক্লায়েন্ট বা নেটওয়ার্কের মধ্যে চলমান অনেক কাজ পরিচালনা করতে হয়।
এখানে, Concurrency এবং Asynchronous Sockets এর মধ্যে পার্থক্য এবং Python এ তাদের প্রয়োগের উদাহরণ দেয়া হবে।
Concurrency হল একাধিক কাজ একই সময়ে সম্পাদিত হওয়ার সম্ভাবনা, কিন্তু তাদের সমাপ্তি একে অপরের সাথে ওভারল্যাপ করতে পারে। Concurrency একাধিক কাজ বা থ্রেডের মধ্যে প্রসেসগুলিকে পরিচালনা করতে সাহায্য করে, যদিও একাধিক কাজ একযোগে সম্পাদন নাও হতে পারে। উদাহরণস্বরূপ, একটি সার্ভার যখন একাধিক ক্লায়েন্টের সাথে যোগাযোগ স্থাপন করে, তখন এটি একযোগে তাদের থেকে ডেটা গ্রহণ বা পাঠাতে সক্ষম হয়।
import socket
import threading
def handle_client(client_socket):
request = client_socket.recv(1024)
print(f"Received: {request.decode()}")
client_socket.send(b"Hello Client")
client_socket.close()
def start_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 65432))
server.listen(5)
print("Server listening on port 65432")
while True:
client_socket, client_address = server.accept()
print(f"Connection from {client_address}")
client_handler = threading.Thread(target=handle_client, args=(client_socket,))
client_handler.start()
start_server()
এখানে, প্রতিটি ক্লায়েন্টের জন্য একটি নতুন থ্রেড তৈরি করা হচ্ছে, যাতে সার্ভার একাধিক ক্লায়েন্টের সাথে সমান্তরালভাবে যোগাযোগ স্থাপন করতে পারে। এর মাধ্যমে প্রতিটি ক্লায়েন্টের জন্য আলাদা ট্রেডিং করা হয়, যা সার্ভারকে একাধিক ক্লায়েন্টের সাথে যোগাযোগ করতে সক্ষম করে।
Asynchronous Sockets এমন এক ধরনের সকেট প্রোগ্রামিং যেখানে একটি থ্রেড ব্লক না হয়ে ব্যাকগ্রাউন্ডে কাজ করতে থাকে। এর মাধ্যমে, নেটওয়ার্কের মধ্যে ডেটা পাঠানোর জন্য অপেক্ষা করার সময় অন্য কাজ করা যায়। Asynchronous programming সাধারণত callback functions বা event-driven programming ব্যবহার করে কাজ করে।
Python এর asyncio লাইব্রেরি দিয়ে সহজেই Asynchronous সোসকেট প্রোগ্রাম তৈরি করা যায়।
import asyncio
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message} from {addr}")
response = f"Hello, {message}"
writer.write(response.encode())
await writer.drain()
print("Closing the connection")
writer.close()
async def main():
server = await asyncio.start_server(
handle_client, '127.0.0.1', 65432)
addr = server.sockets[0].getsockname()
print(f"Serving on {addr}")
async with server:
await server.serve_forever()
asyncio.run(main())
এখানে asyncio ব্যবহার করা হয়েছে যা আসিঙ্ক্রোনাস সার্ভার তৈরি করতে সাহায্য করে। যখন ক্লায়েন্ট সংযোগ করে, তখন handle_client()
ফাংশন আসিঙ্ক্রোনাসভাবে কাজ করে এবং সেই সময় অন্য ক্লায়েন্টদের জন্য সার্ভারটি কার্যকরী থাকে।
async def
: অ্যাসিঙ্ক্রোনাস ফাংশন তৈরি করে।await
: ইভেন্টের শেষ হওয়া পর্যন্ত অপেক্ষা করে, তবে পুরো থ্রেড ব্লক না হয়।asyncio.start_server()
: সার্ভার শুরু করে এবং আসিঙ্ক্রোনাসভাবে ক্লায়েন্টদের সাথে কাজ করতে পারে।একটি ওয়েব সার্ভারে Concurrency এবং Asynchronous Programming এর একত্রিত ব্যবহার হতে পারে যেখানে সার্ভারটি একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগ করে এবং সেগুলির প্রতিক্রিয়া দ্রুত সরবরাহ করে।
import asyncio
import threading
# আসিঙ্ক্রোনাস হ্যান্ডলার
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message} from {addr}")
response = f"Hello, {message}"
writer.write(response.encode())
await writer.drain()
print("Closing the connection")
writer.close()
# থ্রেডেড অ্যাসিঙ্ক্রোনাস সার্ভার
def run_server():
asyncio.run(main())
async def main():
server = await asyncio.start_server(
handle_client, '127.0.0.1', 65432)
addr = server.sockets[0].getsockname()
print(f"Serving on {addr}")
async with server:
await server.serve_forever()
# সার্ভার থ্রেড তৈরি করা
server_thread = threading.Thread(target=run_server)
server_thread.start()
এখানে, একটি থ্রেড তৈরি করা হয়েছে যা আসিঙ্ক্রোনাস সার্ভার চালায়। এর ফলে সার্ভারটি একাধিক ক্লায়েন্টকে সঠিকভাবে পরিচালনা করতে পারে এবং প্রতিটি ক্লায়েন্টের জন্য অপেক্ষা করার পরিবর্তে ব্যাকগ্রাউন্ডে কাজ করতে থাকে।
এভাবে, Concurrency এবং Asynchronous Programming এর সমন্বয় করা গেলে নেটওয়ার্ক সার্ভার এবং অ্যাপ্লিকেশনগুলি আরও দক্ষ এবং স্কেলেবল হতে পারে।
common.read_more