در این مقاله با نحوه کدنویسی یک برنامه سوکت در پایتون آشنا خواهید شد. اما قبل از آن، بیایید بفهمیم سوکت چیست و در کجا ممکن است از آن استفاده کنید.
ما می توانیم سوکت را به عنوان یک اتصال سریع تعریف کنیم که امکان انتقال داده بین دو فرآیند در یک ماشین یا ماشین های مختلف را از طریق یک شبکه فراهم می کند. معمولاً در تعامل کلاینت و سرور استفاده می شود، زیرا سوکت ها به برنامه ها اجازه می دهند با استفاده از مکانیزم های داخلی سخت افزار و سیستم عامل ارتباط برقرار کنند.
برنامه نویسی سوکت چیست؟
سوکت نویسی یا Socket Programming در واقع روشی است که به برنامهنویسان امکان برقراری ارتباط و تبادل اطلاعات بین کامپیوترها در شبکه(Network) را فراهم میکند. با استفاده از سوکت نویسی، برنامهنویسان میتوانند برنامههایی بسازند که از طریق شبکه با یکدیگر ارتباط برقرار کنند، دادهها را تبادل کنند و از طریق شبکه به سرویسها یا دستگاههای دیگری در شبکه دسترسی داشته باشند.
در سوکت نویسی، ارتباط بین دو برنامه بر اساس مدل کلاینت-سرور برقرار میشود. یک برنامه به عنوان کلاینت ارتباط را آغاز کرده و جایی است که برخی از داده ها را درخواست می کند و یک برنامه دیگر به عنوان سرور ارتباط را پذیرش میکند و داده های درخواستی را به عنوان پاسخ در اختیار کلاینت قرار می دهد. کلاینت و سرور از طریق سوکتها (socket) ارتباط برقرار میکنند. سوکت در واقع یک انتزاع نرمافزاری است که برای ارتباط در شبکه به کار میرود و میتواند به طور خلاصه به عنوان نقطه انتهایی ارتباط شبکه در نظر گرفته شود.
برنامههایی که با استفاده از سوکت نویسی نوشته میشوند، میتوانند از پروتکلهای مختلفی مانند TCP (Transmission Control Protocol) و UDP (User Datagram Protocol) برای ارتباط استفاده کنند. پروتکل TCP برای ارتباطات مطمئن و قابل اعتماد استفاده میشود، در حالی که پروتکل UDP برای ارتباطات سریعتر و امنیت پایینی دارد مورد استفاده قرار میگیرد.
بسیاری از پرکاربردترین نرمافزارهای امروزی، از جمله مرورگرهای وب، نرمافزارهای اشتراکگذاری فایل و برنامههای پیامرسانی فوری رسانههای اجتماعی مانند WhatsApp و .. اساساً به مفهوم سوکتها بستگی دارند.
در پایتون، ایجاد یک برنامه کلاینت و سرور یک کار ساده است، زیرا پایتون ماژول های داخلی زیادی برای کمک به این کار دارد.بیاید یک نگاهی به آن بیندازیم.
نحوه کدنویسی سرور
ابتدا برنامه سرور خود را کدگذاری می کنیم. برای ساده نگه داشتن آن، فرض می کنیم که سرور به هاست در یک پورت خاص گوش می دهد. هر داده ای که دریافت می کند، فقط چند حروف اسکی تصادفی را چاپ می کند و به عنوان پاسخ ارسال می کند.
همانند کد زیر:
# server.py
# Importing neccessary inbuilt modules
import socket
import random
import string
# Creating a socket instance
server_object = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# Connecting to the localhost
ip_address = '127.0.0.1'
port = 5555
server_object.bind((ip_address, port))
server_object.listen()
#Once the client connects to the particular port, the server starts to accept the request.
connection_object, _ = server_object.accept()
if connection_object:
# Connected to client successfully
print("SERVER CONNECTED TO CLIENT")
# sending initial message to the client
connection_object.send(b"type the message")
# receiving message from the client
data_receive = connection_object.recv(1024)
while data_receive != b'stop':
print("{}: {}".format("CLIENT MESSAGE: ", data_receive.decode('utf-8')))
server_input = random.choice(string.ascii_letters)
connection_object.send(server_input.encode('utf-8'))
data_receive = connection_object.recv(1024)
در کدهای بالا یک نمونه سوکت برای سرور ایجاد کردیم. می توانید ببینید که family=socket.AF_INET
خانواده آدرسی را که این سوکت می تواند بپذیرد را تعریف می کند و فقط آدرس های IPv4 مورد قبول است. و type=socket.SOCK_STREAM
تعریف می کند که سوکت فقط اتصالات TCP (پروتکل کنترل انتقال) را می پذیرد.
برای اینکه نمونه سوکت سرور بتواند درخواست ها را بشنود و بپذیرد، به یک آدرس IP و یک پورت نیاز دارد. بنابراین، ما 'ip_address = '127.0.0.1
و port= 5555
داریم. در اینجا، localhost
را به عنوان آدرس IP خود داریم زیرا سرور و کلاینت در یک دستگاه قرار دارند.
در مرحله بعدی، نمونه سرور server_object
یک آدرس را ایجاد می کند (لینک می دهد) تا کلاینتان بتوانند از آن برای یافتن سرور استفاده کنند. متد bind((ip_address,port))
یک آدرس IP محلی و یک شماره پورت را به این نمونه server_object
اختصاص می دهد، زیرا برنامه های سرور به پورت port
منتشر شده گوش می دهند. یک پورت و آدرس IP محلی باید اختصاص داده شود.
سپس شروع به گوش دادن فعال به آن پورت خاص می کند. هنگامی که کلاینت از سمت سرویس گیرنده به آن پورت متصل می شود، نمونه سرور درخواست کلاینت برای اتصال را می پذیرد. سپس یک connect_object
جدید ایجاد می کند و به نمونه سرور باز می گردد.
این connect_object
حاوی تمام اطلاعات لازم در مورد کلاینت و سرور است. اکنون از این connection_object
برای ارسال پیام از سرور به کلاینت استفاده می کنیم. بنابراین در صورتی که connect_object
با موفقیت ایجاد شود، یک پیام SERVER CONNECTED TO CLIENT
را چاپ می کنیم.
هنگامی که connect_object
ایجاد شد، نمونه یک پیام type the message
را در بایت برای کلاینت ارسال می کند و درخواست را از کلاینت دریافت می کند.
در حلقه while
، نمونه اتصال connection_object
پیام کلاینت را چاپ می کند. سپس به عنوان یک پاسخ، حروف اسکی تصادفی را ارسال می کند و منتظر درخواست کلاینت می ماند. این حلقه while
در برنامه سرور اجرا می شود تا زمانی که کلاینت پیام درخواست stop
را ارسال کند.
نحوه کدنویسی کلاینت
تا اینجا کد سمت سرور را دیده ایم.حال می خواهیم سمت کلاینت را کدنویسی کنیم که بسیار ساده است.
در کد های زیر:
# client.py
#importing socket module
import socket
# creating socket instance
client_object = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# target ip address and port
ip_address = '127.0.0.1'
port = 5555
# instance requesting for connection to the specified address and port
client_object.connect((ip_address,port))
# receiving response from server
data_receive = client_object.recv(1024)
# if response is not null
if data_receive:
# Connection is successful
print("CLIENT CONNECTED TO SERVER")
print(data_receive.decode('utf-8'))
while data_receive:
# user input
client_input = input().encode('utf-8')
# sending request to the server
client_object.send(client_input)
# receiving response from the server
data_receive = client_object.recv(1024)
if data_receive:
print("{}: {}".format("SERVER",data_receive.decode('utf-8')))
در کد سمت کلاینت، ما یک نمونه سوکت مشابه client_object
و ip_address
و port
ایجاد کردهایم، درست مانند آنچه در برنامه سمت سرور ایجاد کردیم.
مرحله بعدی استفاده از نمونه client_object
و اتصال به آدرس و پورت هدف مربوطه با استفاده از متد ()connect
است.هنگامی که اتصال موفقیت آمیز شد و connect_object
در سمت سرور ایجاد شد، سپس سرور type the message
را ارسال می کند که در data_receive
در سمت سرویس گیرنده ذخیره می شود.
از آنجایی که سرور پیام را ارسال کرده است، از این پیام برای تأیید موفقیت آمیز بودن اتصال استفاده می کنیم. بنابراین، ما CLIENT CONNECTED TO SERVER
را چاپ می کنیم و سپس پیام ارسال شده توسط سرور را تایپ می کنیم.
در حلقه while
، ابتدا با استفاده از تابع ()input
ورودی را در یک رشته می دهیم. سپس با استفاده از متد encode('utf-8')
آن را به بایت تبدیل می کنیم و در client_input
ذخیره می کنیم (زیرا داده ها فقط به صورت بایت ارسال می شوند). سپس client_input
را با استفاده از client_object.send(client_input)
به سرور ارسال می کنیم.
ما پس از ارسال درخواست به سرور، داده های پاسخ را از سرور دریافت می کنیم. سرور می پذیرد و به کلاینت پاسخ می دهد تا زمانی که تایپ کاربر به عنوان یک درخواست به سرور متوقف شود.
دقت کنید که ابتدا باید برنامه سرور و سپس برنامه کلاینت را اجرا کنیم زیرا زمانی که کلاینت می خواهد به هدف متصل شود باید سروری در حال شنود، فعال باشد.
در اینجا اجرای server.py
و سپس client.py
خواهد بود.
اگر کد ها را اجرا کنید خواهید دید که، پس از شروع اجرا، سرور SERVER CONNECTED TO CLIENT
را نمایش می دهد تا کاربر بتواند بگوید کار می کند و پیام اولیه را برای کلاینت ارسال می کند.
در سمت سرویس کلاینت ، زمانی که کلاینت پیام را دریافت کرد، CLIENT CONNECTED TO SERVER
را نمایش می داد و همچنین type the message
دریافتی از کلاینت را چاپ می کرد.
از آنجایی که کلاینت منتظر ورودی کاربر است، پس از وارد کردن ورودی، آن را به سرور ارسال می کند و سرور پیام کلاینت را چاپ می کند. سپس نامه ASCII تصادفی را به عنوان پاسخ به کلاینت ارسال کرد.
تا زمانی که کلاینت پیام stop
را به عنوان درخواست به سرور ارسال کند، جریان حلقه زده میشود. هنگامی که سرور درخواست stop
را دریافت کرد، از جلسه سوکت خاتمه یافت.
نتیجه
در این آموزش متوجه شدیم که سوکت یکی از اساسی ترین فناوری های شبکه کامپیوتری است و یاد گرفتیم که چگونه یک برنامه سوکت در پایتون با استفاده از ماژول سوکت در برنامه های سمت کلاینت و سمت سرور راه اندازی کنیم.
اگر مشتاق هستید پایتون را به صورت حرفه ای یادبگیرید می توانید از آموزش پیشرفته پایتون یا آموزش مقدماتی پایتون وبسایت آنوفل استفاده کنید.