diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_1/client.py" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_1/client.py" new file mode 100644 index 000000000..73eb7c6c5 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_1/client.py" @@ -0,0 +1,10 @@ +import socket + +HOST = '127.0.0.1' +PORT = 12345 + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((HOST, PORT)) + s.send("Hello, server".encode()) + data = s.recv(1024).decode() + print("Ответ от сервера:", data) diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_1/server.py" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_1/server.py" new file mode 100644 index 000000000..8ae53fa42 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_1/server.py" @@ -0,0 +1,17 @@ +import socket + +HOST = '127.0.0.1' +PORT = 12345 + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind((HOST, PORT)) + s.listen() + print('Сервер запущен, ожидаем подключение...') + + while True: + conn, addr = s.accept() + with conn: + print('Подключено к', addr) + data = conn.recv(1024) + print('Получено сообщение от клиента:', data.decode()) + conn.sendall(b'Hello, client') diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_2/client.py" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_2/client.py" new file mode 100644 index 000000000..f78b10e66 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_2/client.py" @@ -0,0 +1,14 @@ +import socket + +HOST = '127.0.0.1' +PORT = 12346 + +a = float(input("Введите основание a: ")) +b = float(input("Введите основание b: ")) +h = float(input("Введите высоту h: ")) + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((HOST, PORT)) + s.send(f"{a},{b},{h}".encode()) + result = s.recv(1024).decode() + print("Ответ от сервера:", result) diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_2/server.py" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_2/server.py" new file mode 100644 index 000000000..f6fa8dfdc --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_2/server.py" @@ -0,0 +1,18 @@ +import socket + +HOST = '127.0.0.1' +PORT = 12346 + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind((HOST, PORT)) + s.listen() + print(f"Математический сервер запущен на {HOST}:{PORT}") + while True: + conn, addr = s.accept() + with conn: + print(f"Клиент подключился: {addr}") + data = conn.recv(1024).decode() + print("Полученные данные:", data) + a, b, h = map(float, data.split(',')) + s_trap = ((a + b) / 2) * h + conn.send(f"Площадь трапеции: {s_trap}".encode()) diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_3/index.html" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_3/index.html" new file mode 100644 index 000000000..eb9eddba0 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_3/index.html" @@ -0,0 +1,10 @@ + + + + + HTTP-сервер + + +

Привет от самодельного HTTP-сервера!

+ + diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_3/server.py" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_3/server.py" new file mode 100644 index 000000000..3228a5000 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_3/server.py" @@ -0,0 +1,25 @@ +import socket + +HOST = '127.0.0.1' +PORT = 8080 + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind((HOST, PORT)) + s.listen() + print(f"HTTP-сервер запущен на http://{HOST}:{PORT}") + while True: + conn, addr = s.accept() + with conn: + request = conn.recv(1024) + print(f"Запрос от {addr}:\n{request.decode()}") + + with open("PROD\Task_3\index.html", "r", encoding="utf-8") as file: + html_content = file.read() + + response = ( + "HTTP/1.1 200 OK\n" + "Content-Type: text/html\n" + f"Content-Length: {len(html_content.encode())}\n\n" + f"{html_content}" + ) + conn.sendall(response.encode()) diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/chat.js" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/chat.js" new file mode 100644 index 000000000..ec5cb9b14 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/chat.js" @@ -0,0 +1,60 @@ +const ws = new WebSocket("ws://localhost:8765"); +const chat = document.getElementById("chat"); +const msgInput = document.getElementById("msg"); + +let nickname = ""; // Инициализируем переменную +let nicknameSet = false; + +ws.onmessage = (event) => { + const msg = event.data; + + if (!nicknameSet && msg === "Введите никнейм:") { + const inputNickname = prompt("Введите ваш никнейм:"); + if (inputNickname) { + nickname = inputNickname; // Сохраняем введенный ник + ws.send(nickname); + nicknameSet = true; + } + return; + } + + if (msg.includes("Никнейм уже занят")) { + alert(msg); + ws.close(); + return; + } + + const messageElement = document.createElement("div"); + messageElement.textContent = msg; + + // Определяем тип сообщения + if (msg.includes("присоединился") || msg.includes("покинул")) { + messageElement.className = "system-message"; + } else if (nickname && msg.startsWith(`${nickname}:`)) { + messageElement.className = "user-message"; + } else { + messageElement.className = "other-message"; + } + + chat.appendChild(messageElement); + chat.scrollTop = chat.scrollHeight; +}; + +function sendMessage() { + const text = msgInput.value.trim(); + if (text && nicknameSet) { + ws.send(text); + msgInput.value = ""; + } +} + +msgInput.addEventListener("keydown", (e) => { + if (e.key === "Enter") sendMessage(); +}); + +ws.onclose = () => { + const messageElement = document.createElement("div"); + messageElement.className = "system-message"; + messageElement.textContent = "Соединение закрыто"; + chat.appendChild(messageElement); +}; \ No newline at end of file diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/index.html" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/index.html" new file mode 100644 index 000000000..60104b66d --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/index.html" @@ -0,0 +1,45 @@ + + + + + + Web-chat + + + +
+

