Библиотека socket в Python позволяет создавать сетевые приложения, работать с протоколами TCP, UDP и др. Она предоставляет доступ к сокетам, которые являются конечной точкой двухсторонней связи между клиентом и сервером.

В библиотеке socket есть несколько функций для работы с сокетами, основные из них:

  1. socket(): создает новый сокет и возвращает его дескриптор.
  2. bind(): связывает сокет с определенным адресом.
  3. listen(): прослушивает входящие соединения на сокете.
  4. accept(): принимает входящее соединение.
  5. connect(): устанавливает соединение с другим сокетом.
  6. send(): отправляет данные через сокет.
  7. recv(): принимает данные из сокета.

Пример создания TCP-сервера:

import socket

HOST = '0.0.0.0' # Используем все доступные интерфейсы
PORT = 9002 # Произвольный порт

# Создание сокета
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()  # Слушаем новые подключения

    print(f"Server is listening on {HOST}:{PORT}...")

    while True:
        conn, addr = s.accept()  # Принимаем новое подключение
        with conn:
            print(f"Connected by {addr}")

            while True:
                data = conn.recv(1024)  # Получаем сообщение от клиента
                if not data:  # Если сообщение пустое, то закрываем соединение
                    print(f"Client {addr} closed the connection")
                    break

                message = data.decode().strip()  # Декодируем полученное сообщение
                print(f"Received message from {addr}: {message}")

                response = message + message  # Формируем ответ, умножив полученное сообщение на 2

                conn.sendall(response.encode())  # Отправляем ответ клиенту

В этом коде мы создаем объект socket с использованием AF_INET для указания IPv4 и SOCK_STREAM для указания, что мы хотим использовать TCP-соединение. Затем мы привязываем сокет к IP-адресу и порту и начинаем прослушивание сокета.

Когда клиент подключается, мы принимаем его соединение и ждем сообщения от него. Когда мы получаем сообщение, мы добавляем двойную строку и отправляем его обратно клиенту.

Мы продолжаем принимать сообщения от клиента до тех пор, пока он не отправит сообщение или exit. Затем мы закрываем соединение и закрываем сокеты.

Пример создания TCP-клиента:

import socket

HOST = '127.0.0.1'  # адрес сервера
PORT = 9002  # порт сервера

# создаем сокет
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # устанавливаем соединение с сервером
    s.connect((HOST, PORT))
    print('Connected to server')

    # запрашиваем у пользователя ввод сообщений, пока он не введет "exit"
    while True:
        message = input('Enter message: ')
        if message == 'exit':
            break

        # отправляем сообщение серверу
        s.sendall(message.encode())

        # получаем ответ от сервера и выводим его на экран
        data = s.recv(1024)
        print('Received:', data.decode())

В этом примере мы используем бесконечный цикл, который запрашивает у пользователя ввод сообщений до тех пор, пока он не введет "exit". Затем мы отправляем сообщение на сервер и получаем ответ.