
- •2.Опорная модель osi
- •2 Обзор программных средств
- •2.1 Аутентификация и авторизация. Система Kerberos
- •2.2 Установка и настройка протоколов сети
- •4 Классификация архитектур информационных приложений
- •2.1. Файл-серверные приложения
- •2.2. Клиент-серверные приложения
- •2.3. Intranet-приложения
- •2.4. Склады данных (DataWarehousing) и системы оперативной аналитической обработки данных
- •2.5. Интегрированные распределенные приложения
- •5 Файл-серверные приложения
- •3.1. Традиционные средства и методологии разработки файл-серверных приложений
- •3.1.1. Системы программирования и библиотеки
- •3.1.2. Средства и методы разработки приложений на основе субд на персональных компьютерах
- •3.2. Новые средства разработки файл-серверных приложений
- •3.2.1. Общая характеристика современных средств
- •3.2.2. Примеры новых подходов
- •3.2.2.1. Пакет ms Access
- •3.2.2.2. Система Visual FoxPro
- •3.2.2.3. Среда программирования ca-Visual Objects
- •3.3. Перенос файл-серверных приложений в среду клиент-сервер
- •3.3.1. Библиотеки доступа к базам данных
- •3.3.2. Протокол odbc и его реализации
- •3.3.3. Укрупнение приложений (Upsigsing)
- •3.4. Рекомендации по использованию инструментальных средств разработки файл-серверных приложений
- •6 Клиент-серверные приложения
- •7 Принципы работы архитектуры клиент-сервер
- •Частично децентрализованные (гибридные) сети
- •Пиринговая файлообменная сеть
- •Пиринговые сети распределённых вычислений
- •Пиринговые финансовые сети
- •Сети клиент/сервер
- •10 Intranet приложения
- •Intranet - корпоративная , но не публичная сеть
- •Intranet - это применение Web-технологии
- •Intranet - это архитектура клиент-сервер
- •Intranet - не панацея от всех бед
- •11 Организация адресации в интернете
- •4. Практическая часть.
- •Основы сокетов
- •Системные вызовы
- •Создание и уничтожение сокетов
- •Вызов connect
- •Отправка данных
- •Серверы
- •Локальные сокеты
- •Пример использования локальных сокетов
- •Internet-Domain сокеты
- •Пары сокетов
- •Основные конструкции языка Java
- •Библиотека классов языка Java
- •Общие сравнительные характеристики:
- •Вызов расширения isapi сервером www
- •Функция GetExtensionVersion
- •Функция HttpExtensionProc
- •Получение данных расширением isapi
- •Функция GetServerVariable
- •Функция ReadClient
- •Посылка данных расширением isapi
- •Функция WriteCilent
- •Функция ServerSupportFunction
- •Способы поиска в Интернете Три способа поиска в Интернете
- •Поисковые серверы
- •Язык запросов поисковой системы
- •Классификация вторжений
- •Физическая безопасность
- •Утилизация старых компьютеров
- •Программный доступ
- •Идентификация пользователей
- •Системные демоны и службы
- •Службы tcp/ip, которые иногда можно отключить
- •Образец политики корпоративной безопасности
Основные конструкции языка Java
Авторы языка Java стремились сделать его внешне похожим на широко распространенный среди программистов язык C++. Поэтому синтаксис языка Java во многом совпадает с синтаксисом C и C++. И действительно в Java сохранена лексика и основные синтаксические конструкции C++. Как и в C++ в Java определены унарные и бинарные арифметические, логические и битовые операции, несколько операций присваивания, тренарная условная операция, явные и неявные операции приведения типов (причем все перечисленные операции имеют такие же обозначения и приоритеты, что и соответствующие операции C/C++). Как и в C++ в Java определены управляющие операторы if, if-else, break, switch, return, while, do-while, for, continue (все перечисленные операторы имеют семантику аналогичную семантике соответствующих операторов C/C++). Как и в C++ в Java определены классы, имеющие закрытую (private), ограниченно доступную (protected) и общедоступную (public) части, классы служат шаблонами для порождения объектов, для классов определено отношение наследования (правда в Java отменено множественное наследование), определены конструкторы и деструкторы, указатель this, абстрактные классы. На первый взгляд может показаться, что Java - просто еще одна версия C++.
Но это впечатление неверное. Язык Java существенно отличается от C++, так как при разработке Java из C++, который был взят за основу, были исключены почти все особенности C++, имеющие корни в языке C, из которого развился C++. В результате Java оказался не очередным диалектом C++, а новым языком, который лучше C++ в основном за счет того, чего в нем нет по сравнению с C++. В отличие от C++ Java позволяет писать надежные, безопасные, простые, удобные и легкие для понимания программы, хотя и более медленные, чем программы, написанные на C++.
Что же было исключено из C++ при разработке Java? Прежде всего были исключены указатели. Указатели или адреса в памяти - наиболее мощное средство написания высокоэффективных программ в окружении C/C++, но это и наиболее опасное средство этих языков. И дело даже не в том, что, как отмечают авторы языка Java, при недостаточно аккуратном обращении с указателями могут возникать трудно устранимые ошибки в C++-программе. Более существенные трудности в работе с указателями выявляются при разработке распределенных программ, когда требуется осуществить удаленный вызов функции (метода), среди параметров которой есть указатели. Еще более существенные трудности связаны с возможностью работы с произвольными адресами памяти через бестиповые указатели, так как это позволяет полностью игнорировать защиту памяти.
В языке Java нет указателей; все объекты программы расположены в куче (heap) и доступны по объектным ссылкам, которые представляют объекты во всех структурах, в которые могут входить объекты в качестве компонентов. Поскольку при работе с кучей программист не может пользоваться взаимным расположением объектов в памяти, это решение означает, что из языка Java исключена "кусочно-линейная" модель памяти системы C/C++, при которой массив - лишь точка (ячейка) памяти, на которую ссылается указатель этого массива; конечно, это решение исключило непосредственный доступ к памяти, но оно усложнило работу с элементами массивов и, естественно, является источником более низкой эффективности Java-программ по сравнению с C++-программами. Необходимо отметить, что объектные ссылки языка Java содержат информацию о классе объектов, на которые они ссылаются, так что объектные ссылки - это не указатели, а дескрипторы объектов. Наличие дескрипторов позволяет JavaVM выполнять проверку совместности типов на фазе интерпретации кода, возбуждая исключение в случае ошибки.
В Java пересмотрена и концепция C/C++ динамического распределения памяти. Исключена функция освобождения динамически выделенной памяти free(), так как работа с ней сочтена сложной и чреватой многими ошибками в программе, возможность которых уменьшает надежность C++-программ. Вместо этого в Java разработана и реализована система автоматического освобождения динамически выделенной памяти (сборщик мусора). Наличие механизма автоматической сборки мусора, естественное для интерпретируемого языка, усложняет разработку оптимизирующих компиляторов для такого языка. Тем не менее как показывает практика использования Java нужда в таких компиляторах имеется (см. ниже).
Стремление упростить Java-программы и сделать их более понятными привело к отказу от файлов-заголовков (h-файлов) и препроцессорной обработки. По мнению авторов Java файлы-заголовки, содержащие прототипы классов и распространяемые отдельно от двоичного кода этих классов, усложняют управление версиями, а механизм поддержки этой возможности в C/C++ помогает злонамеренным пользователям получать доступ к приватным данным объектов. В Java-программах спецификация класса и его реализация всегда содержатся в одном и том же файле. Препроцессор C/C++ с его возможностями условной компиляции дает возможность писать непонятные тексты программ, что, конечно, не очень хорошо. Но отказ от препроцессора привел к невозможности параметризации классов по типам (классам) их членов, что усложняет программирование простых вещей (например, на Java, в отличие от C++, нельзя иметь массив, элементами которого являются объекты произвольного класса). И, конечно, из Java исключен ненавидимый многими программистами-педантами оператор goto, замененный на continue и break с меткой.
Кроме того из Java исключены "дублирующие" понятия и конструкции языка C++, в частности, функции (в Java есть только методы классов), а также структуры (struct) и объединения (union) (в Java для этого используются атрибуты классов).
Необходимо также отметить, что в куче размещаются все данные Java-программы. Это означает, что хотя в Java и определены данные простых типов (byte, short, int, long, char, float, double, boolean) переменные этих типов могут быть лишь атрибутами объектов. Отсюда следует, что если нужно завести переменную, например, целого типа (int), то необходимо завести объект класса Int, который имеет один атрибут типа int и два метода - соответственно чтения значения этого атрибута и записи в него нового значения.
Таким образом, несмотря на внешнее сходство с C++, Java не просто является новым языком программирования, он настолько глубоко отличается от C++, что конвертировать разумным образом C++-программы на язык Java (или наоборот) - очень сложная задача.
Завершая краткий обзор языка Java, рассмотрим его конструкции, которых нет в C++. Это операторыpackage, import, interface и implements.
Оператор package, помещаемый в начале исходного программного файла определяет пакет, т.е. область в пространстве имен классов, в которой определяются имена классов, содержащихся в этом файле; внутри указанной области пространства имен можно выделить подобласти, используя все тот же оператор package; действие оператора package аналогично действию объявления директории на имена файлов. Для обеспечения возможности использования коротких имен классов, помещенных в другие пакеты, используется оператор import. Пакет, определяемый оператором package по существу является структурной частью проектируемой программной системы, в аспекте интерфейса во многом похожей на объект, но имеющей более сложную структуру (он играет роль подсистемы). Если ввести пакеты (подсистемы) в объектно-ориентированные методологии структурного проектирования программных систем (например, в известную методологию OMT [11]), они станут еще более мощным средством поддержки программных проектов.
Оператор interface, позаимствованный разработчиками Java из языка Objective_C (там аналогичное понятие называется протоколом), открывает определение интерфейса. Интерфейс - это набор сигнатур методов без из реализации. Каждый интерфейс может быть реализован одним или несколькими классами, при этом классы, реализующие один и тот же интерфейс, могут быть никак не связаны по иерархии наследования. Класс может реализовывать любое число интерфейсов (список интерфейсов, реализуемых некоторым классом указывается в операторе implements, дополняющим определение соответствующего класса). На множестве интерфейсов тоже определена иерархия по наследованию, но она не имеет отношения к иерархии классов. В языке Java интерфейсы обеспечивают большую часть той функциональности, которая в C++ обычно представляется с помощью механизма множественного наследования.