From 752710a167a6ab362a59c4c385ea279c659d1e1e Mon Sep 17 00:00:00 2001 From: stirelshka8_vivo Date: Fri, 28 Mar 2025 20:30:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CSRSA_client.py => CLIENT/CSRSA_client.py | 25 ++--------------------- CLIENT/config_с.csrsa | 0 CSRSA_server.py => SERVER/CSRSA_server.py | 5 ++++- SERVER/config_s.csrsa | 0 4 files changed, 6 insertions(+), 24 deletions(-) rename CSRSA_client.py => CLIENT/CSRSA_client.py (89%) create mode 100644 CLIENT/config_с.csrsa rename CSRSA_server.py => SERVER/CSRSA_server.py (97%) create mode 100644 SERVER/config_s.csrsa diff --git a/CSRSA_client.py b/CLIENT/CSRSA_client.py similarity index 89% rename from CSRSA_client.py rename to CLIENT/CSRSA_client.py index 7cf096d..0fef983 100644 --- a/CSRSA_client.py +++ b/CLIENT/CSRSA_client.py @@ -12,7 +12,6 @@ import locale class ChatClient: def __init__(self, host='127.0.0.1', port=5555): - # Настройка локализации locale.setlocale(locale.LC_ALL, '') os.environ['LANG'] = 'ru_RU.UTF-8' @@ -28,9 +27,8 @@ class ChatClient: self.input_history = [] self.history_index = -1 self.last_update = time.time() - self.update_interval = 5 # Интервал обновления в секундах + self.update_interval = 5 - # Цветовая схема self.palette = [ ('header', 'white', 'dark blue'), ('chat', 'light gray', 'black'), @@ -64,12 +62,10 @@ class ChatClient: self.chat_content = urwid.SimpleListWalker([]) self.chat_list = urwid.ListBox(self.chat_content) - # Исправленная строка - правильно закрываем скобки Frame chat_frame = urwid.Frame( urwid.AttrMap(self.chat_list, 'chat'), header=urwid.AttrMap(urwid.Text(" ЧАТ "), 'header')) - # Поле ввода self.input_edit = urwid.Edit(caption="Сообщение: ") input_pile = urwid.Pile([ urwid.AttrMap(self.input_edit, 'input'), @@ -126,7 +122,6 @@ class ChatClient: if not msg.strip(): return - # Добавляем в историю self.input_history.append(msg) if len(self.input_history) > 100: self.input_history.pop(0) @@ -151,10 +146,8 @@ class ChatClient: elif msg.startswith('/file'): self.send_file(msg) else: - # Отображаем свое сообщение self.add_message(f"{self.nickname}: {msg}", 'own') - # Отправляем на сервер try: encrypted_msg = rsa.encrypt(msg.encode('utf-8'), self.server_public_key) self.client.send(encrypted_msg) @@ -201,18 +194,14 @@ class ChatClient: def receive(self): try: - # Получаем публичный ключ сервера self.server_public_key = rsa.PublicKey.load_pkcs1(self.client.recv(2048)) - # Отправляем свой публичный ключ self.client.send(self.client_public_key.save_pkcs1()) - # Получаем никнейм self.set_status("Введите ваш никнейм и нажмите Enter") while not self.nickname: time.sleep(0.1) - # Отправляем никнейм на сервер encrypted_nickname = rsa.encrypt(self.nickname.encode('utf-8'), self.server_public_key) self.client.send(encrypted_nickname) self.set_status(f"Подключено как {self.nickname}") @@ -223,7 +212,6 @@ class ChatClient: if not encrypted_msg: break - # Расшифровываем сообщение msg = rsa.decrypt(encrypted_msg, self.client_private_key).decode('utf-8') if msg.startswith('/file_notification'): @@ -287,7 +275,6 @@ class ChatClient: else: self.chat_content.append(urwid.Text(text)) - # Автопрокрутка вниз if len(self.chat_content) > 0: self.chat_list.set_focus(len(self.chat_content) - 1) @@ -297,15 +284,11 @@ class ChatClient: threading.Timer(timeout, lambda: self.set_status("")).start() def update_ui(self, loop=None, user_data=None): - """Функция для обновления интерфейса""" current_time = time.time() if current_time - self.last_update >= self.update_interval: self.last_update = current_time - # Здесь можно добавить любые обновления интерфейса - # Например, обновление времени в статус баре self.loop.draw_screen() - # Планируем следующее обновление self.loop.set_alarm_in(self.update_interval, self.update_ui) def show_help(self): @@ -351,8 +334,7 @@ class ChatClient: self.loop.unhandled_input = exit_help def run(self): - # Получаем никнейм - self.set_status("Введите ваш никнейм и нажмите Enter") + self.set_status("Введите Ваш никнейм и нажмите Enter") def set_nickname(edit, new_edit_text): if new_edit_text.strip(): @@ -361,7 +343,6 @@ class ChatClient: self.loop.unhandled_input = self.handle_input self.set_status(f"Подключено как {self.nickname}") self.input_edit.set_caption("Сообщение: ") - # Запускаем периодическое обновление интерфейса self.loop.set_alarm_in(self.update_interval, self.update_ui) self.input_edit.set_caption("Никнейм: ") @@ -369,11 +350,9 @@ class ChatClient: key == 'enter' and set_nickname(None, self.input_edit.get_edit_text()) ) - # Запускаем поток для получения сообщений receive_thread = threading.Thread(target=self.receive, daemon=True) receive_thread.start() - # Запускаем главный цикл self.loop.run() diff --git a/CLIENT/config_с.csrsa b/CLIENT/config_с.csrsa new file mode 100644 index 0000000..e69de29 diff --git a/CSRSA_server.py b/SERVER/CSRSA_server.py similarity index 97% rename from CSRSA_server.py rename to SERVER/CSRSA_server.py index bc9e80f..9ef4dea 100644 --- a/CSRSA_server.py +++ b/SERVER/CSRSA_server.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + import socket import threading import rsa @@ -136,8 +138,9 @@ class Server: print("\nСервер останавливается...") finally: self.server.close() + print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Сервер остановлен.") if __name__ == "__main__": server = Server() - server.run() \ No newline at end of file + server.run() diff --git a/SERVER/config_s.csrsa b/SERVER/config_s.csrsa new file mode 100644 index 0000000..e69de29