Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
34 changes: 34 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part1/client.py
Original file line number Diff line number Diff line change
@@ -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()
83 changes: 83 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part1/server.py
Original file line number Diff line number Diff line change
@@ -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.")
Binary file not shown.
16 changes: 16 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part2/client.py
Original file line number Diff line number Diff line change
@@ -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()
38 changes: 38 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part2/server.py
Original file line number Diff line number Diff line change
@@ -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()
Binary file not shown.
24 changes: 24 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part3/client.py
Original file line number Diff line number Diff line change
@@ -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()
11 changes: 11 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part3/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Привет от сервера</title>
</head>
<body>
<h1>Добро пожаловать!</h1>
<p>Это HTML-страница, полученная от Python-сервера.</p>
</body>
</html>
50 changes: 50 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part3/server.py
Original file line number Diff line number Diff line change
@@ -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 "<h1>404 Not Found</h1>", 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()
Binary file not shown.
47 changes: 47 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part4/client.py
Original file line number Diff line number Diff line change
@@ -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()
51 changes: 51 additions & 0 deletions works/K3320/Гусев_Ярослав/6/part4/server.py
Original file line number Diff line number Diff line change
@@ -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()
Binary file not shown.