Anophel-آنوفل چگونه در پایتون سوکت نویسی کنیم؟

چگونه در پایتون سوکت نویسی کنیم؟

انتشار:
1
0

در این مقاله با نحوه کدنویسی یک برنامه سوکت در پایتون آشنا خواهید شد. اما قبل از آن، بیایید بفهمیم سوکت چیست و در کجا ممکن است از آن استفاده کنید.

ما می توانیم سوکت را به عنوان یک اتصال سریع تعریف کنیم که امکان انتقال داده بین دو فرآیند در یک ماشین یا ماشین های مختلف را از طریق یک شبکه فراهم می کند. معمولاً در تعامل کلاینت و سرور استفاده می شود، زیرا سوکت ها به برنامه ها اجازه می دهند با استفاده از مکانیزم های داخلی سخت افزار و سیستم عامل ارتباط برقرار کنند.

برنامه نویسی سوکت چیست؟

سوکت نویسی یا 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 را دریافت کرد، از جلسه سوکت خاتمه یافت.

نتیجه

در این آموزش متوجه شدیم که سوکت یکی از اساسی ترین فناوری های شبکه کامپیوتری است و یاد گرفتیم که چگونه یک برنامه سوکت در پایتون با استفاده از ماژول سوکت در برنامه های سمت کلاینت و سمت سرور راه اندازی کنیم.

اگر مشتاق هستید پایتون را به صورت حرفه ای یادبگیرید می توانید از آموزش پیشرفته پایتون یا آموزش مقدماتی پایتون وبسایت آنوفل استفاده کنید.

#python#socket#برنامه_نویسی_سوکت#سوکت_نویسی#پایتون
نظرات ارزشمند شما :
Loading...