3laba/http_socket_client.py
2026-05-08 11:23:10 +03:00

61 lines
1.9 KiB
Python

# http_socket_client.py
import socket
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
def http_get_socket():
"""HTTP GET запрос через низкоуровневый socket"""
HOST = 'vyatsu.ru'
PORT = 80
# HTTP запрос вручную
request = f"""GET / HTTP/1.1
Host: {HOST}
User-Agent: PyCharm-Socket-Client
Accept: text/html
Connection: close
"""
# Заменяем переносы строк на \r\n как требует HTTP
request = request.replace('\n', '\r\n')
try:
# Создаем TCP соединение
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
logging.info(f"Подключение к {HOST}:{PORT}")
client_socket.connect((HOST, PORT))
logging.info("Отправка HTTP запроса...")
client_socket.sendall(request.encode())
# Получаем ответ
response = b''
while True:
chunk = client_socket.recv(4096)
if not chunk:
break
response += chunk
# Разбираем ответ
response_str = response.decode('utf-8', errors='replace')
# Разделяем заголовки и тело
if '\r\n\r\n' in response_str:
headers, body = response_str.split('\r\n\r\n', 1)
else:
headers = response_str
body = ''
logging.info(f"Статус: {headers.split(chr(10))[0]}")
logging.info(f"Заголовков получено: {len(headers)} символов")
logging.info(f"Тело ответа (первые 300 символов):\n{body[:300]}")
except Exception as e:
logging.error(f"Ошибка: {e}")
if __name__ == '__main__':
http_get_socket()