Вопрос по сетевому проекту: Задача по написанию чат-сервера с поддержкой TLS в сложной сети минисети, нужен конкретный оPython

Программы на Python
Гость
Вопрос по сетевому проекту: Задача по написанию чат-сервера с поддержкой TLS в сложной сети минисети, нужен конкретный о

Сообщение Гость »


Я работаю над сетевым проектом, общая задача которого состоит в следующем: «Ваша задача — написать чат-сервер с поддержкой TLS в сложной сети минисети». Точнее, поскольку это командный проект, я лично работаю над следующими целями:

-Измените сценарий Python так, чтобы на одном из хостов (h4) работал сервер чата, разработанный вашей командой в задании по программированию (PA) №3, и был включен TLS;

– Измените сценарий Python так, чтобы клиентская программа чата, разработанная вашей командой в PA3, работала на обоих клиентских хостах (h1 и h3) и могла безопасно подключаться к чат-серверу с поддержкой TLS.

Итак, я в значительной степени продвинулся в своем коде; однако после того, как я настроил топологию в окне MobaXTerm, выполнив команду: «sudo python Heritage_network.py», я перехожу к командной строке mininet и пытаюсь открыть окно узла xterm, введя «xterm h4»; однако окно xterm не появляется. Я пробовал это с другими хостами/узлами, но безрезультатно, в xterm не появилось отдельное окно.

Чтобы взглянуть на код, который у меня есть сейчас, чтобы понять, может ли он быть причиной проблемы, вот три кода, с которыми я работаю. Сначала идет код Legacy_network.py, затем коды сервера чата и клиента чата:

legacy_network.py:
из mininet.net импортировать Mininet из mininet.node импортировать контроллер, RemoteController, OVSController из mininet.node импортировать хост, узел из mininet.node импортировать OVSKernelSwitch, UserSwitch из mininet.node импортировать IVSSwitch из mininet.cli импорт CLI из mininet.log импортируйте setLogLevel, информация из mininet.link импортировать TCLink, Intf из вызова импорта подпроцесса импортировать SSL защита myNetwork(): сеть = Mininet( топо=Нет, построить = Ложь, ipBase='10.0.0.0/24') info( '*** Добавление контроллера\n') c0=net.addController(name='c0', контроллер = Контроллер, протокол = 'TCP', порт=6633) info( '*** Добавить переключатели\n') s2 = net.addSwitch('s2', cls=OVSKernelSwitch) s1 = net.addSwitch('s1', cls=OVSKernelSwitch) r5 = net.addHost('r5', cls=Node, ip='0.0.0.0') r5.cmd('sysctl -w net.ipv4.ip_forward=1') r4 = net.addHost('r4', cls=Node, ip='0.0.0.0') r4.cmd('sysctl -w net.ipv4.ip_forward=1') r3 = net.addHost('r3', cls=Node, ip='0.0.0.0') r3.cmd('sysctl -w net.ipv4.ip_forward=1') info( '*** Добавить хосты\n') h1 = net.addHost('h1', cls=Host, ip='10.0.0.1/24', defaultRoute='via 10.0.0.1') h2 = net.addHost('h2', cls=Host, ip='10.0.0.2/24', defaultRoute='via 10.0.0.1') h3 = net.addHost('h1', cls=Host, ip='10.0.0.3/24', defaultRoute='via 10.0.0.1') h4 = net.addHost('h4', cls=Host, ip='10.0.0.4/24', defaultRoute='через 10.0.0.1', server=True) контекст = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain('Чат/server.crt', 'Чат/server.key') h4.cmd('python Chat/PA3_Server_Team1.py --tls --context={}'.format(context)) info( '*** Добавить ссылки\n') net.addLink(h1, s1) net.addLink(h2, s1) net.addLink(h3, s2) net.addLink(h4, s2) net.addLink(s2, r5) net.addLink(s1, r3) net.addLink(r3, r4) net.addLink(r4, r5) info('***Начальная сеть\n') net.build() info('*** Запуск контроллеров\n') для контроллера в net.controllers: контроллер.start() info('*** Стартовые переключатели\n') для переключателя в net.switches: переключатель.start([c0]) info('*** После настройки коммутаторов и хостов\n') Интерфейс командной строки (нетто) сеть.стоп() если __name__ == '__main__': setLogLevel('информация') моя сеть()
Код клиента чата:

