Индивидуальные задания на работу
2.5.1. Общее задание для всех студентов. Проверить наличие библиотеки WSOCK32.DLL и зарегистрировать приложение в библиотеке, определить описание реализации интерфейса Windows Socket и его текущее состояние. 2.5.2. Индивидуальное задание для каждого студента. Подготовить приложение к созданию четырех сокетов - двух датаграммных сокетов и двух сокетов виртуального канала, с максимальным размером датаграммного пакета, равным числу из последних трех цифр номера зачетной книжки студента. Формат адреса соответствует принятому в Internet. 2.5.3. Индивидуальное задание для каждого студента. Задать параметры сокетов, подготовив структуры типа sockaddr. Предусмотреть возможность работы: в широковещательном режиме для первого сокета; с определенными IP-адресами для второго и третьего сокетов, равными соответственно «192.168.ZZZ.1ХХ» и «192.168.ZZZ.1ХХ+1», где ZZZ – номер подсети, указанный преподавателем, ХХ – последние две цифры номера зачетной книжки студента; с любым адресом для четвертого сокета. 2.5.4. Индивидуальное задание для каждого студента. В файле HOSTS определить четыре доменных имени для собственной рабочей станции и другой рабочей станции с номером, равным «№-1», где «№» - номер собственной рабочей станции (при «№-1», равном нулю, номер другой станции принимается равным «8»). В состав доменных имен ввести собственные инициалы. Имена связать с локальными датаграммным и виртуальным адресами «192.168.ZZZ.1ХХ» и «192.168.ZZZ.1ХХ+1», а также с удаленными датаграммным и виртуальным адресами «192.168.ZZZ.1ХХ+2» и «192.168.ZZZ.1ХХ+3». Выполнить с помощью функции gethostbyname получение указателей на структуры, характеризующие имена и адреса узлов. 2.5.5. Общее задание для всех студентов. Выполнить привязку всех подготовленных адресов и сокетов. Спровоцировать возврат функцией bind значения SOCKET_ERROR по причине: Код ошибки Описание WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStanup WSAENETDOWN Сбой в сети WSAEADDRINUSE Указанный адрес уже используется WSAEFAULT Значение параметра namelen меньше размера структуры sockaddr WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets WSAEAFNOSUPPORT Этот протокол не может работать с указанным семейством адресов WSAEINVAL Сокет уже привязан к адресу WSAENOBUFS Установлено слишком много соединений WSAENOTSOCK Указанный в параметре дескриптор не является сокетом 2.5.6. Общее задание для всех студентов. Для освобождения ресурсов последовательно закрыть все сокеты и завершить работу приложения с Windows Sockets. 2.5.7. Общее задание для всех студентов. По результатам лабораторной работы подготовить полный протокол, включающий формулировку пунктов задания, краткое описание реализации каждого из пунктов задания с фрагментами кода, выводы по каждому из пунктов задания. Лабораторная работа № 3. COM-объекты средствами MS Visual J++ Создание и использование COM-объектов — задача, встречающаяся довольно часто. Достаточно сказать, что любой современный программный продукт Microsoft есть не что иное как набор подобных объектов, оформленных в виде компонент ActiveX и подключенных к пользовательскому интерфейсу (да простят меня читатели за это вынужденное упрощение!). Инструментов для разработки объектов COM также предостаточно. К примеру, это распространенные у нас компиляторы Microsoft Visual C++ и Borland C++Builder. Но это все для программирующих на языке Cи++. Borland Delphi позволяет писать COM-объекты на Паскале. Не забыты и любители Java. Microsoft Visual J++ дает возможность разработчику не только создавать, но и использовать COM-объекты из классов Java. Cоздание сервера COM Прежде всего воспользуемся вызовом мастера COM DLL, расположенного на закладке New•Components (она появляется при вызове команды File•New Project среды разработчика Visual J++). Для лучшего понимания рассмотрим сквозной пример COM-объекта, один метод которого запускает текстовый процессор Word, а другой завершает текущий сеанс Windows (аналог команды Log off). Сначала мне хотелось делать полный рестарт операционной системы, но, попробовав, я решил, что это слишком расточительно в плане расходования времени.
Рис. 3.1. Итак, создадим проект с именем COM_Object (рис. 1), внутри которого находится пустой класс-заготовка для будущего объекта. Хорошо бы, конечно, заменить его имя чем-то существенным, например CoMirPK. Для этого в окне проекта нужно щелкнуть на файле компоненты правой кнопкой мыши и выбрать команду переименования Rename. Несомненная неудача среды разработчика в том, что при смене имени файла не меняется название класса. Следовательно, это надо сделать самостоятельно. Зато внутри комментариев, которые видны в теле класса, имеется заготовка метода onCOMRegister(). Вы можете раскрыть ее и поместить внутрь код, вызываемый каждый раз при регистрации создаваемой компоненты в системе, и наоборот, при «выковыривании» из нее (рис. 2).
Рис. 3.2. Для каждого из двух методов создадим отдельный интерфейс, чтобы максимально использовать инструментарий среды, а планируемые действия занесем в список TaskList — эдакий электронный планировщик. Сначала создадим первый интерфейс IRunWord2000, исходный текст которого весьма мал:
public interface IRunWord2000 { /** * Этот метод запускает текстовый процессор MS Word 2000 */ public abstract void runWord(String path); }
Следом за ним нужно описать интерфейс ILogOff, также состоящий всего из нескольких строчек:
public interface ILogOff { /** * Данный метод ”выгружает” текущего пользователя */ public abstract void userLogOff(); }
Впрочем, малый размер позволяет описать их вручную. Однако полезно потренироваться, поэтому правой кнопкой мыши щелкаем на имени проекта в окне Project Explorer и из контекстного меню выбираем Add• AddClass•Interface (рис. 3).
Рис. 3.3. Сам же класс компоненты должен реализовать методы этих интерфейсов:
public final class CoMirPK implements IRunWord2000, IlogOff
Когда имена их добавлены в описание класса, в окне Class Outline внутри структуры класса CoMirPK нужно найти папку с названием Implemented Interfaces. Вы увидите два значка интерфейсов, которые наш компонент реализует. Чтобы избежать лишней работы, щелкните на одном из них и выберите из контекстного меню команду Add Method Stubs. Благодаря ей в описании класса появится заготовка метода наследуемого интерфейса. Это и легче, чем ручное написание, и лучше с точки зрения защиты от ошибок. Повторите эти действия и для другого интерфейса. В своей работе мы будем пользоваться вызовом программного интерфейса Win32, поэтому с помощью технологии J/Direct необходимо импортировать точку входа в искомую функцию ExitWindowsEx(). На линейке инструментов имеется специальный список полезных штучек Task List. Запустим из него команду J/Direct Call Builder, найдем в списке ExitWindowsEx() и нажмем кнопку Copy To Target (рис. 4). В проекте появится новый класс-утилита Win32:
Рис 3.4.
public class Win32 { /** * @dll.import(”USER32”,auto) */ public static native boolean ExitWindowsEx(int uFlags, int dwReserved); }
Внутри комментария к методу вы видите специальную директиву @dll.import, заставляющую виртуальную машину Java импортировать вызываемый метод из библиотеки USER32. Остается дописать класс CoMirPK до «кондиционного» вида:
import com.ms.com.*; import java.io.IOException; /** * This class is designed to be packaged with a COM DLL output format. * The class has no standard entry points, other than the constructor. * Public methods will be exposed as methods on the default COM interface. * @com.register (clsid=C0038C80-C7ED-4D8E-9E18-C90AA7EF1C67, typelib=B343C87E-A9B5-43D0-9787-D56D4F962EAF) */ public final class CoMirPK implements IRunWord2000, ILogOff { // TODO: Add additional methods and code here /** * NOTE: To add auto-registration code, refer to the documentation * on the following method * public static void onCOMRegister(boolean unRegister) {} */ public void runWord(String path) { String commandLine = ”c:\\Program Files\\Microsoft Office\\Office\\ WINWORD.EXE”; if(path != null) commandLine = path; try { Runtime.getRuntime().exec(commandLine); }catch (IOException e) { com.ms.wfc.ui.MessageBox.show( ”Не могу запустить Word!”, ”COM_Object”); } } public void userLogOff() { Win32.ExitWindowsEx(0,0); } }
Уникальный идентификатор COM-класса задается директивой @com.register, расположенной непосредственно перед самым описанием класса компоненты. Директива import java.io.IOException нужна для вызова метода getRuntime(). Метод, вызывающий текстовый процессор Word, первоначально задает путь к Word 2000, так как он устанавливается по умолчанию. Тем не менее можно назначить альтернативный маршрут с помощью единственного параметра. При установке Word по умолчанию через этот параметр передается значение null. Дальше специальный класс-утилита Runtime вызовами getRuntime() и exec() запускает программу winword.exe, что и требуется. Метод перезапуска Windows включает в себя единственную строчку, в которой происходит вызов функции API ExitWindowsEx() с нулевыми параметрами, говорящими о том, что нужно лишь завершить текущий сеанс Windows. При другом значении первого параметра может произойти полная перезагрузка. Второй параметр всегда равен 0. Примечание. Перед компиляцией загляните в опции проекта и найдите закладку COM Classes. Там вы сможете указать, какие классы вы хотите сделать объектами COM, а заодно установить некоторые опции создаваемой библиотеке типов (рис. 5).
Рис. 3.5.
Популярное: Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Почему стероиды повышают давление?: Основных причин три... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (567)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |