
АВС 3 ЛР Ихсанова
.docx
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Уфимский университет науки и технологий»
Институт информатики, математики и робототехники
Отчёт по лабораторной работе № 3
по дисциплине «Архитектура вычислительных систем»
на тему: «Основы сетевого программирования. Многопоточная обработка сокет соединений»
Выполнил:
студентка группы ПРО-332б Ихсанова Э. А.
Проверил:
преподаватель Юдинцев Б. С.
Уфа – 2024
Цель работы и задачи
Изучить примеры кода с реализацией многопоточного сокет-сервера и клиента (см. файлы в архиве lab3_ПРИМЕР.zip).
Добавить в сокет-сервер следующие функции:
Проверка уникальности имени клиента при подключении (если имя повторяется, то отправить клиенту соответствующее сообщение об ошибке).
Поименная адресация сообщений (если пользователь не найден, то вывод сообщения об ошибке).
Добавить в класс сокет-соединения функцию записи всех сообщений пользователей в общий log-файл.
Запустить сокет-сервер на ВМ (должна быть создана в процессе выполнения лабораторной работы №2). Проверить обмен сообщениями между несколькими клиентскими приложениями через сокет-сервер, приложить скриншоты (демонстрирующие работу добавленных функций) к отчету.
Ход работы
В первую очередь в код программы была добавлена функция проверки уникальности имени пользователя.
def check_username(data_from): if data_from in USERNAME_TO_THREAD: error_msg = json.dumps( {'to': data_from, 'from': 'SERVER', 'text': 'Username already taken. Please choose a different username.'}) return False, error_msg else: return True, None
Так же была добавлена функция для логирования сообщений в файл messages.txt, который хранится в директории программы и может быть открыт любым удобным образом.
def log_message(username, message): with open(LOG_FILE, 'a') as file: file.write(f"{username}: {message}\n")
В последнюю очередь была реализована функция для отправки поименных(личных) сообщений от пользователя к пользователю.
def send_to_user(self, text, username): msg = json.dumps({'to': username, 'from': self.username, 'text': text}) if username in USERNAME_TO_THREAD: USERNAME_TO_THREAD[username].connection.send(msg.encode('utf-8')) else: print(f"User {username} is not online.")
Проверка работоспособности добавленных функций:
Проверка уникальности имени:
Р
исунок
1 – Подключаемся под именем Elina.
Рисунок 2 - Еще раз подключаемся под тем же именем
При попытке войти под уже занятым именем, получаем сообщение Username already taken. После чего идет отключение от сервера.
Отправка личных сообщений:
Рисунок 3 – Личные сообщения
Как можно видеть на изображении, при добавлении в начале сообщения имени пользователя в квадратных скобочках ([elina] …) можно отправлять личные сообщения.
Запись в лог-файл:
В директории программы появился файл messages.txt, содержащий в себе все отправленные сообщения.
Р
исунок
4 – файл messages.txt
в директории программы
Рисунок 5 – Сохраненные сообщения
Вывод:
В ходе лабораторной работы была изучена тема многопоточности и ее реализация на языке python. На многопоточный сервер были добавлены функции проверки уникальности имени пользователя, отправки личных сообщений, а также записи всех сообщений в лог файл.