Файл: Теоретические основы разработки клиент серверных приложений на языке Java.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 16.05.2023

Просмотров: 1101

Скачиваний: 11

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

private String value;

private Cipher decrypter_AES; private Cipher encrypter_AES; private Cipher encrypter_RSA; private Key KeyAES;

public ClientHandler(Socket client, Key KeyAES) {

this.client = client; this.KeyAES = KeyAES; try {

//создаем фабрики шифрования/расшифровки

//алгоритмов

decrypter_AES = Cipher.getInstance("AES"); encrypter_AES = Cipher.getInstance("AES"); encrypter_RSA = Cipher.getInstance("RSA"); encrypter_AES.init(Cipher.ENCRYPT_MODE, KeyAES); decrypter_AES.init(Cipher.DECRYPT_MODE, KeyAES);

} catch (Exception e) { System.err.println("Ошибка шифрования");

}

}

@Override

public void run() {

try {

DataInputStream in = new DataInputStream(client.getInputStream());

while (true) {

if (in.available() > 0) { //Если в потоке есть данные читаем их.

short id = in.readShort(); //id пакета

switch (id) { // в зависимости он полученного id создаем класс с реализацией чтения и записи данных данного пакета.

case 1: {

MesPacket M;

int size = in.readInt();

int lenByte = in.readInt(); byte[] b = new byte[lenByte]; in.read(b);

String message = new String (decrypter_AES.doFinal(b)); message = name + " : " + message;

if (size > 0) {

int[][] arrSmil = new int[size][2]; for (int i = 0; i < size; i++) {

arrSmil[i][0] = in.readInt()+3+name.length(); arrSmil[i][1] = in.readInt();

}

M = new MesPacket(encrypter_AES.doFinal(message.getBytes()), arrSmil);

} else

M = new MesPacket(encrypter_AES.doFinal(message.getBytes()));

M.readAll();

break;

}

case 3: {

AuthorizePacket AP = 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+ " IP: "+client.getInetAddress().getLocalHost().getHostAddress().toString();

Server.csls.put(value, client);

MesPacket M = new MesPacket(encrypter_AES.doFinal(("<font color=\"#002f55\"><b>"+name + " вошел в чат"+"</b></font>").getBytes()));

M.readAll();

break;

}

AP.setSost((short)3);

sendPacket(AP,client);

close();

}

default: {

MesPacket M = new

MesPacket(encrypter_AES.doFinal(("<font color=\"#002f55\"><b>"+name + " вышел из чата"+"</b></font>").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 {

if (size > 0)

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();

for (int i = 0; i < size; i++) {

int C = in.readInt() + sh;

int S = in.readInt();

buf.replace(C - 1, C, "<img src='file:Smilies/" + listPathIm[S] + "'>"); 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, строгий язык на котором можно решать в принципе любую задачу, благодаря кроссплатформенности может работать на разных платформах что очень важно для клиентской части.

Алгоритм работы системы программы выглядит следующим образом:

1. Сервер подключается к порту на хосте и ждет соединения с клиентом;

2. Клиент создает сокет и пытается соединить его с портом на хосте;

3. Если создание сокета прошло успешно, то сервер переходит в режим ожидания команд от клиента;

4. Клиент формирует команду и передает ее серверу, переходит в режим ожидания ответа;

5. Сервер принимает команду, выполняет ее и пересылает ответ клиенту;

6. Клиент обрабатывает полученную информацию и выводит её пользователю в удобном виде, для её восприятия.

7. Пока клиент или сервер не разорвет соединение смотреть пункт 4. Приложение объединяет в себе два режима:

• Режим сервера: Запускает сервер на порту 9322. Представляет с собой окно со списком подключившихся к нему клиентов. В верхней части окна отображается IP адрес по которому клиенты имеют возможность подключиться;


• Режим клиента: открывается окно в котором нужно ввести IP сервера и “nickname” который должен состоять от 5 до 15 латинских, русских символов или цифр.

При создании сервера генерируется симметричный ключ алгоритмом AES этим ключом сервер шифрует всю информацию, передаваемую клиентам. Для получения этого ключа клиент при подключении к серверу генерирует у себя парный ключ (публичный и приватный) алгоритмом RSA.

Рисунок 8. Главное меню

Рисунок 9. Подключение к серверу

Рисунок 10. Режим клиента

Разработанное приложение работает везде где можно установить Java Runtime Environment 7 или выше. Имеет хорошую степень защиты информации т.к использует алгоритм AES, принятый в качестве стандарта шифрования правительством США в 2001 году.

2.3 Результаты апробации

Для реализации апробации было проведено тестирование приложения в компании «ТехНик». Для выявления ошибок была создана анкета с вопросами, которая заполнялась после тестирования приложения.

Результаты тестирования приложения

  1. ОС с который вы запускали данное приложение:
    1. Windows
    2. Linux
    3. Mac OS X
    4. Другое:
  2. Были ошибки во время работы приложения, если да, то какие? Развернутый ответ:
  3. Удобный интерфейс?
    1. Да
    2. Нет
  4. Оцените приложение по шкале от 1 до 5
  1. Пожелания для улучшения дизайна/работы приложения Развернутый ответ:

Результаты тестирования показали следующее:

  1. Игра была установлена и работала под разными версиями операционных систем (Рисунок 14);
  2. Ошибки во время работы приложения небыли обнаружены;
  3. Интерфейс посчитали удобным 95,5% тестируемых (Рисунок 12);

Рисунок 12. Оценка удобства интерфейса

  1. Средняя оценка приложения составила: 4,59 (Рисунок 13);

Рисунок 13. Оценка работоспособности и устойчивости приложения

5. Все пожелания были учтены, приложение доработано за несколько дней.


Рисунок 14. Платформы, на которых протестирована работа приложения

По результатам анкетирования критических багов не обнаружено. Найденные ошибки были исправлены в следующей версии, как пожелания и замечания тестировщиков.

Заключение

В результате исследования был получен материал, анализ которого позволил заключить, объектно-ориентированный язык программирования является наиболее популярным среди разработчиков.

В ходе исследования:

1. Проанализированы особенности написания клиент серверных приложений на языке Java, такие как:

• Разные способы реализации потоков ввода и вывода информации, её передача посредством компьютерных сетей;

• Защита и алгоритмы шифрования данных.

2. Произведено сравнение различных архитектур клиент-серверных приложений, а именно:

• Рассмотрена модель и принципы построения данных архитектур;

• Выделены три основных компонента которые должна включать в себя каждая архитектура;

• Описаны плюсы и минусы данных архитектур.

3. Рассмотрены разные языки программирования для написания клиент-серверных приложений. После тщательного анализа программной реализации и популярности языков программирования среди программистов был выбран язык Java для создания клиент-серверного приложения.

4. Предложена технология создания клиент-серверных приложений.

5. Разработано клиент-серверное приложение «Chat»;

6. Проведена апробация разработанного клиент-серверного приложения в форме тестирования. Все замечания были учтены и доработаны в последующих версиях.

Библиографический список

1. Владимир Шаньгин, Защита информации в компьютерных системах и сетях, Москва 2012 – 595 c.

2. Вязовик Н., Жилин Е. Программирование на Java. Методическое руководство для преподавателей Текст. / Николай Вязовик ; Евгений Жилин. Москва: Центр Sun технологий МФТИ, 2003 г.

3. Григорьев Ю.А., Плутенко А.Д. Жизненный цикл проектирования распределенных баз данных. Благовещенск: изд-во Амурского гос. ун-та, 1999. – 266 с.

4. Герберт Шилдт. " Java 8. Полное руководство 9-е издание" 2015г

5. Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределенные приложения. 2011г – 464г.