Web Chat

+
+
+ + +
+
+ + + \ No newline at end of file diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/server.py" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/server.py" new file mode 100644 index 000000000..ff8c7abc3 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/server.py" @@ -0,0 +1,49 @@ +import asyncio +import websockets + +clients = {} # websocket: nickname + +async def handler(websocket): + try: + await websocket.send("Введите никнейм:") + nickname = await websocket.recv() + + # Проверка на уникальность + if nickname in clients.values(): + await websocket.send("Никнейм уже занят. Перезагрузите страницу.") + await websocket.close() + return + + clients[websocket] = nickname + await broadcast(f"{nickname} присоединился к чату.") + + try: + async for message in websocket: + await broadcast(f"{nickname}: {message}") + except websockets.exceptions.ConnectionClosed: + pass + finally: + if websocket in clients: + await broadcast(f"{nickname} покинул чат.") + del clients[websocket] + except Exception as e: + print(f"Ошибка: {e}") + +async def broadcast(message): + to_remove = [] + for ws in clients: + try: + await ws.send(message) + except: + to_remove.append(ws) + for ws in to_remove: + if ws in clients: + del clients[ws] + +async def main(): + async with websockets.serve(handler, "localhost", 8765): + print("Сервер запущен на ws://localhost:8765") + await asyncio.Future() # Бесконечное ожидание + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/styles.css" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/styles.css" new file mode 100644 index 000000000..a3096fdf0 --- /dev/null +++ "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/PROD/Task_4/styles.css" @@ -0,0 +1,147 @@ +/* styles.css */ +:root { + --primary-color: #4285f4; + --secondary-color: #34a853; + --error-color: #ea4335; + --background-color: #f5f5f5; + --message-bg: #ffffff; + --user-message-bg: #e3f2fd; + --system-message-bg: #f1f1f1; + --text-color: #333333; + --border-color: #e0e0e0; + } + + body { + font-family: 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; + background-color: var(--background-color); + color: var(--text-color); + margin: 0; + padding: 20px; + display: flex; + justify-content: center; + min-height: 100vh; + } + + .container { + width: 100%; + max-width: 800px; + background-color: white; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + overflow: hidden; + display: flex; + flex-direction: column; + height: 80vh; + } + + h2 { + background-color: var(--primary-color); + color: white; + margin: 0; + padding: 15px 20px; + font-size: 1.5rem; + } + + #chat { + flex: 1; + padding: 20px; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 12px; + } + + .message { + max-width: 70%; + padding: 10px 15px; + border-radius: 18px; + line-height: 1.4; + word-break: break-word; + animation: fadeIn 0.3s ease; + } + + .user-message { + align-self: flex-end; + background-color: var(--user-message-bg); + border-bottom-right-radius: 4px; + } + + .other-message { + align-self: flex-start; + background-color: var(--message-bg); + border: 1px solid var(--border-color); + border-bottom-left-radius: 4px; + } + + .system-message { + align-self: center; + background-color: var(--system-message-bg); + border-radius: 8px; + font-size: 0.9rem; + color: #666; + text-align: center; + padding: 8px 12px; + } + + .message-input-container { + display: flex; + padding: 15px; + border-top: 1px solid var(--border-color); + background-color: #f9f9f9; + } + + #msg { + flex: 1; + padding: 12px 15px; + border: 1px solid var(--border-color); + border-radius: 24px; + outline: none; + font-size: 1rem; + transition: border 0.3s; + } + + #msg:focus { + border-color: var(--primary-color); + } + + button { + margin-left: 10px; + padding: 12px 20px; + background-color: var(--primary-color); + color: white; + border: none; + border-radius: 24px; + cursor: pointer; + font-weight: 500; + transition: background-color 0.3s; + } + + button:hover { + background-color: #3367d6; + } + + /* Анимации */ + @keyframes fadeIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } + } + + /* Адаптивность */ + @media (max-width: 600px) { + .container { + height: 100vh; + border-radius: 0; + } + + .message { + max-width: 85%; + } + + .message-input-container { + padding: 10px; + } + + #msg, button { + padding: 10px 15px; + } + } \ No newline at end of file diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\233\320\2406_\320\242\320\265\321\200\320\265\320\261\320\276\320\262\320\234\320\260\320\272\321\201\320\270\320\274_WEB.docx" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\233\320\2406_\320\242\320\265\321\200\320\265\320\261\320\276\320\262\320\234\320\260\320\272\321\201\320\270\320\274_WEB.docx" new file mode 100644 index 000000000..6d585f2c7 Binary files /dev/null and "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\233\320\2406_\320\242\320\265\321\200\320\265\320\261\320\276\320\262\320\234\320\260\320\272\321\201\320\270\320\274_WEB.docx" differ diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\233\320\260\320\261\320\276\321\200\320\260\321\202\320\276\321\200\320\275\320\260\321\217_\321\200\320\260\320\261\320\276\321\202\320\260_6_\320\241\320\276\320\272\320\265\321\202\321\213 (1).docx" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\233\320\260\320\261\320\276\321\200\320\260\321\202\320\276\321\200\320\275\320\260\321\217_\321\200\320\260\320\261\320\276\321\202\320\260_6_\320\241\320\276\320\272\320\265\321\202\321\213 (1).docx" new file mode 100644 index 000000000..2694a2339 Binary files /dev/null and "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\233\320\260\320\261\320\276\321\200\320\260\321\202\320\276\321\200\320\275\320\260\321\217_\321\200\320\260\320\261\320\276\321\202\320\260_6_\320\241\320\276\320\272\320\265\321\202\321\213 (1).docx" differ diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\2176.pdf" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\2176.pdf" new file mode 100644 index 000000000..fead8ceb5 Binary files /dev/null and "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/source/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\2176.pdf" differ diff --git "a/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/\320\233\320\2406_\320\242\320\265\321\200\320\265\320\261\320\276\320\262\320\234\320\260\320\272\321\201\320\270\320\274_WEB.pdf" "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/\320\233\320\2406_\320\242\320\265\321\200\320\265\320\261\320\276\320\262\320\234\320\260\320\272\321\201\320\270\320\274_WEB.pdf" new file mode 100644 index 000000000..72e72515b Binary files /dev/null and "b/works/K3322/\320\242\320\265\321\200\320\265\320\261\320\276\320\262 \320\234\320\260\320\272\321\201\320\270\320\274 \320\220\320\275\320\264\321\200\320\265\320\265\320\262\320\270\321\207/Lab_6/\320\233\320\2406_\320\242\320\265\321\200\320\265\320\261\320\276\320\262\320\234\320\260\320\272\321\201\320\270\320\274_WEB.pdf" differ