Разработка простых сетевых приложений использованием SOCKET и «Разработка асинхронных сетевых приложений с использованием SOCKET

advertisement
Министерство науки и высшего образования Российской Федерации
Федеральное Государственное бюджетное образовательное
учреждение высшего образования
«Московский политехнический университет»
Отчёт по лабораторным работам 1 и 2
по предмету «Программная инженерия» на темы
«Разработка простых сетевых приложений использованием
SOCKET и «Разработка асинхронных сетевых приложений с
использованием SOCKET”
Выполнил: Иванов С.П
Проверил: Михайлов С.В
Москва
2018г
Выполнение работы
В ходе выполнения лабораторной работы нам необходимо
использовать два сценария server.py и client.py. для работы серверной и
клиентской части соответственно.
Для следующей работы нам необходимо установить сам python,
сделать это можно с официального сайта. Работа выполнялась на последней
версии python 3.12.0.
Рис.1 сайт python.org
Далее по заданию нам необходимо установить среду Pycharm,
для более простой разработки на языке Python. Короткое описание
среды PyCharm: Кроссплатформенная интегрированная среда
разработки для языка программирования Python, разработанная
компанией JetBrains. Предоставляет пользователю комплекс
средств для написания кода и визуальный отладчик.
После установки среды нам необходимо создать новый
проект.
Рис. 2 создание нового проекта
Это действие нам будет необходимо повторить два раза, поскольку
нам необходимы отдельные проекты для клиента и сервера
Рис. 3 параллельная работа двух проектов
Следующим шагом пишем код соответственно для клиента и сервера и
проверяем работоспособность
Рис. 4 код клиента и сервера
По заданию нам необходимо было изменить порт и запустить клиент и сервер
чтобы проверить возможность соединения. Как показала консоли сервера и
клиента, соединение прошло успешно
Рис. 5 консоли сервера и клиента
Лабораторная работа 2
В следующей работе задача уже ставилась в несколько раз сложнее.
Нам необходимо разработать серверное приложение, позволяющее:
 Принимать и отсылать сообщения клиенту (режим чата);
 Работать в режиме диалога для шифрования / дешифрования
данных, полученных от клиентского приложения. В работе
использовать шифр Виженера;
 серверное приложение должно обрабатывать команды:
/crypt – для шифрования данных, полученных от клиентского
приложения;
/decrypt – для дешифрования данных, полученных от клиентского
приложения;
/end – для выхода из режима шифрования / дешифрования
/close – отключения клиента сервера.
Поскольку в прошлой лабораторной работе отправлялось
лишь одно сообщение, в этом нам необходимо реализовать
постоянный обмен сообщений между клиентом и сервером.
Сделать это можно при помощи цикла while true и метода recv().
Далее следует подробнее разобрать программный код сервера,
поскольку в него вносилось больше всего изменений (От того, что
давалось в примере).
Рис. 6 первая часть кода сервера
Итак, в самом начале мы импортируем пакет socket для
возможности настройки взаимодействия между клиентом и
сервером, настраиваем айпи и порт, по которому будут соединяться
клиент и сервер. Далее создаем сокет, и выполняем привязку хоста
к номеру порта. Далее открываем порт на прием входящих
соединений.
Далее идут переменные, которые впоследствии будут
использоваться в коде.
keyaccess = "" – ключ проверки, который будет вводиться
пользователем для сравнения его с настоящим
key = "" – ключ шифрования
text = "" – переменная, куда помещается текст при шифровании
pas = 0 – переменная регулятор. Ее значение меняется в
зависимости
hello_msg = "Command correct, you can write" – переменная с
заготовленным текстом. Текст отправляется клиенту после
успешного ввода
nhello_msg = “Wrong answer, repeat command” – переменная,
которая выдается клиенту в случае введения неправильного ключа.
Далее следуют функции шифрования и дешифрования Виженера.
Рис. 7 функции шифрования и дешифрования Виженера
Краткое пояснение работы шифра Виженера:
Шифр использует таблицу, известную как «квадрат Виженера»,
чтобы шифровать и дешифровать сообщения. Квадрат Виженера
состоит из строк и столбцов, где каждая ячейка содержит символы
алфавита. Ключом для шифрования является слово (иногда
называемое ключевым словом), которое повторяется до тех пор,
пока его длина не станет равной длине самого сообщения.
Рис. 8 вторая часть кода
Далее мы можем видеть написание приветственных
сообщений при включении сервера, а также начало постоянного
цикла, который и позволяет общаться в режиме диалога.
Далее идет важная часть, а именно поступающие от клиента
команды. Команда /close самая простая, она просто отключает
клиента от сервера.
Далее идет команда /crypt, которая поступает от клиента, а на
сервере предлагается ввести код шифрования. После его введения,
регулятор pas переключается в режим 1, и вся программа начинает
обрабатывать поступаемые от клиента сообщения на шифрование.
Перед этим, отправляя ему сообщение что команда успешно
принята.
Аналогично происходит при запросе /decrypt, только
сообщения начинают дешифроваться, а регулятор pas
переключается во 2 режим.
Рис. 8 третья часть кода
А здесь мы можем видеть остаток кода, а именно что
происходит при команде /end (Выход из режима
шифрования/дешифрования). Если вкратце, регулятор
переключается на 0, сообщение выводится и начинается режим
диалога. Однако, если ввести неправильный ключ шифрования, то
программа предложит отправить команду заново.
При регуляторе на 1, программа активирует функцию
шифрации по Виженеру, а при регуляторе на 2, программа
активирует функцию дешифрации.
В конце идет простая отправка данных во время диалога и
окончание взаимодействия.
Далее приведен код клиентской части и пример работы.
Рис. 9 код клиентской части
Рис. 9 код клиентской части
Рис. 10 пример работы со стороны клиента и сервера
Далее полный код сервера и клиента.
Сервер:
import socket
LOCALHOST = "127.0.0.1"
PORT = 40113
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((LOCALHOST, PORT))
server.listen(1)
keyaccess = ""
key = ""
text = ""
pas = 0
hello_msg = "Command correct, you can write"
nhello_msg = "Wrong answer, repeat comand"
def vigenere_encrypt(text, key):
# Создать таблицу Виженера
alphabet = 'abcdefghijklmnopqrstuvwxyz'
table = []
for i in range(26):
row = alphabet[i:] + alphabet[:i]
table.append(row)
# Привести сообщение и ключевое слово к нижнему регистру
text = text.lower()
key = key.lower()
# Повторить ключевое слово до длины сообщения
key = key * (len(text) // len(key)) + key[:len(text) % len(key)]
# Зашифровать сообщение
encrypted_text = ''
for i in range(len(text)):
if text[i] in alphabet:
row = alphabet.index(key[i])
col = alphabet.index(text[i])
encrypted_text += table[row][col]
else:
encrypted_text += text[i]
return encrypted_text
def vigenere_decrypt(encrypted_text, key):
# Создать таблицу Виженера
alphabet = 'abcdefghijklmnopqrstuvwxyz'
table = []
for i in range(26):
row = alphabet[i:] + alphabet[:i]
table.append(row)
# Привести зашифрованное сообщение и ключевое слово к нижнему
регистру
encrypted_text = encrypted_text.lower()
key = key.lower()
# Повторить ключевое слово до длины зашифрованного сообщения
key = key * (len(encrypted_text) // len(key)) + key[:len(encrypted_text) %
len(key)]
# Расшифровать сообщение
decrypted_text = ''
for i in range(len(encrypted_text)):
if encrypted_text[i] in alphabet:
row = alphabet.index(key[i])
col = table[row].index(encrypted_text[i])
decrypted_text += alphabet[col]
else:
decrypted_text += encrypted_text[i]
return decrypted_text
print("Server started")
print("Waiting for client request..")
clientConnection, clientAddress = server.accept()
print("Connected client:", clientAddress)
while True:
in_data = clientConnection.recv(1024)
msg = in_data.decode()
if msg == '/close':
break
if msg == '/crypt':
key = input("Enter encrypt key: ")
pas = 1
clientConnection.send(bytes(hello_msg, 'UTF-8'))
continue
if msg == '/decrypt':
key = input("Enter encrypt key: ")
pas = 2
clientConnection.send(bytes(hello_msg, 'UTF-8'))
continue
if msg == '/end':
keyaccess = input("Want to end? Enter acces key: ")
if keyaccess == key:
pas = 0
clientConnection.send(bytes(hello_msg, 'UTF-8'))
continue
else:
clientConnection.send(bytes(nhello_msg, 'UTF-8'))
if pas == 1:
encrypted_msg = vigenere_encrypt(msg,key)
print("From Client:", msg)
clientConnection.send(bytes(encrypted_msg, 'UTF-8'))
continue
if pas == 2:
decrypted_msg = vigenere_decrypt(msg, key)
print("From Client:", msg)
clientConnection.send(bytes(decrypted_msg, 'UTF-8'))
continue
print("From Client:", msg)
out_data = input("Enter msg for client: ")
clientConnection.send(bytes(out_data, 'UTF-8'))
print("Client disconnected...")
clientConnection.close()
Клиент:
import socket
SERVER = "127.0.0.1"
PORT = 40113
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((SERVER, PORT))
while True:
out_data = input("Enter the msg to server: ")
client.sendall(bytes(out_data, 'UTF-8'))
in_data = client.recv(1024)
print("From Server:", in_data.decode())
if out_data == '/close':
break
client.close()
Download