#!env python """Чат-клиент для Задания по программированию 3""" # Описание: Это приложение обеспечивает базовое TCP-соединение, при котором сервер взаимодействует с двумя клиентами. # Сервер настроен на обработку определенного количества соединений, в данном сценарии их два. # Сервер ожидает по одному сообщению от каждого из этих клиентов. # После получения сообщений сервер определяет последовательность их поступления. # Затем эта последовательность передается обоим клиентам, после чего сеансы TCP завершаются. # Операторы импорта из контекста многопроцессорного импорта импортировать сокет как s импортировать SSL # Настраиваем ведение журнала журнал импорта журналирование.basicConfig() журнал = logging.getLogger(__name__) log.setLevel(logging.DEBUG) # Устанавливаем глобальные переменные имя_сервера = '10.0.0.4' порт_сервера = 12000 защита основной(): #Создаем сокет client_socket = s.socket(s.AF_INET, s.SOCK_STREAM) пытаться: #Установим имя хоста сервера имя_хоста_сервера = 'локальный хост' #Создаем контекст TLS контекст = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.load_verify_locations('Chat/server.crt')#Загрузить сертификат сервера для проверки context.load_cert_chain('Chat/client.crt', 'Chat/client.key') #Загружаем сертификат клиента и закрытый ключ #Устанавливаем TCP-соединение client_socket.connect((имя_сервера, порт_сервера)) #Обернуть сокет SSL/TLS ssl_socket = context.wrap_socket(client_socket, имя_хоста_сервера=имя_хоста_сервера) кроме исключения как e: # Обработка любых исключений, возникающих во время соединения. журнал.исключение(е) log.error("***Совет:***") # Предоставьте конкретные советы по устранению неполадок на основе возникшего исключения. если isinstance(e, s.gaierror): log.error("\tПроверьте, что имя_сервера и порт_сервера заданы правильно.") elif isinstance(e, ConnectionRefusedError): log.error("\tПроверьте, что сервер работает и адрес правильный") еще: log.error("\tНет конкретных советов, обратитесь к преподавателям и укажите текст ошибки и код.") выход(8) # Получить данные от пользователя user_input = input('Введите предложение в нижнем регистре: ') # Обернуть try-finally, чтобы гарантировать правильное закрытие сокета независимо от ошибок пытаться: # Передача данных через сокет на сервер # Примечание: encode() преобразует строку в UTF-8 для передачи client_socket.send(user_input.encode()) # Читаем ответ от сервера server_response = client_socket.recv(1024) # Декодируем ответ сервера из байтового потока UTF-8 server_response_decoded = server_response.decode() # Распечатать вывод с сервера print('С сервера:') печать (server_response_decoded) окончательно: # Закрываем сокет перед выходом client_socket.close() # Это помогает защитить код от запуска при импорте модуля если __name__ == "__main__": основной() И, наконец, код чат-сервера:

#!env python """Чат-сервер для задания по программированию 3""" # Описание: Эта программа устанавливает TCP-сервер и два TCP-клиента. # Сервер способен обрабатывать одновременные соединения от обоих клиентов, используя многопоточность. # Многопоточность необходима, поскольку к серверу одновременно подключаются несколько клиентов. # Используя потоки, мы позволяем серверу обрабатывать каждое клиентское соединение независимо и одновременно. # Это также помогает определить порядок поступления сообщений от клиентов. импортировать сокет как s время импорта импорт потоков импортировать SSL # Настраиваем ведение журнала журнал импорта журналирование.basicConfig() журнал = logging.getLogger(__name__) log.setLevel(logging.DEBUG) порт_сервера = 12000 #Список для хранения подключенных клиентов и сообщений, полученных от клиентов. клиенты = [] сообщения = [] макс_конн = 2 # Определите функцию, которую будет запускать каждый поток, обрабатывая каждого клиента. защита client_thread (connection_socket, client_label, server_socket): global messages # Доступ к глобальной переменной messages #Создаем контекст TLS контекст = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain('Chat/server.crt', 'Chat/server.key') #Загрузить сертификат и закрытый ключ сервера #Заменяем стандартный сокет на сокет с SSL-оболочкой Connection_socket, адрес = server_socket.accept() ssl_socket = context.wrap_socket(connection_socket, server_side=True) # Читаем данные из нового сокета подключения запрос = Connection_socket.recv(1024) # Декодируем данные из байтового потока UTF-8 query_decoded = query.decode() # Записать информацию о запросе log.info("Получен тест запроса \"" + str(query_decoded) + "\"") # Выполните некоторые серверные операции с данными для генерации ответа время.сон(10) messages.append((client_label, query_decoded)) # Если получены сообщения от обоих клиентов, отправьте ответы. если len(сообщения) == 2: first_msg = сообщения[0] Second_msg = сообщения[1] # Отформатируйте строку ответа. ответ = f'{first_msg[0]}: "{first_msg[1]}", { Second_msg[0]}: "{ Second_msg[1]}"' # Отправьте ответ обоим клиентам. для c в клиентах: пытаться: c.send(response.encode()) кроме ssl.SSLError как e: log.error(f"Ошибка SSL/TLS: {e}") кроме исключения как e: log.error(f"Произошла непредвиденная ошибка: {e}") окончательно: в.закрыть() # Очистка сообщений и списков клиентов после отправки ответов. сообщения.очистить() клиенты.очистить() защита основной(): # Создайте сокет TCP-сервера, используя SOCK_STREAM server_socket = s.socket(s.AF_INET, s.SOCK_STREAM) # Назначьте сокету IP-адрес и номер порта и привяжите его к выбранному порту. server_socket.bind(('10.0.0.4', server_port)) # Настройте, сколько запросов можно одновременно поставить в очередь на сервере server_socket.listen(max_conn) # Зарегистрируйте, что сервер готов принимать соединения. log.info(f"Сервер готов к приему через порт {server_port}") # Окружите его try-finally, чтобы гарантировать, что мы очистим сокет после того, как закончим. пытаться: # Войдите в бесконечный цикл для прослушивания запросов пока правда: # Когда клиент подключается, создайте новый сокет и запишите его адрес Connection_socket, адрес = server_socket.accept() log.info("Подключено к клиенту по адресу " + str(адрес)) # Маркируйте клиенты как «X» или «Y» в зависимости от порядка их подключения. если не клиенты: client_label = 'X' еще: client_label = 'Y' # Добавьте сокет подключенного клиента в список клиентов. клиенты.append(connection_socket) # Запускаем новый поток для обработки подключенного клиента. поток = threading.Thread(target=client_thread, args=(connection_socket, client_label, server_socket)) поток.start() кроме ssl.SSLError как e: log.error(f"Ошибка SSL/TLS: {e}") кроме исключения как e: log.error(f"Произошла непредвиденная ошибка: {e}") окончательно: server_socket.close() если __name__ == "__main__": основной() Не уверен, что причина, по которой мое окно xterm не отображается, связана с моим кодом или какой-то неправильной конфигурацией моей программы MobaXTerm и т. д. Думаю, не помешает обратиться на всякий случай, если это первое. Заранее спасибо.

Вернуться в «Python»