ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 26.10.2023
Просмотров: 62
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ГЛАВА I. ОСНОВНЫЕ СВЕДЕНИЯ О ПРЕДПРИЯТИИ ООО «САХ.КОМ»
1.2 Организационная структура ООО «Сах.ком»
1.3 Описание аппаратного и программного обеспечения рабочего места
Мероприятия по технике безопасности и охране труда
4. Технические требования к программе
4.1 Требования к функциональным характеристикам.
4.4 Требования к составу и параметрам технических средств.
4.5 Требования к информационной и программной совместимости.
4.6 Требования к транспортировке и хранению
5. Требования к программной документации
new AuthorizePacket();
AP.read(in);
switch (AP.getSost()) {
case 1: {
Cipher encrypter_RSA = Cipher.getInstance("RSA"); KeyFactory kf = KeyFactory.getInstance("RSA");
encrypter_RSA.init(Cipher.ENCRYPT_MODE,kf.generatePublic(new X509EncodedKeySpec(AP.getKey())));
AP.setKey(encrypter_RSA.doFinal(KeyAES.getEncoded()));
sendPacket(AP,client);
break;
}
case 2:{
name = AP.getName();
if (AP.getCheck().equals("ВсеОк")){
value = name+
MesPacket M = new MesPacket(encrypter_AES.doFinal((""+name + " вошел в чат"+"").getBytes()));
M.readAll();
break;
}
AP.setSost((short)3);
sendPacket(AP,client);
close();
}
default: {
MesPacket M = new
MesPacket(encrypter_AES.doFinal((""+name + "
вышел из чата"+"").getBytes()));
M.readAll();
close();
break;
}
}
break;
}
}
} else
Thread.sleep(10);
}
} catch (Exception e) {
System.err.println("Отключение"+name);
close();
}
}
Подключение к серверу (на клиенте):
private void Start() {
try {
TextChat.getDocument().insertString(TextChat.getDocument().getLengt
h(), "Идет подключение..." + "\n", null);
socket = new Socket(sip, 9322);
//обработка в случае успешного соединения с сервером.
handle();
} catch (Exception e) {
try {
TextChat.getDocument().insertString(TextChat.getDocument().getLengt h(), "Не удалось подключиться к серверу, закройте приложение" + "\n", null);
} catch (BadLocationException e1) { System.exit(0);
}
}
}
public static void sendPacket (AbsPacket P,Socket s){ DataOutputStream out;
try {
out = new DataOutputStream(s.getOutputStream());
out.writeShort(P.GetId()); //считываем id пакета и пишем
P.write(out);
out.flush();
} catch (IOException e) { try {
s.close();
} catch (IOException e1) {
}
System.out.println("Закрытие потока");
}
}
public void close() {
Server.csls.remove(value);
interrupt();
}
}
public void readPacket() { //на клиенте
try {
short id = in.readShort();
switch (id) {
case 1: {
try {
int size = in.readInt();
int lenByte = in.readInt();
byte[] b = new byte[lenByte];
in.read(b);
int sh = 0;
String a = new String (decrypter_AES.doFinal(b)); StringBuffer buf = new StringBuffer(a);
HTMLEditorKit kit = (HTMLEditorKit) TextChat.getEditorKit();
if (size > 0)
for (int i = 0; i < size; i++) {
int C = in.readInt() + sh;
int S = in.readInt();
buf.replace(C - 1, C, "");
System.out.println("buf = " + buf);
sh += 24 + listPathIm[S].length();
}
kit.insertHTML((HTMLDocument)
TextChat.getDocument(), TextChat.getDocument().getLength(),
"[" + formating.format(System.currentTimeMillis()) + "] " + buf, 0, 0, null); panel.updateUI();
} catch (BadLocationException e) {
}
break;
}
case 3: {
AuthorizePacket AP = new AuthorizePacket();
AP.read(in);
if (AP.getSost() == 1) {
Cipher decriptCipher = Cipher.getInstance("RSA"); decriptCipher.init(Cipher.DECRYPT_MODE, kP.getPrivate());
SecretKey Key = new
SecretKeySpec(decriptCipher.doFinal(AP.getKey()), "AES");
encrypter_AES.init(Cipher.ENCRYPT_MODE, Key);
decrypter_AES.init(Cipher.DECRYPT_MODE, Key);
AP.setSost((short) 2);
AP.setName(name);
sendPacket(AP);
} else {
TextChat.getDocument().insertString(TextChat.getDocument().getLengt h(), "Ошибка аутентификации, закройте приложение" + "\n", null);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void handle() { //на клиенте
try {
out = new DataOutputStream(socket.getOutputStream()); in = new DataInputStream(socket.getInputStream());
sendPacket(new AuthorizePacket(kP.getPublic().getEncoded(),(short)1));
while (true) {
if (in.available() > 0)
readPacket();
else
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
System.err.println("Ошибка чтения/передачи");
close();
e.printStackTrace();
}
}
Каждый пакет данных пересылающийся клиентом или сервером присваивается свой id. Это позволяет структурировать разного рода, типа информацию.
Java, строгий язык на котором можно решать в принципе любую задачу, благодаря кроссплатформенности может работать на разных платформах что очень важно для клиентской части.
Алгоритм работы системы программы выглядит следующим образом:
Приложение объединяет в себе два режима:
латинских, русских символов или цифр.
При создании сервера генерируется симметричный ключ алгоритмом AES этим ключом сервер шифрует всю информацию, передаваемую клиентам. Для получения этого ключа клиент при подключении к серверу генерирует у себя парный ключ (публичный и приватный) алгоритмом RSA.
Рис. 5 Главное меню
Рис. 6 Подключение к серверу
Рис. 7 Режим сервера
Разработанное приложение работает везде где можно установить Java Runtime Environment 7 или выше. Имеет хорошую степень защиты информации т.к использует алгоритм AES, принятый в качестве стандарта шифрования правительством США в 2001 году.
2.3.2 Результат тестирования клиент-серверного приложения
Разработанное веб-приложение прошло функциональное тестирова-ние. Функциональное тестирование – это тестирование программного обеспечения с целью проверки соблюдения функциональных требований, то есть способности программного обеспечения в определенных условиях решать за-дачи, поставленные перед ней на этапе проектирования. Результаты тестирования приведены в таблице 2. Проведены необходимые тесты, охватывающие весь функционал разработанного клиент-серверного приложения.
Таблица 2 - Функциональное тестирование
Для реализации апробации было проведено тестирование приложения в компании «Сах.ком». Для выявления ошибок была создана анкета с вопросами, которая заполнялась после тестирования приложения.
Анкета 1.
Результаты тестирования приложения
Развернутый ответ:________________________________
Результаты тестирования показали следующее:
Рис.8. Оценка удобства интерфейса
Рис.9. Оценка работоспособности и устойчивости приложения
Рис. 10 Платформы, на которых протестирована работа приложения
По результатам анкетирования критических багов не обнаружено. Найденные ошибки были исправлены в следующей версии, как пожелания и замечания тестировщиков.
AP.read(in);
switch (AP.getSost()) {
case 1: {
Cipher encrypter_RSA = Cipher.getInstance("RSA"); KeyFactory kf = KeyFactory.getInstance("RSA");
encrypter_RSA.init(Cipher.ENCRYPT_MODE,kf.generatePublic(new X509EncodedKeySpec(AP.getKey())));
AP.setKey(encrypter_RSA.doFinal(KeyAES.getEncoded()));
sendPacket(AP,client);
break;
}
case 2:{
name = AP.getName();
if (AP.getCheck().equals("ВсеОк")){
value = name+
-
IP: "+client.getInetAddress().getLocalHost().getHostAddress().toString(); Server.csls.put(value, client);
MesPacket M = new MesPacket(encrypter_AES.doFinal((""+name + " вошел в чат"+"").getBytes()));
M.readAll();
break;
}
AP.setSost((short)3);
sendPacket(AP,client);
close();
}
default: {
MesPacket M = new
MesPacket(encrypter_AES.doFinal((""+name + "
вышел из чата"+"").getBytes()));
M.readAll();
close();
break;
}
}
break;
}
}
} else
Thread.sleep(10);
}
} catch (Exception e) {
System.err.println("Отключение"+name);
close();
}
}
Подключение к серверу (на клиенте):
private void Start() {
try {
TextChat.getDocument().insertString(TextChat.getDocument().getLengt
h(), "Идет подключение..." + "\n", null);
socket = new Socket(sip, 9322);
//обработка в случае успешного соединения с сервером.
handle();
} catch (Exception e) {
try {
TextChat.getDocument().insertString(TextChat.getDocument().getLengt h(), "Не удалось подключиться к серверу, закройте приложение" + "\n", null);
} catch (BadLocationException e1) { System.exit(0);
}
}
}
public static void sendPacket (AbsPacket P,Socket s){ DataOutputStream out;
try {
out = new DataOutputStream(s.getOutputStream());
out.writeShort(P.GetId()); //считываем id пакета и пишем
P.write(out);
out.flush();
} catch (IOException e) { try {
s.close();
} catch (IOException e1) {
}
System.out.println("Закрытие потока");
}
}
public void close() {
Server.csls.remove(value);
interrupt();
}
}
public void readPacket() { //на клиенте
try {
short id = in.readShort();
switch (id) {
case 1: {
try {
int size = in.readInt();
int lenByte = in.readInt();
byte[] b = new byte[lenByte];
in.read(b);
int sh = 0;
String a = new String (decrypter_AES.doFinal(b)); StringBuffer buf = new StringBuffer(a);
HTMLEditorKit kit = (HTMLEditorKit) TextChat.getEditorKit();
if (size > 0)
for (int i = 0; i < size; i++) {
int C = in.readInt() + sh;
int S = in.readInt();
buf.replace(C - 1, C, "");
System.out.println("buf = " + buf);
sh += 24 + listPathIm[S].length();
}
kit.insertHTML((HTMLDocument)
TextChat.getDocument(), TextChat.getDocument().getLength(),
"[" + formating.format(System.currentTimeMillis()) + "] " + buf, 0, 0, null); panel.updateUI();
} catch (BadLocationException e) {
}
break;
}
case 3: {
AuthorizePacket AP = new AuthorizePacket();
AP.read(in);
if (AP.getSost() == 1) {
Cipher decriptCipher = Cipher.getInstance("RSA"); decriptCipher.init(Cipher.DECRYPT_MODE, kP.getPrivate());
SecretKey Key = new
SecretKeySpec(decriptCipher.doFinal(AP.getKey()), "AES");
encrypter_AES.init(Cipher.ENCRYPT_MODE, Key);
decrypter_AES.init(Cipher.DECRYPT_MODE, Key);
AP.setSost((short) 2);
AP.setName(name);
sendPacket(AP);
} else {
TextChat.getDocument().insertString(TextChat.getDocument().getLengt h(), "Ошибка аутентификации, закройте приложение" + "\n", null);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void handle() { //на клиенте
try {
out = new DataOutputStream(socket.getOutputStream()); in = new DataInputStream(socket.getInputStream());
sendPacket(new AuthorizePacket(kP.getPublic().getEncoded(),(short)1));
while (true) {
if (in.available() > 0)
readPacket();
else
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
System.err.println("Ошибка чтения/передачи");
close();
e.printStackTrace();
}
}
Каждый пакет данных пересылающийся клиентом или сервером присваивается свой id. Это позволяет структурировать разного рода, типа информацию.
Java, строгий язык на котором можно решать в принципе любую задачу, благодаря кроссплатформенности может работать на разных платформах что очень важно для клиентской части.
Алгоритм работы системы программы выглядит следующим образом:
-
Сервер подключается к порту на хосте и ждет соединения с клиентом;
-
Клиент создает сокет и пытается соединить его с портом на хосте;
-
Если создание сокета прошло успешно, то сервер переходит в режим ожидания команд от клиента;
-
Клиент формирует команду и передает ее серверу, переходит в режим ожидания ответа;
-
Сервер принимает команду, выполняет ее и пересылает ответ клиенту;
-
Клиент обрабатывает полученную информацию и выводит её пользователю в удобном виде, для её восприятия.
-
Пока клиент или сервер не разорвет соединение смотреть пункт 4.
Приложение объединяет в себе два режима:
-
Режим сервера: Запускает сервер на порту 9322. Представляет с собой окно со списком подключившихся к нему клиентов. В верхней части окна отображается IP адрес по которому клиенты имеют возможность подключиться;
-
Режим клиента: открывается окно в котором нужно ввести IP сервера и “nickname” который должен состоять от 5 до 15
латинских, русских символов или цифр.
При создании сервера генерируется симметричный ключ алгоритмом AES этим ключом сервер шифрует всю информацию, передаваемую клиентам. Для получения этого ключа клиент при подключении к серверу генерирует у себя парный ключ (публичный и приватный) алгоритмом RSA.
Рис. 5 Главное меню
Рис. 6 Подключение к серверу
Рис. 7 Режим сервера
Разработанное приложение работает везде где можно установить Java Runtime Environment 7 или выше. Имеет хорошую степень защиты информации т.к использует алгоритм AES, принятый в качестве стандарта шифрования правительством США в 2001 году.
2.3.2 Результат тестирования клиент-серверного приложения
Разработанное веб-приложение прошло функциональное тестирова-ние. Функциональное тестирование – это тестирование программного обеспечения с целью проверки соблюдения функциональных требований, то есть способности программного обеспечения в определенных условиях решать за-дачи, поставленные перед ней на этапе проектирования. Результаты тестирования приведены в таблице 2. Проведены необходимые тесты, охватывающие весь функционал разработанного клиент-серверного приложения.
Таблица 2 - Функциональное тестирование
-
№
Название те-
Шаги
Ожидаемый
Тест
п/п
ста
результат
пройден?
1.
Авторизация
1.
Пользователь захо-
Пользователь
Да
дит на страницу авто-
авторизуется,
ризации.
попадает в ин-
2.
Вводит логин и па-
терфейс адми-
роль.
нистратора и
3.
Нажимает кнопку
получает его
«Войти».
права.
2.
Добавление
1.
Администратор за-
Новый админи-
Да
нового
ходит на страницу
стратор создан,
администра-
списка администрато-
администратор
тора
ров.
перенаправля-
2.
Администратор
ется на страницу
нажимает кнопку «До-
редактирования
бавить».
пользователя.
3.
Администратор
вводит новые логин и
пароль и нажимает
кнопку «Сохранить».
3.
Удаление
1. Администратор за-
Выбранные ад-
Да
администра-
ходит на страницу
министраторы
тора
списка администрато-
удалены, адми-
ров.
нистратор пере-
2. Администратор вы-
направляется на
бирает одного или не-
ту же страницу.
скольких пользовате-
лей из списка.
3. Администратор
выбирает «Удалить»,
а затем «Выполнить»
и подтверждает дей-
ствие.
4.
Удаление
1. Администратор за-
Выбранные
Да
сотрудников
ходит на страницу
альбомы со-
просмотра альбомов
трудников и
сотрудников.
связанные с
2. Администратор вы-
ними записи
бирает одного или не-
удалены, адми-
скольких сотрудников
нистратор пе-
из списка.
ренаправляется
3. Администратор
на ту же стра-
выбирает «Удалить»,
ницу.
а затем «Выполнить»
и подтверждает дей-
ствие.
5.
Просмотр дан-
1. Администратор за-
Происходит пе-
Да
ных конкрет-
ходит на страницу
реход на стра-
ного сотруд-
просмотра альбомов
ницу с дан-
ника
сотрудников.
ными сотруд-
2. Администратор
ника. Данные
нажимает на ссылку,
отображаются
ведущую на стра-
корректно и
ницу отслеживания
упорядочено.
сотрудника.
6.
Установка ло-
1. Администратор за-
Клиент скопи-
Да
кального кли-
пускает локальный
рован в папку
ента
клиент с заданными
на компьютере,
параметрами
в реестр добав-
2. Локальный клиент
лена запись для
устанавливается, до-
автозапуска, на
бавляет запись в ре-
сервере создан
естр, создает конфи-
альбом нового
гурационный файл.
сотрудника.
3. Локальный клиент
создает на сервере
новый альбом со-
трудника.
Для реализации апробации было проведено тестирование приложения в компании «Сах.ком». Для выявления ошибок была создана анкета с вопросами, которая заполнялась после тестирования приложения.
Анкета 1.
Результаты тестирования приложения
-
ОС с который вы запускали данное приложение:
-
Windows
-
Linux
-
Mac OS X
-
Другое:_____________
-
Были ошибки во время работы приложения, если да, то какие?
Развернутый ответ:________________________________
-
Удобный интерфейс?
-
Да
-
Нет
-
Оцените приложение по шкале от 1 до 5
-
Пожелания для улучшения дизайна/работы приложения Развернутый ответ:________________________________
Результаты тестирования показали следующее:
-
Ошибки во время работы приложения небыли обнаружены;
-
Интерфейс посчитали удобным 95,5% тестируемых (Рисунок 12);
Рис.8. Оценка удобства интерфейса
-
Средняя оценка приложения составила: 4,59 (Рисунок 13);
Рис.9. Оценка работоспособности и устойчивости приложения
-
Все пожелания были учтены, приложение доработано за несколько дней.
Рис. 10 Платформы, на которых протестирована работа приложения
По результатам анкетирования критических багов не обнаружено. Найденные ошибки были исправлены в следующей версии, как пожелания и замечания тестировщиков.
-
Игра была установлена и работала под разными версиями операционных систем (Рисунок 14);
-
Ошибки во время работы приложения небыли обнаружены;