diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/__pycache__/main.cpython-313.pyc" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/__pycache__/main.cpython-313.pyc" new file mode 100644 index 000000000..7590e7dc5 Binary files /dev/null and "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/__pycache__/main.cpython-313.pyc" differ diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/client.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/client.py" new file mode 100644 index 000000000..8026b97bc --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/client.py" @@ -0,0 +1,34 @@ +import socket +import time + +conn = socket.socket() + +conn.connect( ("127.0.0.1", 8080) ) +conn.setblocking(0) + +def recv_data(conn): + data = b"" + time.sleep(2) + try: + tmp = conn.recv(1024) + while tmp: + data += tmp + tmp = conn.recv(1024) + except BlockingIOError: + pass + return data + + +def main(): + data = b"Hello server!\r\n\r\n" + + + print(f"Sending message: {data}") + conn.send(data) + data = recv_data(conn) + print(f"Получен ответ: {data.decode("utf-8")}") + conn.close() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/server.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/server.py" new file mode 100644 index 000000000..0f62a34fe --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part1/server.py" @@ -0,0 +1,83 @@ +import socket +import traceback +from logging import getLogger, basicConfig, INFO + +# Configure logger +basicConfig(level=INFO, format='%(asctime)s - %(levelname)s - %(message)s') +logger = getLogger() + +def send_answer(conn, status="200 OK", typ="text/plain; charset=utf-8", data=""): + addr = conn.getpeername() + logger.info(f"[{addr[0]}:{addr[1]}] Answering with: \"{data}\"") + data = data.encode("utf-8") + try: + conn.sendall(data) + logger.info(f"[{addr[0]}:{addr[1]}] Successfully sent response.") + except BrokenPipeError: + logger.error(f"[{addr[0]}:{addr[1]}] Connection closed before response could be sent.") + +def parse(conn): + addr = conn.getpeername() + conn.settimeout(1.0) + data = b"" + try: + tmp = conn.recv(1024) + while tmp and "\r\n\r\n" not in str(tmp): + data += tmp + tmp = conn.recv(1024) + except socket.timeout: + logger.warning(f"[{addr[0]}:{addr[1]}] Timed out waiting for data.") + + if not data: + return + + udata = data.decode("utf-8") + # logger.info(udata) + + logger.info(f"[{addr[0]}:{addr[1]}] sent message: \"{udata}\"") + + answer = "Hello, client" + send_answer(conn, data=answer) + +sock = socket.socket() +sock.bind(("", 8080)) +sock.listen(5) +sock.settimeout(1.0) + +logger.info("Server started on port 8080. Press Ctrl+C to stop.") + +try: + while True: + try: + conn, addr = sock.accept() + conn.setblocking(0) + except socket.timeout: + continue + except KeyboardInterrupt: + break + except Exception as e: + logger.error("Unexpected error during accept: %s", e) + logger.error(traceback.format_exc()) + continue + + try: + logger.info("New connection from %s:%s", addr[0], addr[1]) + parse(conn) + except Exception as e: + logger.error("Exception occurred while handling request: %s", e) + logger.error(traceback.format_exc()) + try: + send_answer(conn, "500 Internal Server Error", data="Ошибка") + except: + pass + finally: + try: + conn.close() + except: + pass + +except KeyboardInterrupt: + logger.info("Server stopped by user.") +finally: + sock.close() + logger.info("Socket closed.") \ No newline at end of file diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/__pycache__/main.cpython-313.pyc" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/__pycache__/main.cpython-313.pyc" new file mode 100644 index 000000000..7590e7dc5 Binary files /dev/null and "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/__pycache__/main.cpython-313.pyc" differ diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/client.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/client.py" new file mode 100644 index 000000000..055555f68 --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/client.py" @@ -0,0 +1,16 @@ +import socket +import json + +def main(): + a = input("Введите катет a: ") + b = input("Введите катет b: ") + request = {"a": a, "b": b} + + with socket.socket() as conn: + conn.connect(("127.0.0.1", 8080)) + conn.sendall(json.dumps(request).encode("utf-8")) + response = conn.recv(1024).decode("utf-8") + print("Ответ от сервера:", response) + +if __name__ == "__main__": + main() diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/server.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/server.py" new file mode 100644 index 000000000..e4b725145 --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part2/server.py" @@ -0,0 +1,38 @@ +import socket +import json +from math import sqrt + +def handle_connection(conn): + data = conn.recv(1024) + if not data: + return + try: + request = json.loads(data.decode("utf-8")) + a = float(request["a"]) + b = float(request["b"]) + c = sqrt(a ** 2 + b ** 2) + response = f"Гипотенуза: {c:.2f}" + except Exception as e: + response = f"Ошибка обработки запроса: {e}" + print(f"Ответ клиенту {conn.getpeername()}: {response}") + conn.sendall(response.encode("utf-8")) + conn.close() + +def main(): + sock = socket.socket() + sock.bind(("", 8080)) + sock.listen(5) + sock.settimeout(5.0) + print("Сервер запущен на порту 8080...") + try: + while True: + conn, addr = sock.accept() + print(f"Подключение от {addr}") + handle_connection(conn) + except KeyboardInterrupt: + print("Сервер остановлен.") + finally: + sock.close() + +if __name__ == "__main__": + main() diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/__pycache__/main.cpython-313.pyc" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/__pycache__/main.cpython-313.pyc" new file mode 100644 index 000000000..7590e7dc5 Binary files /dev/null and "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/__pycache__/main.cpython-313.pyc" differ diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/client.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/client.py" new file mode 100644 index 000000000..6fef8cace --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/client.py" @@ -0,0 +1,24 @@ +import socket + +HOST = "127.0.0.1" +PORT = 8080 + +def main(): + request = "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" + + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client: + client.connect((HOST, PORT)) + client.sendall(request.encode("utf-8")) + + response = b"" + while True: + data = client.recv(1024) + if not data: + break + response += data + + print("Ответ от сервера:") + print(response.decode("utf-8")) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/index.html" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/index.html" new file mode 100644 index 000000000..35c24c3f7 --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/index.html" @@ -0,0 +1,11 @@ + + + + + Привет от сервера + + +

