1. Архитектуры клиент-серверных приложений
2. Средства разработки для платформы Android
3. Обзор технологий для создания клиент серверного приложения
4. Структура Android приложения
5. Структура серверного приложения на Java
6. Описание разработки системы
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ВВЕДЕНИЕ
Возможность передачи информации на расстоянии интересовала людей всегда. Для того чтобы обмениваться информацией не только при личной встрече, но и на больших расстояниях, люди изобретали всё новые технические средства, протягивали структурированные кабельные сети по всему миру, организовывали почтовые системы, запускали спутники связи. С развитием информационных технологий стали возможным еще более глобальные коммуникации. Сегодня люди с легкостью по всему миру могут обмениваться не только сообщениями, но и графикой и звуковой и другими видами информации. Историческим «докомпьютерным» предшественником чатов, несомненно, являлся телефон. Ни телеграф, ни почта не могли позволить общаться в реальном времени и не были доступны в домашних условиях. Изобретение и распространение телефона вызвало настоящую революцию способах и средствах общения. Возможность поговорить с собеседником в реальном времени на другом континенте казалась настоящим чудом.
Процесс разработки программного обеспечения – набор правил, согласно которой построена разработка программного обеспечения. Приложение можно назвать клиент серверным если оно включает в себя клиент-серверную архитектуру. Разработку клиент-серверного приложения необходимо начинать с выбора архитектуры клиент-сервера. Архитектура «клиент-сервер» характеризуется наличием по крайне мере двух взаимодействующих, самостоятельных процессов – клиента и сервера. Процессы, осуществляющие некоторую службу, например, службу базы данных или файловой системы, называются серверами, а процессы, запрашивающие службы у серверов посредством посылки запроса и последующего ожидания ответа от сервера, называются клиентами. Фактически эти процессы – программное обеспечение, которое установлено на разных вычислительных машинах и взаимодействующее между собой через вычислительную сеть посредством сетевых протоколов, но они могут быть расположены также и на одной машине (рис.1).
Рис.1 Клиент серверная архитектура
Любая архитектура клиент-сервера должна включать в себя три основных компонента:
- ввод и отображение данных (интерфейс с пользователем);
- прикладные функции, характерные для данной предметной области;
- управление информационными ресурсами (базой даных или файловой системой и т.д).
В классической архитектуре клиент-сервер необходимо распределять три основные части приложения по двум физическим программным обеспечениям.
Многоуровневая архитектура (N-tier или multi-tier, иногда его называют трехуровневая архитектура или трехзвенная архитектура, но это частный случай) представляет собой дальнейшее совершенствование технологии «клиент-сервер». В трехзвенной архитектуре вся обработка данных, ранее входившая в клиентские приложения, или полностью была на сервере, либо эти два звена делили её функции между собой, выделяется в отдельное звено, называемое сервером приложений (рис.2)
Плюсы многоуровневой архитектуры:
- Масштабируемость
- Интегрируемость
- Доступность из веб-браузера или из тонкого клиента
- Высокая безопасность;
Минусы:
- Высокая стоимость, дополнительные расходы на
- администрирование;
- Разработка такой системы гораздо сложнее чем двухзвенной.
Рис.2 Многоуровневая клиент серверная архитектура
На данный момент существует несколько платформ для создания приложений для Android:
- Android Studio [25], основанная на языке Java и Android SDK
- Eclipse [27], поддерживающий язык Java и Android Development Tools
- Xamarin [30], основанная на языке программирования C# и платформе .NET.
Android SDK
Android SDK включает в себя разнообразные библиотеки, документацию и инструменты, которые помогают разрабатывать мобильные приложения для платформы Android.
- API Android SDK – API библиотеки Android, предоставляемые для разработки приложений;
- Документация SDK – включает обширную справочную информацию, детализирующую, что включено в каждый пакет и класс и как это использовать при разработке приложений;
- AVD (Android Virtual Device) – интерактивный эмулятор мобильного устройства Android. Используя эмулятор, можно запускать и тестировать приложения без использования реального Android ycтpoйcтвa;
- Development Tools – SDK включает несколько инструментальных средств для разработки, которые позволяют компилировать и отлаживать создаваемые приложения;
- Sample Code – Android SDK предоставляет типовые приложения, которые демонстрируют некоторые из возможностей Android, и простые программы, которые показывают, как использовать индивидуальные особенности API в коде.
Android Studio
Android Studio – это интегрированная среда разработки (IDE) для работы с платформой Android, анонсированная 16 мая 2013 года на конференции Google I/O. Является официальной средой разработки приложений для платформы Android.
Особенности:
- расширенный редактор макетов: WYSIWYG, способность работать с UI компонентами при помощи Drag-and-Drop, функция предпросмотра макета на нескольких конфигурациях экрана;
- различные виды сборок и генерация нескольких .apk файлов;
- рефакторинг кода;
- статический анализатор кода (Lint), позволяющий находить проблемы производительности, несовместимости версий и другое;
- шаблоны основных макетов и компонентов Android;
- поддержка разработки приложений для Android Wear и Android TV;
- встроенная поддержка Google Cloud Platform, которая включает в себя интеграцию с сервисами Google Cloud Messaging и App Engine.
Eclipse
Eclipse – свободная интегрированная среда разработки кроссплатформенных приложений. Android Development Tools (ADT) – это плагин для Eclipse IDE, позволяющий разрабатывать приложения для платформы Android. Данная среда разработки позволяет создавать настолько же эффективные приложения для Android, но т.к. Android Studio является инструментом, специально созданным для мобильной разработки, то она позволяет проще и быстрее создавать приложения по сравнению с Eclipse.
Xamarin
Xamarin – это фреймворк для кроссплатформенной разработки мобильных приложений с использованием языка C#. Xamarin обладает следующими преимуществами и недостатками:
- позволяет создавать кроссплатформенные мобильные приложения (iOS, Android, Windows Phone);
- не требует знаний стандартных средств реализации Android приложений (основан на C# и платформе .NET);
- платная лицензия;
- неполная поддержка стандартных API платформы;
- относительно низкая производительность.
REST – стиль построения архитектуры распределенного приложения. Данные в REST передаются посредством протокола HTTP в виде сообщений в формате HTML, XML, JSON и др. В основе REST лежат следующие принципы:
- разделение ответственности клиента и сервера;
- информация, содержащаяся в запросе, должна быть достаточной для его обработки и не требовать знаний о предыдущих запросах;
- каждый источник данных (ресурс) обладает уникальным идентификатором, по которому можно получить или изменить состояние ресурса.
Для взаимодействия приложения с сервером используется API на основе REST.
Такая архитектура имеет следующие плюсы:
- поддержка многих форматов данных (HTML, XML, JSON и др.);
- простота создания, относительно SOAP-сервисов;
- независимость от платформы.
WebSocket – протокол полнодуплексной связи (может передавать и принимать одновременно) поверх TCP-соединения, предназначенный для обмена сообщениями между клиентом и веб-сервером в режиме реального времени. WebSocket разработан для создания приложений в web-браузерах и web-серверах, но он может быть использован для любого клиентского или серверного приложения. Протокол WebSocket – это независимый протокол, основанный на протоколе TCP. Для установления соединения WebSocket клиент и сервер используют протокол, похожий на HTTP. Клиент формирует особый HTTP-запрос, на который сервер отвечает определенным образом.
Преимущества WebSocket:
- двустороннее соединение;
- снижение используемого трафика;
- безопасность;
- минимальная задержка передачи данных
- Структура Android приложения
При создании проекта система Android Studio генерирует .gradle файл, который является полным описанием приложения. В этом файле указывается минимальная версия системы, для которой создано приложение, все подключаемые сторонние библиотеки. Так же создается xml файл, который имеет константное имя – AndroidManifest.xml. В этом файле описываются все разрешения, которые необходимы приложению для работы (сеть, звонки, смс, доступ к камере и т.д.). Также в манифест-файле записаны все экраны, используемые приложением, все сервисы (процессы, происходящие вне зависимости от состояния приложения и не влияющие на работу графического интерфейса). Программное приложение для системы Android включает в себя набор активностей (Activity), каждая из которых реализует как минимум один экран приложения. Каждая из таких Activity описывается своим классом на языке Java, причем для этого класса необходимо наследовать класс Activity, расположенный в пакете android.app Android SDK. Весь интерфейс описывается в прикрепленном xml файле. Чтобы установить определенный xml файл к конкретной Activity необходимо передать имя этого файла, используя функцию setContentView(long layoutId) внутри переопределённой функции onCreate(). При подключении файла система автоматически распознает экран мобильного устройства и форматирует контент в соответствии с заданной разметкой. Таким образом, для различных размеров экранов не обязательно создавать разные xml файлы. При запуске приложения система находит Activity в манифест-файле, у которой стоит параметр launcher. В этот момент у Activity начинается жизненный цикл, вызываемый функцией onCreate(). Во время работы жизненный цикл может оказаться в 3 состояниях:
- Экран создан, и находится на переднем плане приложения
- Экран создан, но находится не на переднем плане приложения
- Экран удален
Во время состояния 1 пользователь может взаимодействовать со всем графическим интерфейсом приложения, передавать команды и т.д. Во время состояния 2 пользователь видит экран приложения, на экране могут происходить некоторые изменения, пользователь не может влиять на интерфейс и взаимодействовать с ним. При переходе в состояние 3 все данные, которые хранит приложение на этом экране будут удалены, соответственно перед переходом в это состояние необходимо сохранять все важные данные, которые могут понадобится во время следующего запуска этого экрана. Обычно для хранения используют реляционную базу данных SQLite, которая встроена в систему. Работа с базами данных организована с помощью библиотеки, встроенной в систему. Основные классы для работы с данной библиотекой лежат в пакете android.database.sqlite. Так как в приложениях, реализующих архитектуру клиент-сервер, существует методы для работы с сетью, то возникает вопрос: Возможно ли передавать запросы на сервер, не находясь постоянно на экране какого-либо Activity? Разработчики Android OS решили этот вопрос внедрением класса Service, который может работать вне зависимости от конкретного экрана приложения и его состояние. Это значит, что сервис возможно запустить даже если приложение находится в свернутом состоянии, либо во время перехода с одного экрана на другой. Сервис предоставляет возможность выполнять нетрудоёмкие задачи, которые укладываются в небольшой промежуток времени. То есть, во время работы приложения мы можем передавать данные на сервер, при этом работаю с другими функциями приложения. Такой подход позволяет не задумываться о возможной потере данных при передаче.
Во время создания Java приложения необходимо создать класс, который будет выполняться первым при запуске. Чтобы определить такой класс необходимо определить у него метод public static void main(String[] args), где аргументы этого метода – параметры, переданные из командной строки. Основой для реализации архитектуры клиент-сервер является технология socket, входящая в состав пакета java.net.Socket. Socket – технология, позволяющая уникально задать адрес приложения для компьютера в сети. Уникальность достигается с помощью двух компонентов:
- IP-адрес
- Порт-число
С помощью IP-адреса можно уникально определить каждый компьютер, находящийся в сети. Порт позволяет уникально определить программу, которая будет исполняться на данном компьютере. Сокеты основаны на базе сетевого протокола TCP/IP. Так же они позволяют постоянно поддерживать соединение, тем самым облегчая задачу постоянной проверки с помощью обычных запросов. Для создания сервера необходимо создать экземпляр класса ServerSocket, указав ему в параметрах порт, на котором будет работать приложение. После этого необходимо перейти в ожидание нового подключения, а при создании подключения установить потоки ввода-вывода для обмена запросами между двумя сокетами. Переход в ожидание осуществляется с помощью функции ServerSocket.accept(), которая возвращает сокет, соединяющий сервер с клиентом. После получения сокета создаются потоки вводы-вывода (InputStream и OutputStream соответственно). InputStream используется для получения запросов от клиента с помощью функций readLine(), readInt() и т.д. Далее следует обработка запроса. Чаще всего запросы выглядят как json файл со списком параметров. Использование Json имеет ряд преимуществ таких как:
- Компактность
- Удобность в чтении
- Удобное преобразование в структуру данных
Для создания json файла в java используют библиотеку org.json, в которой располагаются такие классы для работы с json объектами как: JSONObject, JSONArray и т.д. Параметры получают с помощью функций getDouble(String paramName) и т.п. Для создания подключения используют многопоточное программирование в Java, то есть для каждого нового подключения генерируют новый поток, в котором происходит обработка запросов, выполнение операций, составление результатов и отправка ответа. Чтобы создать новый поток необходимо наследовать класс от базового класса Thread и переопределить метод run(), в котором происходят все алгоритмы работы с данными. При закрытии соединения необходимо вызвать функцию socket.close(), которая передает серверу, что необходимо остановить поток обработки запросов и также закрыть соединение со стороны сервера. При неожиданном разрыве соединения на сервере сокет «выбрасывает» ошибку IOException, которую можно обработать блоком try-catch. При перехвате такой ошибки необходимо со стороны сервера закрыть потоки ввода-вывода и закрыть данный сокет. При закрытии серверного сокета необходимо отключить все подключенные к нему клиентские сокеты, после чего вызвать функцию ServerSocket.close() и остановить серверное приложение.
При запуске приложения на мобильном устройстве создается сокет, которые подключается к серверу. Создание подключения происходит асинхронно, то есть система не дожидается подключения, а предоставляет функции ввода данных при отсутствии подключения. При попытке передать данные при недоступном соединении приложение должно выводить сообщение об ошибке подключения. Как было описано выше, все запросы передаются в формате json, который позволяет удобно сериализовать данные. После приема все данные десериализуются с помощью класса JsonObject и запускается процесс подсчета интеграла, используя параметры, полученные в json. К таким параметрам относятся:
- Функция, которую необходимо интегрировать
- Начальная и конечная точка
- Количество участков разбиения
Во время выполнения процесса, пользователь может послать новый запрос, например, для паузы интегрирования. Получив такую команду, сервер передает в поток выполнения вычисления информацию о том, что процесс необходимо приостановить. Выполняя численное интегрирование, на каждой итерации необходимо передавать промежуточный результат. Для этого после каждого прохода цикла поток интегрирования передает в основной поток соединения с клиентом информацию о текущем состоянии вычисления. После этого составляется json файл, в котором в качестве параметра указывается состояние процесса (номер итерации, либо информация о том, что все итерации пройдены), и результат, соответствующий этому состоянию. При выходе из клиентского приложения передается запрос к серверу на завершение сессии, после чего происходит завершение потока, отвечающего за соединение с данным клиентом на сервере.
В соответствии с целью и задачами, сформулированными в выпускной квалификационной работе, было проделано следующее:
- Произведение анализа
- Описание предметной области
- Демонстрация методов разработки клиент-серверного взаимодействия
- Обзор инструментов разработки
Разработанный продукт соответствует всем требованиям технического задания. Произведена апробация и внедрение продукта. Таким образом, можно утверждать, что цели работа реферата были достигнуты, задачи выполнены в полном объеме.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Компоненты сетевого приложения. Клиент-серверное взаимодействие и роли серверов. // Анатольев А.Г., 06.12.2013. URL: http://www.4stud.info/networking/lecture5.html (дата обращения: 11.01.2023).
- Модели взаимодействия клиент-сервер // Антонов Кирилл, Июль 28, 2016. URL: http://zametkinapolyah.ru/servera-i-protokoly/o-modelivzaimodejstviya-klient-server-prostymi-slovami-arxitektura-klientserver-s primerami.html (дата обращения: 11.01.2023).
- Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределенные приложения. 2011г – 464г.
- Герберт Шилдт. » Java 8. Полное руководство 9-е издание» 2015г
- Леон Шкляр, Рич Розен Архитектура веб-приложений – Издательство: Эксмо, 2010, 640с.