Робимо ECHO сервер на Python

Робимо ECHO сервер на Python

Привіт! Сьогодні я вперше спробував зробити щось подібне.

Програмування з використанням сокетів і передача даних між комп'ютерами за допомогою мережі вважається мережним програмуванням.

Принцип роботи:

Коли ви запускаєте серверний скрипт, він слухає на заданому порту, очікуючи на вхідні з'єднання від клієнтів. Коли клієнт намагається підключитися до сервера, сервер приймає з'єднання за допомогою s.accept(), створюючи новий сокет для спілкування з клієнтом.

Після створення з'єднання клієнт може надсилати повідомлення на сервер за допомогою s.sendall(), а сервер може приймати повідомлення від клієнта за допомогою conn.recv(). Дані, які надсилає клієнт, оброблюються сервером та відправляються назад до клієнта за допомогою conn.sendall(). Цей процес триває до тих пір, поки клієнт або сервер не закриють з'єднання.

Реалізація

Перед тим як почати, треба дізнатися ваш IPv4.

IPv4 є важливим компонентом мережного програмування, оскільки він визначає адресування та розподілення даних в мережі. В програмах, що використовують мережні протоколи, такі як TCP/IP, IPv4 використовується для визначення адреси сервера або пристрою, якому буде надіслано запит, а також для прийняття даних від сервера чи пристрою іншого користувача.

Для того, щоб це зробити, вам тре зайти до терміналу та вписати команду нижче:

ipconfig

Після того як ви це зробили, ми можемо перейти до написання серверу

Сервер

Спочатку тре імпортувати бібліотеку socket:

import socket

Далі створюємо змінні HOST, PORT:

HOST = "ВАШ IPv4"
PORT = 1024 

Порт можна писати будь-який з 1024. Порти від 1024 до 65535 є непривілейованими портами, і їх можна використовувати для будь-яких цілях.

А тепер основний код:

# Створення сокету з IPv4 адресацією та протоколом TCP
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))  # прив'язка сокету до конкретної адреси та порту
    s.listen()  # очікування на вхідні з'єднання
    conn, addr = s.accept()  # отримання з'єднання та адреси клієнта
    with conn:  # створення об'єкту з'єднання
        print(f"Підключено: {addr}")  # виведення повідомлення про підключення клієнта
        while True:  # безкінечний цикл для отримання та відправлення даних
            data = conn.recv(1024)  # отримання даних від клієнта
            if not data:  # перевірка, чи є дані
                break  # якщо немає, виходимо з циклу
            conn.sendall(data)  # відправлення отриманих даних назад клієнту

socket.socket(): цей метод створює новий сокет з заданими параметрами. У цьому коді ми створюємо сокет з IPv4 адресацією та протоколом TCP за допомогою socket.AF_INET та socket.SOCK_STREAM відповідно.

s.listen(): цей метод розпочинає очікування на вхідні з'єднання. У цьому коді ми розпочинаємо очікування на вхідні з'єднання на створеному сокеті.

s.accept(): цей метод отримує вхідне з'єднання та адресу клієнта, який з'єднався з сокетом. У цьому коді ми очікуємо на вхідне з'єднання та отримуємо з'єднання та адресу клієнта у змінні conn та addr відповідно.

conn.recv(): цей метод отримує дані від клієнта на підключеному з'єднанні. У цьому коді ми отримуємо дані розміром не більше 1024 байтів від клієнта на з'єднанні conn.

conn.sendall(): цей метод відправляє дані на з'єднання клієнту. У цьому коді ми відправляємо отримані дані назад клієнту на з'єднанні conn.

conn.close(): цей метод закриває з'єднання з клієнтом. У цьому коді ми не використовуємо цей метод, адже ми використовуємо контекстний менеджер with, який автоматично закриє з'єднання при виході з нього.

s.bind(): цей метод прив'язує сокет до певної адреси та порту. У цьому коді ми прив'язуємо сокет до локальної адреси "ВАШ IPv4" та порту "1024".

Клієнт

import socket

HOST = "ВАШ IPv4"  # IP адреса або ім'я хоста сервера
PORT = 1024        # Порт, який використовується сервером

# Використовуючи контекстний менеджер, створюємо новий сокет з IPv4-адресацією та типом передачі даних SOCK_STREAM
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    
    # Викликаємо метод connect(), щоб встановити з'єднання з сервером за допомогою вказаної IP-адреси та порту
    s.connect((HOST, PORT))
    
    # Використовуючи метод sendall(), передаємо повідомлення "Hello, server!" у вигляді байтів на сервер
    s.sendall(b"Hello, server!")
    
    # Використовуючи метод recv(), отримуємо відповідь від сервера з максимальним розміром даних 1024 байти
    data = s.recv(1024)

# Виводимо отриману відповідь у вигляді рядка на екран
print("Received", repr(data))

Цей код - це клієнтський скрипт, який встановлює з'єднання з сервером за допомогою TCP протоколу та передає йому повідомлення "Hello, server!". Після цього він отримує відповідь від сервера та виводить її у консолі.

Основна логіка коду включає в себе наступні дії:

  • Імпорт необхідної бібліотеки socket.

  • Визначення змінних HOST та PORT, що представляють IP-адресу та порт сервера відповідно.

  • Використання контекстного менеджера with разом з методом socket.socket(), щоб створити новий сокет.

  • Виклик методу s.connect() для встановлення з'єднання з сервером за допомогою IP-адреси та порту.

  • Відправлення повідомлення "Hello, server!" на сервер за допомогою методу s.sendall().

  • Отримання відповіді від сервера за допомогою методу s.recv().

  • Виведення отриманої відповіді на екран за допомогою функції print().

  • Автоматичне закриття сокету за допомогою контекстного менеджера with.

Отже, загальна мета цього коду - встановити з'єднання з сервером, передати йому повідомлення та отримати відповідь від нього.

Розширюйте, покращуйте, вдосконалюйте, зміцнюйте український контент.

Слава Україні!

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Пан Євген
Пан Євген@Ukrainian

6KПрочитань
0Автори
67Читачі
Підтримати
На Друкарні з 16 квітня

Більше від автора

Вам також сподобається

Коментарі (4)

👌

Вам також сподобається