Реферат Баранский И. В
Скачать 466.2 Kb.
|
1.2 Особенности разработки клиент-серверных приложений на языке Java В Java есть несколько способов взаимодействовать с сетью. Пакет IO появился самым первым и долгое время оставался единственным возможным подходом к обеспечению сетевого взаимодействия. Суть его заключается в том, что со стороны сервера и клиента создается сокет (со стороны клиента явно, со стороны сервера – в ответ на запрос соединения со стороны клиента). С каждым сокетом связаны два потока (InputStream и OutputStream): один служит для отправки сообщений, другой – для их приема. При этом все операции с данными потоками являются блокирующими, т.е. исполнение команд прерывается на время выполнения данных операций. Предположим, нам необходимо разработать индексатор сайтов (Web Crowler), являющийся частью поискового робота. Обращение к одному сайту занимает 300 мс. Если нужно проиндексировать 1000 сайтов, то в блокирующем режиме это займет 300 x 1000 мс, т.е. 300 секунд. Путем ускорения работы приложений при использовании IO является многопоточность – задача делится на части, каждая из которых выполняется своим потоком управления. Например, чтобы обойти 1000 сайтов можно разбить их на четыре группы по 250 сайтов и обойти сайты из каждой группы параллельно. Самой популярной моделью взаимодействия является создание отдельного потока на каждое подключение. Таким образом все соединения обслуживаются параллельно и не мешают друг-другу. Недостатком такого подхода является линейный рост числа потоков и объема требуемой памяти при увеличении числа обслуживаемых соединений. Если потоков будет создано очень много (десятки тысяч), то операционная система сервера будет занята переключением контекстов потоков, а на полезную работу времени может не остаться. Для решения проблем с блокирующим вводом-выводом был придуман механизм, основанный на мультиплексировании каналов. Данный механизм появился в Java 1.4.2 и был назван New IO (NIO). Суть механизма в следующем: существует мультиплексор (в терминах Java называемый селектором, java.nio.channels.Selector), который в одном потоке, последовательно, производит опрос каналов (в случае сетевого взаимодействия реализуемых классами java.nio.channels.SocketChannel и java.nio.channels.ServerSocketChannel). В результате каждого опроса селектор возвращает идентификаторы каналов, готовых к выполнению операций ввода-вывода (т.е. канал соединился с удаленной системой и в него теперь можно отправлять запрос или, наоборот, удаленная система что-то записала в канал и из него теперь эти данные можно читать). Такие идентификаторы называются «ключами» (java.nio.channels.SelectionKey). Каждый ключ содержит информацию о том, к выполнению какой операции готов канал. Задача приложения – в цикле обойти все ключи и выполнить соответствующие операции. При использовании данного подхода решение проблемы линейного роста числа потоков при увеличении числа соединений заключается в том, что все подключенные каналы обслуживаются в одном потоке. Однако, за такое решение приходится платить тем, что выполняемые над полученными в результате сетевого взаимодействия данными операции должны быть очень короткими. Любое блокирование обслуживания одного канала сказывается на всех остальных. Если блокировки длительны, то пока поток управления дойдет до последних готовых каналов, установленные ими соединения могут быть уже разорваны по причине бездействия. Решением данной проблемы может быть так называемая отложенная обработка – на основании принятых в одном NIO-потоке данных формируются команды, которые помещаются в неблокируемую очередь, а исполняются отдельным потоком или несколькими потоками, которые в свою очередь не отвлекаются на операции ввода-вывода. Java NIO позволяет управлять несколькими каналами (сетевыми соединениями или файлами) используя минимальное число потоков выполнения. Однако ценой такого подхода является более сложный, чем при использовании блокирующих потоков, парсинг данных. Если разработчику необходимо управлять тысячами открытых соединений одновременно, причем каждое из них передает лишь незначительный объем данных, выбор Java NIO может дать преимущество. Рисунок 5. структура NIO Если приложение имеете меньшее количество соединений, по которым передаются большие объемы данных, то лучшим выбором станет классический дизайн системы ввода/вывода: Рисунок 6. Структура IO Важно понимать, что Java NIO отнюдь не является заменой Java IO. Его стоит рассматривать как усовершенствование – инструмент, позволяющий значительно расширить возможности по организации ввода/вывода. Грамотное использование мощи обоих подходов позволит вам строить хорошие высокопроизводительные системы. Язык Java определяет ряд API, охватывающих главные области безопасности: Криптографические операции (шифрование, цифровые подписи, обзоры сообщения, и т.д.); Генераторы или преобразователи криптографического материала (ключи и параметры алгоритма); Объекты (keystores или сертификаты), которые инкапсулируют криптографические данные и могут использоваться в более высоких уровнях абстракции. JCA (Java Cryptography Architecture) предоставляет API который позволяют разработчикам легко интегрировать механизмы безопасности в свой код программы. JCA в пределах JDK (Java Development Kit) включает два компонента программного обеспечения: Платформа, которая определяет и поддерживает криптографические службы, для который провайдеры предоставляют реализации. Эта платформа включает пакеты такой как java.security, javax.crypto, javax.crypto.spec, и javax.crypto.interfaces. Фактические провайдеры такой как Sun, SunRsaSign, SunJCE, которые содержат фактические криптографические реализации. Другие криптографические коммуникационные библиотеки, доступные в JDK, используют архитектуру провайдера JCA, но описываются в другом месте. Расширение Защищенного сокета Java™ (JSSE) обеспечивает доступ к Уровню защищенных сокетов (SSL) и Безопасность Транспортного уровня (TLS) реализации. Java Универсальные Службы безопасности (JGSS) (через Kerberos) API, и Простой Уровень Аутентификации и Безопасности (SASL) может также использоваться для того, чтобы надежно обмениваться сообщениями между связывающимися приложениями [14]. JCA был разработан вокруг этих принципов: Независимость реализации и функциональная совместимость; Независимость алгоритма и расширяемость. Независимость алгоритма достигается, определяя универсальный высокоуровневый прикладной программный интерфейс (API) что все использование приложений, чтобы получить доступ к типу службы. Независимость реализации достигается при наличии всех реализаций провайдера, соответствуют четко определенным интерфейсам[14]. SecureRandom: используемый, чтобы генерировать случайные или псевдослучайные числа. MessageDigest: используемый, чтобы вычислить обзор сообщения (хеш) указанных данных. Signature: initilialized с ключами, они используются, чтобы подписать данные и проверить цифровые подписи. Cipher: инициализированный с ключами, они используемые для того, чтобы шифровать/дешифровать данные. Есть различные типы алгоритмов: симметричное шифрование больших объемов данных (например, AES, DES, DESede, Blowfish, IDEA), поточное шифрование (например. RC4), асимметричное шифрование (например. RSA), и основанное на пароле шифрование (PBE). Message Authentication Codes (MAC): как MessageDigests, они также генерируют значения хэш-функции, но сначала инициализируются с ключами, чтобы защитить целостность сообщений. KeyFactory: используемый, чтобы преобразовать существующие непрозрачные криптографические ключи типа Key в ключевые спецификации (прозрачные представления базового ключевого материала), и наоборот. SecretKeyFactory: используемый, чтобы преобразовать существующие непрозрачные криптографические ключи типа SecretKey в ключевые спецификации (прозрачные представления базового ключевого материала), и наоборот. SecretKeyFactorys специализируются KeyFactorys, которые создают секретные (симметричные) ключи только. KeyPairGenerator: используемый, чтобы генерировать новую пару открытых и закрытых ключей, подходящих для использования с указанным алгоритмом. KeyGenerator: используемый, чтобы генерировать новые секретные ключи для использования с указанным алгоритмом. KeyAgreement: используемый двумя или больше сторонами, чтобы согласовать и установить определенный ключ, чтобы использовать для определенной криптографической работы. AlgorithmParameters: используемый, чтобы сохранить параметры для определенного алгоритма, включая кодирование параметра и декодирование. AlgorithmParameterGenerator: используемый, чтобы генерировать ряд AlgorithmParameters, подходящего для указанного алгоритма. KeyStore: используемый, чтобы создать и управлять keystore. keystore является базой данных ключей. У закрытых ключей в keystore есть цепочка сертификата, связанная с ними, который аутентифицирует соответствующий открытый ключ. keystore также содержит сертификаты от доверяемых объектов. CertificateFactory: используемый, чтобы создать сертификаты с открытым ключом и Списки аннулированных сертификатов (CRL). CertPathBuilder: используемый, чтобы создать цепочки сертификата (также известный как пути сертификации). CertPathValidator: используемый, чтобы проверить цепочек сертификата. CertStore: используемый, чтобы получить Certificates и CRLs от репозитария. Класс Cipher, который является суперклассом всех классов, имеющих отношение к шифрованию, для создания объекта, реализующего алгоритм шифрования, используется метод getInstance(). Первым параметром задаётся имя алгоритма в виде строки, например, «AES» или «AES/CBC/PKCS5Padding». Поддерживаемые алгоритмы шифрования можно посмотреть в документации «Standard Algorithm Name Documentation» на официальном сайте oralce. Второй параметром указывается провайдер. Криптографические реализации в JDK распределяются через несколько различных провайдеров (Sun, SunJSSE, SunJCE, SunRsaSign) и по историческим причинам и типами предоставленных услуг. Приложения общего назначения не ДОЛЖНЫ запрашивать криптографические службы от определенных провайдеров[14]. Это: Cipher cipher = Cipher.getInstance("...", "SunJCE"); // not recommended Cipher cipher = Cipher.getInstance("..."); // recommended Иначе, приложения связываются к определенным провайдерам, которые, возможно, не доступны на других реализациях Java. Они также не могли бы быть в состоянии использовать в своих интересах доступных оптимизированных провайдеров (например, аппаратные акселераторы через PKCS11 или собственные реализации ОС, такие как MSCAPI Microsoft), у которых есть более высокий привилегированный порядок чем определенный требуемый провайдер. Объектно-ориентированный язык Java содержит в себе развивающейся API передачи данных по всемерной сети, так же придает особое значение безопасности, включая безопасность языка, криптографию, инфраструктуру управления открытыми ключами, аутентификацию, безопасную передачу, и управление доступом. Эти качества очень важны для построения клиент-серверных приложений. 1.3 Техническое задание Общие сведения. 1.1. Название организации-заказчика: УрГПУ ИМИиИТ 1.2. Название продукта разработки (проектирования): «Chat». 1.3. Назначение продукта обеспечивать мгновенную связь двух и нескольких пользователей одновременно посредством передачи небольшого количества информации непосредственно друг другу. 1.4. Плановые сроки начала и окончания работ: Начало работы: 16.01.2017. Окончание работы: 19.02.2017. Область применения продукта. 2.1. Процессы и структуры, в которых предполагается использование продукта разработки: посредством интернета данный чат может соединять двух людей в любой точке мира (где есть интернет). Он может применятся для личной переписки двух людей, и для небольшой группы (предприятие или офис). Количество пользователей определяется техническими характеристиками сервера. 2.2. Характеристика персонала (количество, квалификация, степень готовности): для использования данного продукта требуются минимальные умения работы с ПК. Требования к продукту разработки 3.1. Требования к продукту в целом: продукт должен представлять с собой Java-приложение с пользовательским интерфейсом, написанное для работы с виртуальной машиной Java. 3.1.1. Минимальные аппаратные требования Клиент: Частота процессора: 1 ГГц; Количество ядер: 1; Разрешение экрана (минимальный размер окна): 400x300; Объем оперативной памяти: 128 Мб. Объём графической памяти 128 Мб Соединение с интернетом. Сервер: Частота процессора: 1 ГГц; Количество ядер: 2; Разрешение экрана (минимальный размер окна): 300х400 пикселей; Объем оперативной памяти: 512 Мб (можно и ниже, но кол-во пользователей, которых можно будет подключить к серверу, будет ограниченным). Обьем графической памяти 128 Мб. Соединение с интернетом. 3.2. Указание системного программного обеспечения: Java Runtime Environment 7 или выше; 3.3. Указание программного обеспечения, используемого для реализации: Eclipse; 3.4. Особенности реализации серверной и клиентской частей: данные передающееся от клиента к серверу и обратно – это пакеты, состоящие из номера пакета и шифрованного массива байтов, при получении дешифруются и преобразуются в примитивные типы данных. 3.4.1. Форматы входных и выходных данных: входные данные – ip сервера и nickname, выходные данные – данные различного формата (текстовые и графические) от сервера (других клиентов). 3.4.2. Источники данных и порядок их ввода в систему (программу), порядок вывода, хранения: при запуске сервера в верхней части экрана отображается ip сервера, по нему происходит подключение клиентов. 3.5. Меры защиты информации: информация передающееся от клиента к серверу и наоборот, шифруется симметричным алгоритмом блочного шифрования “AES”, принятого в качестве стандарта шифрования правительством США в 2001г. Требования к пользовательскому интерфейсу 4.1. Общая характеристика пользовательского интерфейса: интуитивно-понятный графический интерфейс. 4.2. Размещение информации на экране, дизайн экрана: за пример дизайна брались чаты на популярных ресурсах vk.com, www.twitch.tv. 4.3. Особенности ввода информации пользователем, представление выходных данных: клиент общается посредством текста и графики (смайлы, картинки). Перечень сопроводительной документации: техническое задание. Глава 2. Разработка клиент-серверного чата на языке Java 2.1 Технология разработки клиент-серверного приложения Под технологией разработки ПО понимают оптимальный способ ведения разработки, который при определенных условиях обеспечит получение конечного продукта с заранее заданными свойствами. ходе исследования был структурирован существующий материал и на его основе создана технология разработки клиент-серверных приложений. Разработка осуществляется по следующему алгоритму: Выбор архитектуры клиент-сервера (техническая часть). В началеразработки необходимо выбрать между двухуровневой и многоуровневой архитектурой. Выбор в данном случае зависит от количества пользователей, которые будут работать в данной системе, стоимости оборудования и дельнейшее обслуживания системы (например, доработка функционала). Подробное описание этих архитектур описаны в первой главе. 2.Выбор языка программирования (программная часть). Клиент-серверможно написать на самых разных языках. У разных языков присутствуют свои особенности в реализации сетевых задач. Ниже приведен список десяти языков программирования по индексу TIOBE (“TIOBE programming community index” – индекс, оценивающий популярность языков программирования, на основе подсчета результатов поисковых запросов [12]. Для формирования индекса используется поиск в нескольких наиболее посещаемых (по данным Alexa) порталах: Google, Blogger, Wikipedia, YouTube, Baidu, Yahoo!, Bing, Amazon. Таблица 3. Рейтинг языков программирования май 2017г
|