Сетевое программирование на Python — многозадачная версия статического веб-сервера
Сетевое программирование на Python — многозадачная версия статического веб-сервера

Обзор

Используйте многопоточность, чтобы позволить веб-серверу обрабатывать доступ нескольких пользователей одновременно. Когда соединение между клиентом и сервером успешно установлено, создается подпоток, который используется для специальной обработки запроса клиента, чтобы предотвратить блокировку основного потока. Установите созданный подпоток в качестве защитного основного потока, чтобы основной поток не смог выйти.

Этапы реализации

1. Импортируйте модуль потоковой обработки.

Язык кода:javascript
копировать
import threading

2. Установите повторное использование номера порта, и порт будет освобожден сразу после выхода из программы.

Язык кода:javascript
копировать
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

3. Когда клиент и сервер установят процесс соединения, создайте дочерний поток.

Задайте имя цели и передайте параметр new_socket в виде кортежа.

Язык кода:javascript
копировать
 sub_thread = threading.Thread(target=handle_client_request, args=(new_socket,))

4. Настройте основной процесс демона.

Язык кода:javascript
копировать
sub_thread.setDaemon(True)

5. Запустить дочернюю тему

Язык кода:javascript
копировать
sub_thread.start()

Реализация кода

Язык кода:javascript
копировать
import socket
import threading


# Обрабатывать запросы клиентов
def handle_client_request(new_socket):
    # Код выполняется до этого момента, что указывает на то, что соединение успешно установлено.
    recv_client_data = new_socket.recv(4096)
    if len(recv_client_data) == 0:
        print("Закройте браузер")
        new_socket.close()
        return

    # Декодировать двоичные данные
    recv_client_content = recv_client_data.decode("utf-8")
    print(recv_client_content)
    # Разделить по указанной строке, Максимальное количество делений указано как 2.
    request_list = recv_client_content.split(" ", maxsplit=2)

    # Получить запрошенный путь к ресурсу
    request_path = request_list[1]
    print(request_path)

    # Определите, относится ли запрос к корневому каталогу. Если условие истинно, верните указанные данные домашней страницы.
    if request_path == "/":
        request_path = "/index.html"

    try:
        # Динамическое открытие указанного файла
        with open("static" + request_path, "rb") as file:
            # Чтение данных файла
            file_data = file.read()
    except Exception as e:
        # Запрошенный ресурс не существует, и возвращаются данные 404.
        # строка ответа
        response_line = "HTTP/1.1 404 Not Found\r\n"
        # Заголовок ответа
        response_header = "Server: PWS1.0\r\n"
        with open("static/error.html", "rb") as file:
            file_data = file.read()
        # тело ответа
        response_body = file_data

        # Объединение ответных сообщений
        response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        # Отправить данные
        new_socket.send(response_data)
    else:
        # строка ответа
        response_line = "HTTP/1.1 200 OK\r\n"
        # Заголовок ответа
        response_header = "Server: PWS1.0\r\n"

        # тело ответа
        response_body = file_data

        # Объединение ответных сообщений
        response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        # Отправить данные
        new_socket.send(response_data)
    finally:
        # Закройте сокет между службой и клиентом
        new_socket.close()


# Функция входа в программу
def main():
    # Создать сокет TCP-сервера
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # Установить повторное использование номера порта, Порт выхода программы освобождается немедленно
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # Привязать номер порта
    tcp_server_socket.bind(("", 9000))
    # Настроить прослушивание
    tcp_server_socket.listen(128)

    while True:
        # Ожидание принятия запроса на подключение клиента
        new_socket, ip_port = tcp_server_socket.accept()
        print(ip_port)
        # Когда клиент и сервер устанавливают процесс соединения, создайте дочерний поток.
        sub_thread = threading.Thread(target=handle_client_request, args=(new_socket,))
        # Настройте основной поток демона
        sub_thread.setDaemon(True)
        # Запустите дочерний поток для выполнения соответствующей задачи.
        sub_thread.start()


if __name__ == '__main__':
    main()
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose