diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task1/client.py" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task1/client.py" new file mode 100644 index 000000000..8b584c63c --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task1/client.py" @@ -0,0 +1,10 @@ +import socket + +# Установка соединения с сервером +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client: + client.connect(('127.0.0.1', 5000)) + greeting = "Hello, server" + client.send(greeting.encode('utf-8')) + + reply = client.recv(1024).decode('utf-8') + print(f"Ответ от сервера: {reply}") diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task1/server.py" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task1/server.py" new file mode 100644 index 000000000..4799c3445 --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task1/server.py" @@ -0,0 +1,16 @@ +import socket + +# Инициализация TCP-сервера +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server: + server.bind(('127.0.0.1', 5000)) + server.listen() + print("Сервер ожидает подключения...") + + conn, address = server.accept() + with conn: + print(f"Клиент подключён с адреса: {address}") + message = conn.recv(1024).decode('utf-8') + print(f"Сообщение от клиента: {message}") + + response = "Hello, client" + conn.send(response.encode('utf-8')) diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task2/client.py" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task2/client.py" new file mode 100644 index 000000000..50e961972 --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task2/client.py" @@ -0,0 +1,19 @@ +import socket + +# Получаем значения катетов от пользователя +a = input("Введите длину первого катета: ") +b = input("Введите длину второго катета: ") + +message = f"{a} {b}" + +client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +client_socket.connect(('localhost', 5000)) + +# Отправляем сообщение серверу +client_socket.sendall(message.encode()) + +# Получаем ответ от сервера +data = client_socket.recv(1024).decode() +print("Ответ от сервера:", data) + +client_socket.close() diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task2/server.py" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task2/server.py" new file mode 100644 index 000000000..257e41440 --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task2/server.py" @@ -0,0 +1,30 @@ +import socket +import math + +# Функция для вычисления гипотенузы по Теореме Пифагора +def pythagorean_theorem(a, b): + return math.sqrt(a**2 + b**2) + +server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +server_socket.bind(('localhost', 5000)) +server_socket.listen(1) +print("Сервер запущен и ожидает подключение...") + +conn, addr = server_socket.accept() +print(f"Подключился клиент: {addr}") + +data = conn.recv(1024).decode() + +print("Получено от клиента:", data) + +try: + # Преобразуем входные данные в два числа + a, b = map(float, data.split()) + hypotenuse = pythagorean_theorem(a, b) + response = f"Гипотенуза: {hypotenuse}" +except ValueError: + response = "Ошибка: введите два числа через пробел." + +conn.sendall(response.encode()) +conn.close() +server_socket.close() diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task3/index.html" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task3/index.html" new file mode 100644 index 000000000..990e7bea9 --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task3/index.html" @@ -0,0 +1,12 @@ + + + + + HELLO + + + +

HELLO WORLD

+ + + \ No newline at end of file diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task3/server.py" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task3/server.py" new file mode 100644 index 000000000..abb094303 --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task3/server.py" @@ -0,0 +1,33 @@ +import socket + +def build_http_response(): + with open('index.html', 'r', encoding='utf-8') as file: + content = file.read() + + status_line = "HTTP/1.1 200 OK\r\n" + headers = f"Content-Type: text/html; charset=utf-8\r\nContent-Length: {len(content.encode('utf-8'))}\r\n\r\n" + return (status_line + headers + content).encode('utf-8') + +def run_server(): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server: + server.bind(('127.0.0.1', 4000)) + server.listen(1) + print("Веб-сервер запущен по адресу http://127.0.0.1:4000") + + try: + while True: + client, addr = server.accept() + with client: + print(f"Новое подключение от: {addr}") + request_data = client.recv(1024).decode('utf-8') + print("Запрос от клиента:") + print(request_data) + + http_response = build_http_response() + client.sendall(http_response) + + except KeyboardInterrupt: + print("\nОстановка сервера...") + +if __name__ == "__main__": + run_server() diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/chat.kv" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/chat.kv" new file mode 100644 index 000000000..ae3e1b25e --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/chat.kv" @@ -0,0 +1,69 @@ +#:kivy 2.3.0 + +: + size_hint_y: None + height: self.minimum_height + padding: 10 + orientation: 'horizontal' + + canvas.before: + Color: + rgba: 0.2, 0.2, 0.2, 0.8 + RoundedRectangle: + pos: self.pos + size: self.size + radius: [15] + + Label: + id: msg_label + text: '' + markup: True + color: 1, 1, 1, 1 + halign: 'left' + valign: 'middle' + size_hint_x: 1 + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + 20 + padding: 10, 10 + +: + orientation: 'vertical' + + # Панель сообщений + ScrollView: + id: messages_panel + size_hint_y: 0.85 + do_scroll_x: False + do_scroll_y: True + + GridLayout: + id: messages_container + cols: 1 + size_hint_y: None + height: self.minimum_height + spacing: 5 + padding: 5 + + # Нижняя панель ввода сообщения + BoxLayout: + size_hint_y: None + height: 50 + spacing: 5 + padding: 5 + + TextInput: + id: input_field + multiline: False + size_hint_x: 0.8 + background_color: 0.2, 0.2, 0.2, 1 + foreground_color: 1, 1, 1, 1 + padding: 10 + + Button: + text: 'Отправить' + size_hint_x: 0.2 + background_normal: '' + background_color: 0.2, 0.6, 0.2, 1 + color: 1, 1, 1, 1 + on_press: root.send_message(self) diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/client.py" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/client.py" new file mode 100644 index 000000000..90497cdfd --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/client.py" @@ -0,0 +1,81 @@ +import socket +import threading +from kivy.app import App +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.popup import Popup +from kivy.uix.textinput import TextInput +from kivy.uix.button import Button +from kivy.clock import Clock +from kivy.core.window import Window +from kivy.factory import Factory +import random + +class Messenger(BoxLayout): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.sock = None + self.username = "Пользователь" + self.color = self.get_random_color() + Window.size = (400, 600) + Clock.schedule_once(lambda dt: self.show_login_popup()) + + def get_random_color(self): + return '#{:02x}{:02x}{:02x}'.format( + int(random.uniform(0.5, 1.0)*255), + int(random.uniform(0.5, 1.0)*255), + int(random.uniform(0.5, 1.0)*255) + ) + + def show_login_popup(self): + box = BoxLayout(orientation='vertical', spacing=10, padding=10) + input_name = TextInput(hint_text="Ваше имя", multiline=False) + btn = Button(text="Присоединиться", size_hint=(1, 0.3)) + box.add_widget(input_name) + box.add_widget(btn) + + popup = Popup(title="Вход в чат", content=box, size_hint=(0.7, 0.3), auto_dismiss=False) + + def join_chat(_): + self.username = input_name.text.strip() or "Гость" + popup.dismiss() + self.start_socket() + + btn.bind(on_press=join_chat) + popup.open() + + def start_socket(self): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect(('127.0.0.1', 9090)) + self.sock.send(self.username.encode('utf-8')) + threading.Thread(target=self.listen_server, daemon=True).start() + + def listen_server(self): + while True: + try: + msg = self.sock.recv(1024).decode('utf-8') + if msg: + color, sender, text = msg.split(":", 2) + Clock.schedule_once(lambda dt: self.display_message(text, color)) + except: + break + + def send_message(self, _): + if self.sock: + content = self.ids.input_field.text.strip() + if content: + self.display_message(f"[b]{self.username}:[/b] {content}", self.color) + self.sock.send(content.encode('utf-8')) + self.ids.input_field.text = '' + + def display_message(self, message, color): + bubble = Factory.MessageBubble() + bubble.ids.msg_label.text = f"[color={color}]{message}[/color]" + self.ids.messages_container.add_widget(bubble) + self.ids.messages_container.height += bubble.height + +class ChatApp(App): + def build(self): + return Messenger() + +if __name__ == '__main__': + ChatApp().run() diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/server.py" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/server.py" new file mode 100644 index 000000000..3e55cbafb --- /dev/null +++ "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/task4/server.py" @@ -0,0 +1,60 @@ +import socket +import threading +import random + +active_users = {} # conn: (username, color) + +def random_color(): + min_lightness = 0.5 + r = random.uniform(min_lightness, 1.0) + g = random.uniform(min_lightness, 1.0) + b = random.uniform(min_lightness, 1.0) + return '#{:02x}{:02x}{:02x}'.format(int(r*255), int(g*255), int(b*255)) + +def handle_connection(conn, addr): + try: + name = conn.recv(1024).decode('utf-8').strip() + color = random_color() + active_users[conn] = (name, color) + + print(f"{name} присоединился с {addr}") + + notify_all(f"{name} присоединился к чату.", conn, color) + + while True: + data = conn.recv(1024).decode('utf-8') + if not data: + break + notify_all(f"{name}: {data}", conn, color) + + except Exception as err: + print(f"Ошибка с клиентом {addr}: {err}") + finally: + if conn in active_users: + left_user, clr = active_users[conn] + print(f"{left_user} вышел из чата.") + notify_all(f"{left_user} покинул чат.", conn, clr) + del active_users[conn] + conn.close() + +def notify_all(message, sender=None, color="#000000"): + for client in active_users: + if client != sender: + try: + packet = f"{color}:{active_users[client][0]}:{message}" + client.send(packet.encode('utf-8')) + except: + pass + +def run_server(): + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.bind(("127.0.0.1", 9090)) + server.listen() + print("Чат-сервер запущен на порту 9090") + + while True: + conn, addr = server.accept() + threading.Thread(target=handle_connection, args=(conn, addr), daemon=True).start() + +if __name__ == "__main__": + run_server() diff --git "a/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/\320\236\321\202\321\207\320\265\321\202_\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217.odt" "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/\320\236\321\202\321\207\320\265\321\202_\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217.odt" new file mode 100644 index 000000000..5960f4ff5 Binary files /dev/null and "b/works/\320\2323323/\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217/lab6/\320\236\321\202\321\207\320\265\321\202_\320\237\320\265\321\202\321\200\320\276\320\262\320\260_\320\222\320\270\320\272\321\202\320\276\321\200\320\270\321\217.odt" differ