Перейти к содержанию

Задание №3

Задание

Реализовать серверную часть приложения. Клиент подключается к серверу. В ответ клиент получает http-сообщение, содержащее html-страницу, которую сервер подгружает из файла index.html.

Обязательно использовать библиотеку socket

server.py
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8080))
server_socket.listen(10)
server_socket.settimeout(0.5)

try:
    while True:
        try:
            client_socket, address = server_socket.accept()

            with open("index.html", encoding="utf-8") as f:
                index_html = f.read().encode()

            headers = (
                "HTTP/1.1 200 OK\n"
                "Content-Type: text/html\n"
                f"Content-Length: {len(index_html)}\n"
                "Connection: close\n\n"
            ).encode()

            client_socket.sendall(headers + index_html)

        except socket.timeout:
            pass

except KeyboardInterrupt:
    server_socket.close()

Основа программы осталась примерно такой же, как и в предыдущем задании.

Добавилось чтение из index.html файла с помощью контекстного менеджера with open().
Важно при чтении указать правильную кодировку, чтобы не было проблем с кириллицей.

Помимо содержимого HTML-файла, добавляем к запросу заголовки:

  • HTTP/1.1 200 OK: версия HTTP и статус ответа.
  • Content-Type: text/html: формат ответа.
  • Content-Length: {len(index_html)}: размер ответа. Важный заголовок, дающий клиенту понять, когда закончится ответ. Без него соединение не остановится.
  • Connection: close: даёт клиенту понять, что соединение нужно остановить.
index.html
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Привет, мир!</title>
</head>
<body>
Привет, мир!
</body>
</html>

Самый базовый вариант HTML-страницы, достаточный для проверки работоспособности сервера.