Добро пожаловать!

+

Это HTML-страница, полученная от Python-сервера.

+ + \ No newline at end of file diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/server.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/server.py" new file mode 100644 index 000000000..a3e8ce810 --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part3/server.py" @@ -0,0 +1,50 @@ +import socket +import os + +HOST = "" +PORT = 8080 +HTML_FILE = "index.html" + +def load_html(): + if not os.path.exists(HTML_FILE): + return "

404 Not Found

", 404 + + with open(HTML_FILE, "r", encoding="utf-8") as f: + return f.read(), 200 + +def build_http_response(body, status_code=200): + status_line = { + 200: "HTTP/1.1 200 OK", + 404: "HTTP/1.1 404 Not Found" + }.get(status_code, "HTTP/1.1 500 Internal Server Error") + + headers = [ + status_line, + "Content-Type: text/html; charset=utf-8", + f"Content-Length: {len(body.encode('utf-8'))}", + "Connection: close", + "", + "" + ] + response = "\r\n".join(headers) + body + return response.encode("utf-8") + +def main(): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server: + server.bind((HOST, PORT)) + server.listen(5) + print(f"Сервер запущен на http://localhost:{PORT}") + while True: + client_conn, client_addr = server.accept() + with client_conn: + print(f"Подключение от {client_addr}") + request = client_conn.recv(1024).decode("utf-8") + print("Запрос клиента:") + print(request.splitlines()[0]) + + html, status = load_html() + response = build_http_response(html, status) + client_conn.sendall(response) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/__pycache__/main.cpython-313.pyc" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/__pycache__/main.cpython-313.pyc" new file mode 100644 index 000000000..7590e7dc5 Binary files /dev/null and "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/__pycache__/main.cpython-313.pyc" differ diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/client.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/client.py" new file mode 100644 index 000000000..15bd76ad3 --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/client.py" @@ -0,0 +1,47 @@ +import socket +import threading +import sys + +HOST = "127.0.0.1" +PORT = 8080 + +def receive_messages(conn): + while True: + try: + data = conn.recv(1024) + if not data: + print("Соединение с сервером закрыто.") + break + print("\r" + data.decode("utf-8") + "\n> ", end="") + except ConnectionResetError: + print("Сервер отключился.") + break + except Exception as e: + print(f"Ошибка приема: {e}") + break + +def main(): + try: + conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + conn.connect((HOST, PORT)) + print("Подключено к чату. Напиши сообщение и нажми Enter. Введите /exit для выхода.") + except Exception as e: + print(f"Не удалось подключиться к серверу: {e}") + return + + receiver_thread = threading.Thread(target=receive_messages, args=(conn,)) + receiver_thread.start() + + try: + while True: + msg = input("> ") + if msg.strip().lower() == "/exit": + break + conn.sendall(msg.encode("utf-8")) + except KeyboardInterrupt: + print("\nВыход...") + finally: + conn.close() + +if __name__ == "__main__": + main() diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/server.py" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/server.py" new file mode 100644 index 000000000..5dcd53245 --- /dev/null +++ "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/part4/server.py" @@ -0,0 +1,51 @@ +import socket +import threading + +HOST = "0.0.0.0" +PORT = 8080 + +clients = [] + +def broadcast(message, sender_conn): + for client in clients: + if client != sender_conn: + try: + client.sendall(message) + except: + client.close() + clients.remove(client) + +def handle_client(conn, addr): + print(f"[{addr}] подключился.") + clients.append(conn) + try: + while True: + data = conn.recv(1024) + if not data: + break + message = f"[{addr}] ".encode("utf-8") + data + broadcast(message, conn) + except: + pass + finally: + print(f"[{addr}] отключился.") + conn.close() + clients.remove(conn) + +def main(): + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.bind((HOST, PORT)) + server.listen() + print(f"Сервер запущен на {HOST}:{PORT}") + try: + while True: + conn, addr = server.accept() + thread = threading.Thread(target=handle_client, args=(conn, addr), daemon=True) + thread.start() + except KeyboardInterrupt: + print("Сервер остановлен.") + finally: + server.close() + +if __name__ == "__main__": + main() diff --git "a/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/\320\223\321\203\321\201\320\265\320\262_lab6.pdf" "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/\320\223\321\203\321\201\320\265\320\262_lab6.pdf" new file mode 100644 index 000000000..c19f19b78 Binary files /dev/null and "b/works/K3320/\320\223\321\203\321\201\320\265\320\262_\320\257\321\200\320\276\321\201\320\273\320\260\320\262/6/\320\223\321\203\321\201\320\265\320\262_lab6.pdf" differ