logo
ПОКС

Пары сокетов

Как упоминалось ранее, функция pipe , создает два дескриптора файлов для начала и конца канала. Каналы ограничены, потому что дескрипторы файлов используются только связанными процессами и потому что взаимодействие однонаправлено. Функция socketpair создает два дескриптора файлов для двух сокетов, подключенных на одном компьютере. Эти дескрипторы файлов разрешают двухстороннее взаимодействие двух связанных процессов. Первые три параметра команды - идентичны параметрам команды socket : они определяют домен, стиль подключения и протокол. Последний параметр - массив с двумя целыми числами, в котором хранятся характеристики файлов этих двух сокетов. При использовании команды socketpair , необходимо определить PF_LOCAL как пространство имен.

38 создание канала связи

Если вы собираетесь передавать датаграммные сообщения при помощи протокола негарантированной доставки UDP , канал связи не нужен. Сразу после создания сокетов и их инициализации можно приступать к передаче данных. Но для передачи данных с использованием протокола TCP необходимо создать канал связи.

Сторона сервера

Рассмотрим процедуру создания канала связи со стороны сервера.

Прежде всего вы должны переключить сокет в режим приема для выполнения ожидания соединения с клиентом при помощи функции listen:

int listen(SOCKET sock, int backlog);

Через параметр sock функции необходимо передать дескриптор сокета, который будет использован для создания канала. Параметр backlog задает максимальный размер очереди для ожидания соединения (можно указывать значения от 1 до 5). Очередь содержит запросы на установку соединений для каждой пары значений (адрес IP, порт).

Ниже мы привели список возможных кодов ошибок для функции listen. 

Код ошибки

Описание

WSANOTINITIALISED

Перед использованием функции необходимо вызвать функцию WSAStartup

WSAENETDOWN

Сбой в сети

WSAEADDRINUSE

Указанный адрес уже используется

WSAEINPROGRESS

Выполняется блокирующая функция интерфейсаWindows Sockets

WSAEINVAL

Сокет еще не был привязан к адресу или уже находится в подключенном состоянии

WSAEISCONN

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

WSAEMFILE

Недостаточно дескрипторов файлов

WSAENOBUFS

Нет места для размещения буфера

WSAENOTSOCK

Указанный в параметре дескриптор не является сокетом

WSAEOPNOTSUPP

Функция listen не работает с сокетом указанного типа

Ниже мы привели пример вызов функции listen:

if(listen(srv_socket , 1) == SOCKET_ERROR )

{

closesocket (srv_socket);

MessageBox(NULL, "listen Error", "Error", MB_OK);

return;

}

Далее необходимо выполнить ожидание соединения. Это можно выполнить двумя различными способами.

Первый способ заключается в циклическом вызове функции accept до тех пор, пока не будет установлено соединение. Затем можно будет приступать к обмену данными.

Функция accept имеет следующий прототип:

SOCKET accept (SOCKET sock, struct sockaddr FAR * addr,

int FAR * addrlen);

Через параметр sock необходимо указать дескриптор сокета, который находится в режиме приема для выполнения ожидания.

Параметр addr должен содержать адрес буфера, в который будет записан адрес узла, подключившегося к серверу. Размер этого буфера необходимо указать в переменной типа int, адрес которой передается через параметр addrlen.

Если ожидание соединения в цикле не вызывает у вас особого энтузиазма, можно предложить более удобный способ, основанный на использовании расширения программного интерфейса Windows Socket, предназначенного для выполнения асинхронных операций.

Приведем список возможных кодов ошибок для функции accept. 

Код ошибки

Описание

WSANOTINITIALISED

Перед использованием функции необходимо вызвать функцию WSAStartup

WSAENETDOWN

Сбой в сети

WSAEFAULT

Значение параметра addrlen меньше размера структуры адреса

WSAEINTR

Работа функции была отменена при помощи функции WSACancelBlockingCall

WSAEINPROGRESS

Выполняется блокирующая функция интерфейсаWindows Sockets

WSAEINVAL

Перед вызовом функции accept не была вызывана функция listen

WSAEMFILE

Нет доступных дескрипторов

WSAENOBUFS

Установлено слишком много соединений

WSAENOTSOCK

Указанный в параметре дескриптор не является сокетом

WSAEOPNOTSUPP

Данный тип сокета нельзя использовать при вызове функций, ориентированных на работу с каналом связи

WSAEWOULDBLOCK

Сокет отмечен как неблокирующий и в настоящее время нет каналов связи, которые нужно устанавливать

Вместо того чтобы ожидать соединение, вызывая в цикле функцию accept , ваше приложение может вызвать один раз функцию WSAAsyncSelect , указав ей, что при получении запроса на установку соединения функция окна вашего приложения должна получить сообщение:

#define WSA_ACCEPT (WM_USER + 1)

// При попытке установки соединения главное окно приложения

// получит сообщение WSA_ACCEPT

rc = WSAAsyncSelect (srv_socket , hWnd, WSA_ACCEPT, FD_ACCEPT );

if(rc > 0)

{

closesocket (srv_socket);

MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK);

return;

}

В данном случае ожидание соединения выполняется для сокета srv_socket . Последний параметр функции имеет значение FD_ACCEPT . Это означает, что при попытке создания канала связи функция окна с идентификатором hWnd получит сообщение WSA_ACCEPT, определенное в вашем приложении.

Обработчик этого сообщения может выглядеть, например, следующим образом:

void WndProc_OnWSAAccept(HWND hWnd, UINT msg,

WPARAM wParam, LPARAM lParam)

{

int rc;

// При ошибке отменяем поступление извещений

// в главное окно приложения

if(WSAGETSELECTERROR(lParam) != 0)

{

MessageBox(NULL, "accept Error", "Error", MB_OK);

WSAAsyncSelect (srv_socket , hWnd, 0, 0);

return;

}

// Определяем размер адреса сокета

acc_sin_len = sizeof(acc_sin);

// Разрешаем установку соединения

srv_socket = accept (srv_socket, (LPSOCKADDR )&acc_sin,

(int FAR *)&acc_sin_len);

if(srv_socket == INVALID_SOCKET)

{

MessageBox(NULL, "accept Error, invalid socket ",

"Error", MB_OK);

return;

}

// Если на данном сокете начнется передача данных от

// клиента, в главное окно приложения поступит

// сообщение WSA_NETEVENT.

// Это же сообщение поступит при разрыве соединения

rc = WSAAsyncSelect (srv_socket , hWnd, WSA_NETEVENT,

FD_READ | FD_CLOSE );

if(rc > 0)

{

closesocket (srv_socket);

MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK);

return;

}

}

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

Сторона клиента

Рассмотрим процедуру установки канала связи со стороны клиента, использованную нами в приложении CLIENT, исходные тексты которого будут приведены ниже.

Для установки соединения в приложении используется функция SetConnection:

SOCKADDR _IN dest_sin;

void SetConnection(HWND hWnd)

{

PHOSTENT phe;

// Создаем сокет

srv_socket = socket(AF_INET , SOCK_STREAM, 0);

if(srv_socket == INVALID_SOCKET)

{

MessageBox(NULL, "socket Error", "Error", MB_OK);

return;

}

// Устанавливаем адрес IP и номер порта

dest_sin.sin_family = AF_INET ;

// Определяем адрес узла

phe = gethostbyname ("localhost ");

if(phe == NULL)

{

closesocket (srv_socket);

MessageBox(NULL, "gethostbyname Error", "Error", MB_OK);

return;

}

// Копируем адрес узла

memcpy((char FAR *)&(dest_sin.sin_addr ), phe->h_addr ,

phe->h_length);

// Копируем номер порта

dest_sin.sin_port = htons(SERV_PORT);

// Устанавливаем соединение

if(connect(srv_socket , (PSOCKADDR )&dest_sin,

sizeof(dest_sin)) < 0)

{

closesocket (srv_socket);

MessageBox(NULL, "connect Error", "Error", MB_OK);

return;

}

}

Вначале с помощью функции socket эта функция создает сокет. Затем выполняется заполнение адресной информацией структуры dest_sin.

Обратите внимание, что для получения адреса IP мы воспользовались функцией gethostbyname , указав ей имя узла localhost .

Это имя отображается в файле HOSTS на адрес 127.0.0.1 :

  1. localhost

Адрес 127.0.0.1 является локальным. Вы можете использовать его для тестирования приложений, выполняющих обмен данными при помощи протокола TCP/IP, запуская сервер и клиент на одном и том же компьютере.

После заполнения структуры с адресной информацией функция connect создает канал связи с сервером.

39 передача и прием данных

int info = pvm_send( int tid, int msgtag)

call pvmfsend( tid, msgtag, info)

int info = pvm_mcast( int *tids, int ntask, int msgtag)

call pvmfmcast( ntask, tids, msgtag, info)

Подпрограмма pvm_send() помечает сообщение целочисленным идентификатором msgtag и передает его непосредственно процессу TID.

Подпрограмма pvm_mcast() помечает сообщение целочисленным идентификатором msgtag и широковещательно передает это сообщение всем задачам, указанным в целочисленном массиве tids (исключая себя). Массив tids имеет длину ntask.

int info = pvm_psend( int tid, int msgtag, void *vp,

    int cnt, int type)

call pvmfpsend( tid, msgtag, xp, cnt, type, info)

Подпрограмма pvm_psend() упаковывает и посылает массив данных указанного типа задаче, идентифицированной TID. Предопределенные типы данных на Фортране такие же, как и для pvmfpack(). В языке C аргумент type может иметь любое из следующих значений:

PVM_STR

PVM_FLOAT

PVM_BYTE

PVM_CPLX

PVM_SHORT

PVM_DOUBLE

PVM_INT

PVM_DCPLX

PVM_LONG

PVM_UINT

PVM_USHORT

PVM_ULONG

PVM поддерживает несколько методов приема сообщений в задаче. В PVM нет точного соответствия функций, например, применение pvm_send не обязательно требует примененияpvm_recv. Каждая из следующих подпрограмм может быть вызвана для любого из поступающих сообщений вне зависимости от того, как оно было передано (или передано широковещательно).

int bufid = pvm_recv( int tid, int msgtag)

call pvmfrecv( tid, msgtag, bufid)

Эта подпрограмма блокирующего приема будет ожидать до тех пор, пока от задачи с TID не поступит сообщение с меткой msgtag. Значение -1 в msgtid или TID означает ``все задачи'' (специальный символ). После поступления она помещает сообщение в новый создаваемый активный буфер приема. Предыдущий активный буфер приема очищается, если он не был сохранен вызовом pvm_setrbuf().

int bufid = pvm_nrecv(int tid, int msgtag)

call pvmfnrecv( tid, msgtag, bufid)

Если запрашиваемое сообщение не прибыло, то неблокирующий прием pvm_nrecv() при завершении вернет код, равный 0. Эта подпрограмма может вызываться сколько угодно раз для определенного сообщения - с целью проверки его прибытия - в промежутках выполнения работы программы. Если же возможной в данной ситуации работы не осталось, для того же сообщения можно воспользоваться блокирующим приемом pvm_recv(). Если сообщение с меткой msgtag поступило от задачи с TID, pvm_nrecv() помещает это сообщение в новый активный буфер (который она создает) и возвращает идентификатор данного буфера. Предыдущий активный буфер приема очищается, если он не был сохранен вызовомpvm_setrbuf(). Значение -1 в msgtid или TID означает ``все задачи'' (специальный символ).

int bufid = pvm_probe( int tid, int msgtag)

call pvmfprobe( tid, msgtag, bufid)

Если запрашиваемое сообщение не прибыло, то pvm_probe() возвращает bufid, равный 0. В противном случае она возвращает bufid сообщения, но не ``принимает'' его. Эта подпрограмма может вызываться сколько угодно раз для определенного сообщения - с целью проверки его прибытия - в промежутках выполнения работы. Дополнительно может быть вызвана pvmbufinfo() с возвращенным bufid - для получения информации о сообщении перед его непосредственным приемом.

int bufid = pvm_trecv( int tid, int msgtag,

    struct timeval *tmout)

call pvmftrecv( tid, msgtag, sec, usec, bufid)

PVM также поддерживает версию приема с тайм-аутом. Рассмотрим случай, при котором сообщение не прибывает никогда (из-за ошибки или сбоя): подпрограмма pvm_recv может заблокироваться навечно. Для избежания такой ситуации пользователь может захотеть ``прекратить'' ожидание после истечения фиксированного временного отрезка. Подпрограммаpvm_trecv() предоставляет пользователю возможность указать период тайм-аута. Если этот период очень велик, то pvm_trecv() действует подобно pvm_recv. Если же период тайм-аута установлен в ноль, то pvm_trecv() действует подобно pvm_nrecv. Так, pvm_trecv ``заполняет пробел'' между функциями блокирующего и неблокирующего приема.

Подпрограмма pvm_bufinfo() возвращает msgtag, TID источника и длину в байтах сообщения, идентифицированного с помощью bufid. Она может применяться для установления метки и источника сообщений, которые были приняты с использованием специальных символов.

int info = pvm_bufinfo( int bufid, int *bytes,

    int *msgtag, int *tid)

call pvmfbufinfo( bufid, bytes, msgtag, tid, info)

Подпрограмма pvm_precv() сочетает в себе функции блокирующего приема и распаковки буфера приема. Она не возвращает bufid. Вместо него она возвращает действительные значения TID, msgtag и cnt.

int info = pvm_precv( int tid, int msgtag, void *vp,

    int cnt, int type, int *rtid, int *rtag,

    int *rcnt)

call pvmfprecv( tid, msgtag, xp, cnt, type, rtid, rtag,

    rcnt, info)

Подпрограмма pvm_recvf() модифицирует контекст работы принимающих функций и может быть использована для ``расширения'' PVM. Используемый по умолчанию контекст приема заключается в соответствии источника и тега сообщения. Он может быть модифицирован для любой определяемой пользователем функции сравнения. Подпрограммы, соответствующей pvm_recvf(), с интерфейсом на Фортране - нет.

40 глобальная сеть Internet

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

Соединение сетей обладает громадными возможностями. Интернет предоставляет в распоряжение своих пользователей множество всевозможных ресурсов. Для того чтобы информация передавалась между компьютерами независимо от используемых линий связи, Шипа ЭВМ и программного обеспечения, разработаны специальные протоколы передачи данных. Они работают по Вринципу разбиения данных на блоки определенного размера (пакеты), которые последовательно отсылаются адресату. В Интернете используются два основных протокола: межсетевой протокол IP разделяет передаваемые июнные на отдельные пакеты и снабжает их заголовками и указанием адреса получателя, а протокол управления передачей TCP отвечает за правильную доставку пакета. Так как эти протоколы взаимосвязаны, обычно говорят о протоколе TCP/IP.

Основные ячейки Интернет — локальные вычислительные сети. Это означает, что Интернет не просто устанавливает связь между отдельными компьютерами, а . создает пути соединения для более крупных единиц — групп компьютеров. Если некоторая локальная сеть подключена к Интернету, то каждая рабочая станция этой сети также может подключаться к Интернету. Существуют также компьютеры, самостоятельно подключенные к Интернету. Они называются хост-компьютерами.

Каждый подключенный к сети компьютер имеет свой адрес, по которому его может найти абонент из любой точки света. К адресам станций предъявляются специальные требования. Адрес должен иметь формат, позволяющий вести его обработку автоматически, и должен нести информацию о своем владельце. С этой целью для каждого компьютера устанавливаются два адреса: цифровой IP-адрес и доменный адрес. Первый из них более понятен компьютеру, второй — человеку. Оба эти адреса могут применяться равноправно.

Цифровой адрес имеет длину 32 бита. Он разделяется точками на 4 блока по 8 бит каждый, которые можно записать в виде десятичного числа, не превышающего значение 255. Адрес содержит полную информацию, необходимую для идентификации компьютера. Два блока определяют адрес сети, третий — адрес подсети и четвертый — адрес компьютера внутри заданной сети.

Доменный адрес определяет область, представляющую ряд хост-компьютеров. Этот адрес читается в обратном порядке: вначале указывается имя компьютера, а затем имя сети, в которой он находится. Для упрощения связи абонентов сети все ее адресное пространство разбито на отдельные области — домены. В системе адресов Интернета приняты домены, представленные географическими регионами. Они имеют имя, состоящее из двух букв. Существуют домены, разделенные по тематическим признакам. Такие домены имеют трехбуквенное сокращенное название.

Компьютерное имя включает как минимум два уровня доменов. Уровни отделяются друг от друга точкой. Слева указывается домен верхнего уровня. Все имена, находящиеся слева, — поддомены общего домена. Для адресации отдельных пользователей в сети их регистрационные имена указываются слева от имени компьютера. После имени пользователя ставится знак @. В Интернете могут использоваться не только имена отдельных людей, но и имена групп.

Для обработки пути поиска в доменах имеются специальные серверы имен. Они преобразуют доменное имя в специальный цифровой адрес.

Использование технологий Интернета необязательно реализовывается в рамках всемирной информационной сети. Технологии, применяемые в глобальной сети, пригодны и для создания мощных корпоративных информационных систем и систем обеспечения коллективной работы. Интранет — это корпоративная сеть (возможно, сеть предприятия или офиса), использующая технологии и продукты Интернета для хранения, связи и доступ к информации.

41 стандартные приложения для работы с internet

Ранее были приведены основные компоненты сети InterNet, ниже будут рассмотрены программные приложения, позволяющие работать с Сетью конечным пользователям.

В большинстве случаев пользователь подключается к Сети через теле­фонную линию с помощью специального устройства - модема (сокращение терминов 'модулятор-демодулятор'), при этом скорость обмена данными определяется типом модема и (в большей степени) качеством телефонного канала и обычно составляет 14400 г 57600 бит в секунду (бод), сервер же 'общается' с Сетью через высокоскоростной канал (на рис.3 и 4 в качест­ве примера показан спутниковый, причем скорость обмена в этой части кана­ла на порядки выше). Т.о. именно скорость передачи данных к конкретному компьютеру обычно лимитирует пропускную способность сети (т.н. 'про­блема последней мили').

Повышенную скорость сетевого обмена обеспечивают выделенные ли­нии связи (часто те же жилы телефонного кабеля, специально выделенные для передачи информации по Сети), при этом удается повысить скорость об­мена не менее чем на порядок; технология DSL (Digital Subscrabe Line) под­разумевает использование модулируемых ультразвуковых частот в обычном телефонном канале, обеспечивает скорость обмена до 7,5 Мбит/сек и не ме­шает обычным телефонным переговорам.

Часто соединенные локальной сетью компьютеры одного учреждения подключаются к сети InterNet через выделенную ЭВМ со специализирован­ным ПО, называемую в этом случае proxy-сервером (рис.4). Proxy-сервер (' доверенный компьютер') часто обеспечивает выполнение некоторых вспо­могательных функций (например, ограничение на доступ к Сети определен­ных пользователей ЛВС, функции фильтрации сообщений и др. - т.е. выпол­няет функции брандмауэра).

В состав ОС Windows включены компоненты, поддерживающие связь по протоколу TCP/IP с использованием телефонного (или другого) канала связи, устанавливаемые опционально (по желанию); настройка этого ПО подробно описана, например, в работе .

Одним из наиболее простых распространенных сетевых приложений се­ти InterNet являются программы обеспечения электронной почты (E-Mail). Для того, чтобы послать электронное письмо, необходимо иметь электрон­ный адрес своего корреспондента; узнать его можно при личной встрече, по телефону, из рекламы (в том числе на WEB-страницах). Таким образом, лю­бой пользователь имеет возможность послать (электронное) письмо по из­вестному адресу, но только владелец почтового ящика имеет возможность просматривать и удалять письма (используется парольная система).

Электронные адреса E-Mail выглядят следующим образом

Адрес E-Mail

Назначение

vep@oktava.msk.su

Вычислительный центр МГАПИ

e881@yahoo.com

Почтовый ящик автора методического руководства

info@daidocomp.com

Фирма DaidoSeiko

frolov@glas.apc.org

Личный почтовый ящик

При отправке письма по E-Mail адрес отправителя обычно добавляется автоматически. Большинство электронных писем представляет собой тексто­вые сообщения объемом не более нескольких килобайт, но современные про­граммы допускают включение и двоичных файлов (изображения, программы, документы WinWord и др.). На рис.5 приведена копия экрана дисплея ПЭВМ при работе почтовой программы Microsoft News and Mail.

Сервер

I ■ | Спутниковая линия сязи

Рис.4. Подключение к InterNet через локальную сеть.

Для посылки письма следует ввести с клавиатуры адрес получателя в графе 'Кому' ('To' в английской транскрипции), тему письма в графе 'Тема' ('Subject') и набрать текст послания; дополнительно в графе 'Копия' ('Сс') можно указать адреса посылки копий письма и прикрепить к посланию дво­ичные файлы (для данной программы путем нажатия кнопки с символом ' скрепка' с последующим выбором нужного файла).

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

Среди других популярных почтовых программ можно отметить систему Eudora for Microsoft Windows, Microsoft Exchange и др.

Значительный интерес представляют т.н. электронные конференции (те­леконференции), или сетевые новости. В Сети имеются серверы электрон­ных конференций, которые хранят статьи (в виде текстовых документов), объединенные в группы. Имеющие доступ к такому серверу пользователи могут посылать в выбранные ими группы свои статьи и просматривать и по­лучать статьи, записанные туда другими пользователями. Группы существу­ют по интересам (например, пользователи Borland Delphi, Interbase, Oracle и др.), постоянно появляются новые. Пользователи могут обсуждать проблемы конференции, задавать вопросы и оказывать помощь нуждающимся; боль­шинство конференций транслируется по всей сети InterNet (существуют и локальные конференции); для работы с электронными конференциями поль­зователь обычно должен подписаться на интересующую его конференцию (или группу новостей). Одним из удобных приложений для работы с элек­тронными конференциями является News Express, позволяющее легко выби­рать нужную конференцию, просматривать список статей (с обеспечением сортировки по теме, дате, имени автора или размеру статьи).

Напоминание о встрече

BI

□1*1

Файл Правка

Вид

Сообщение

3ставка

Формат ?

т

ш

а

и

Кому:

kocha@usa.net

т

Копия:

[Щ] < получатели копни сообщения >

Тема:

Напоминание о встрече

Алексей, не забудьте о сегодняшней встрече в 12.00 час в аудитории 347 - Вы обещали передать мне компонент TlrnageNew для DELPHI 3.0.

Баканов Валерий

С уважением littp://pilyer.mgapi.e{lii

Рис.5. Вид экрана ПЭВМ при работе с почтовой программой Microsoft News and Mail.

С помощью программы Telnet (Terminal Access to a remote host) имеется возможность подключения к консоли удаленной ЭВМ (что удобно, например, администратору сети и позволяет управлять работой сервера, не выходя из дома). Сетевое приложение HyperTerminal (фирма Hilgraeve Inc.) позволяет обмениваться файлами с удаленной ЭВМ по телефонной сети.

Возможность ' разговаривать' через InterNet путем набора и считывания с экрана текстовых посланий является уже привычным (и скучным) серви­сом (для 'оживления' беседы программный продукт Microsoft Chat вводит в действие асоциируемых с конкретными пользователями типизированных персонажей, ' разговаривающих' на фоне определенного пейзажа). Популяр­ная система ICQ (звуковое подражание фразе 'I Seek You' - 'Я ищу тебя', компания Mirabilis, Тель-Авив, 1996, бесплатная до 2000 г.) позволяет обме­ниваться персональными сообщениями с конкретным человеком в режиме реального времени ('двухсторонний пейджер', подробнее см. www.icq.com и www.dir.ru/internet/icq/russian/index.htm).

Существует ПО для обеспечения реального разговора через InterNet (т.н. IP-телефония), причем такой разговор обходится существенно дешевле, чем при использовании международного телефона; все чаще Сеть использу­ется для передачи реальных видеоизображений. Большие размеры аувидео-файлов и ограничения полосы частот Сети для передачи реального аудио и видео вызвали появление технологии потоковой (streaming) передачи дан­ных, для передачи голосовых сообщений в последнее время предлагается технология MPLS, позволяющая информа­ционным пакетам 'обходить' перегруженные узлы Сети (тем самым мини­мизируя недопустимые при передаче голосовых сообщений задержки).

Получение файлов из сети InterNet обычно производится с помощью протокола FTP и специализированных приложений, например, FTP-32 Client for Windows (рис.6), соответствующие возможности включены во многие программные оболочки (например, Norton File Manager и Windows Commander).

Адрес целевого FTP-сервера (наряду с некоторыми дополнительными параметрами) вводится в окне, появляющемся сразу после загрузки приложе­ния FTP-32 Client for Windows, при работе с программой пользователь на ле­вой панели видит диски и каталоги собственного компьютера, на правой -удаленного; существуют возможности перемещения по каталогам файловой системы, выделения нужного файла и пересылки выбранного файла (кнопки со стрелками), причем посылка пользовательского файла на FTP-сервер раз­решена лишь привилегированному пользователю (с целью устранения пере­полнения серверного набора дисковых томов ненужными файлами и предот­вращения распространения компьютерных вирусов).

Наиболее мощные программные средства сети InterNet - программы обеспечения работы с серверами Word Wide Web (WWW), эти приложения часто называют броузерами (browser) или навигаторами (navigator).

Серверы WWW хранят информацию в виде гипертекстовых файлов (см. следующий подраздел), броузеры по сети получают (с использованием протокола HTTP) такой файл (соответствующий странице гипертекста или WEB-странице), специальным образом интерпретируют его и, при необхо­димости, отсылают введенную пользователем информацию назад серверу (например, запрос к базе данных); общая схема взаимодействия броузера с сервером WWW приведена на рис.7.

Для просмотра страниц WEB-страниц первоначально были созданы бро­узеры Mosaic (разработка NCSA, National Center for Supercomputing Applications, Illinois University, 1993), Cello (LII, Legal Information Institute, Cornell Law School), Lynx и др., в настоящее время наиболее часто использу­ются Microsoft Internet Explorer, Netscape Internet Navigator, Opera (Opera Software, www.opera.com) для эксплуатации в среде различных операцион­ных систем; ниже будут рассмотрены наиболее распространенные броузеры фирм Netscape Communications Corp. и Microsoft Corp.

На рис.8 приведена копия экрана ПЭВМ во время функционирования приложения Netscape Communicator, на рис.7.9 - приложения Microsoft Internet Explorer (в обеих системах целевой WWW-адрес вводится в строке ввода, расположенной в верхней части окна броузера). Броузер фирмы Netscape Communications Corp. появился исторически первым, однако Microsoft Corp. включила свой броузер в состав ОС собственной разработки (что уже ряд лет служит причиной судебного разбирательства между указан­ными фирмами). Одними из последних нововведений фирмы Microsoft Corp. являются динамический HTML (DHTML, не поддерживаемый броузерами сторонних фирм) и новая компонентная модель разработки для WEB, под на­званием скриплеты (scriplets, понятие составлено из слов 'сценарии' и 'ап-плеты').

Оба приложения снабжены развитой системой навигации и кеширования WEB-страниц, поддерживают протоколы TCP/IP, HTTP, FTP, обеспечивают E-Mail и работу с FTP-серверами, содержат (встроенные) средства шифра-ции, однако только в последних версиях Microsoft Internet Explorer^ появи­лось средство публикации (пересылки с ЭВМ разработчика на WWW-сервер) файлов описания WEB-страниц, также первой фирма Netscape Communications Corp. выпустила средство для создания и редактирования HTML-страниц. Версии броузеров упомянутых фирм можно получить по ад­ресам home.netscape.com и www.microsoft.com/ie соответственно. Пред­ставляющими интерес проектами являются Mozilla (термин является видоиз­мененным в сторону модной 'динозавровской' тематики названием леген­дарного броузера Mozaic, см. mozilla.ru) и BackOffice (backoffice.ru).

При проверке корректности настройки сети и протокола TCP/IP полезны программа PING (тестирование связи с любым InterNet-узлом), PM Ping (то же самое для операционной системы OS/2 Warp), NETSTAT (получение ин­формации о установленных соединениях), ROUTE (работа с таблицей мар­шрутизации), FTP (утилита с командной строкой для загрузки файлов из Се­ти), FTP-PM (то же самое для OS/2 Warp), подробнее о эксплуатации этих приложений см. работу [13].

Виртуальная реальность в InterNet пока является новинкой (вследствие ограничений на объем передаваемой через Сеть информации предлагается хранить библиотеки описаний объектов виртуальной реальности на локаль­ном компьютере, а из Сети получать лишь сценарии действий в виде тексто­вых файлов). При этом используется (интерпретируемый) предложенный в 1995 г. язык VRML (Virtual Reality Modeling Language) - язык моделирования виртуальной реальности; в настоящее время действует стандарт VRML97, практически идентичный языку VRML 2.0; на 2002 г. запланирована сле­дующая версия VRML, получившая название X3D [22]. VRML предлагает способ создания трехмерных виртуальных миров (' аватаров') с возможно­стью 'путешествий' по ним в WEB; объекты VRML включают в себя текст, изображения, аудио, видео и Java-приложения (примеры VRML см. на InterNet-адресах www.webmaster.com/vrml, webspace.sgi.com, vrml.wired.com). Для общения InterNet-пользователей предлагаются поддер­живающие VRML продукты Worlds Chat (фирма Worlds, Inc., www.worlds.net), Prospero's Global Chat (www.prospero.com), Internet Round Table Society's WebChat (www.irsociety.com) и др.

Для просмотра VRML-миров в настоящее время предлагаются несколько (бесплатных) расширений стандартных WEB-броузеров - модуль Live3D и CosmoPlayer (компания Cosmo Software, www.cosmosoftware.com) для бро­узера Nestcape Communicator, WorldView 2.0 (platunim.com) для MS Internet Explorer 5.0; удобным является VRML-клиент Cortona (фирма ParallelGraph-ics, www.paragraph.ru).

Так как описание VRML представляется обычным текстовым файлом (несложные примеры см. на адресе www.srcc.msu.su/vrml), создавать (и ре­дактировать) исходные VRML-тексты можно с помощью простейших тексто­вых редакторов класса NotePad или WordPad; из специализированных редак­торов VRML-кодов можно указать, например, VRMLPad фирмы Parallel-Graphics ыгрузка с узла www.paragraph.ru). Многие программы трехмер­ного моделирования (например, всем известный пакет 3D Studio Max) позво­ляют работать с данными в форме VRML.

43 язык java программирования в сети Internet

Язык Java [1] - это новый объектно-ориентированный язык программирования, созданный фирмой Sun для разработки программ, распространяемых по сети Internet [2]. Система программирования Java позволяет использовать World Wide Web (WWW) для распространения небольших интерактивных прикладных программ (апплетов), которые размещаются на серверах Internet, транспортируются клиенту по сети (точно так же, как картинки или звуковые файлы), автоматически устанавливаются и запускаются на месте, как часть документа WWW. При этом апплет имеет весьма ограниченный доступ к ресурсам компьютера клиента, так что он может предоставить произвольный мультимедийный интерфейс и выполнять сложные вычисления, не привнося при этом риска заражения вирусом или порчи данных.

Система программирования Java может служить основой для совместной разработки больших программных систем коллективом разработчиков, связанных между собой только через WWW (они и знакомы между собой могут быть лишь заочно, через e-mail, а когда они наконец повстречаются где-нибудь на международном симпозиуме, в их активе уже может быть совместно разработанная программная система). Java и WWW являются первыми системами, обеспечивающими такую возможность, поэтому их внедрение и распространение многие программисты справедливо называют революцией в разработке программного обеспечения. Ясно, что ведущую роль в обеспечении указанной возможности играет именно Java, так как именно Java позволяет распространять не просто тексты, а работающие программы и их фрагменты (апплеты) по WWW.

Отсюда большой интерес к языку и системе программирования Java со стороны буквально всех категорий разработчиков и пользователей программного обеспечения. Все ведущие фирмы, разрабатывающие компьютерную аппаратуру и программное обеспечение (и IBM, и DEC, и Microsoft, список можно продолжать очень долго) официально объявили о поддержке языка и системы программирования Java. Все распространенные инструментальные системы уже поддерживают программирование на Java. В WWW можно найти сотни тысяч публикаций и программной продукции, связанных с Java, в том числе свободно распространяемая система программирования Java, разработанная фирмой Sun-Soft (недавно из этой фирмы выделилась самостоятельная фирма Java-Soft), а также свободно распространяемая система программирования GNU-Java, разработанная FSF. Написаны десятки учебных пособий по Java (часть из них переведена на русский язык и издана в нашей стране), статьи и обзоры по языку Java и его применениям регулярно публикуются в серьезных и популярных программистских журналах и еженедельниках.

Цель данной публикации - ознакомить читателей с основными свойствами и особенностями системы программирования Java и показать, как можно использовать многочисленные Java-апплеты, доступные в среде Internet, и другие возможности языка и системы программирования Java в своей повседневной деятельности.

Сначала будет дано краткое описание особенностей синтаксиса и семантики конструкций языка Java, используя для сравнения всем хорошо известный объектно-ориенти- рованный язык C++. Внимание читателя будет обращено только на принципиальные моменты, с дальнейшими подробностями можно ознакомиться по описанию языка и другим основополагающим документам фирмы Sun [1,3,4], а также с помощью многочисленных учебных пособий и руководств по языку Java (см., например, [5]).

Затем будет описана система программирования языка Java. В ее состав входят следующие компоненты:

Возможности системы программирования языка Java (в частности, утилиты и некоторые библиотечные классы) будут продемонстрированы на примере разработки и использования нескольких простых апплетов, доступных по WWW.

Язык Java и его окружение непрерывно развиваются: постоянно появляются новые инструменты, многие системы интегрируются с системой Java. Развитием окружения Java занимаются группы во всех университетах, а также мощные компании (фирмы), разрабатывающие компьютерную аппаратуру и программное обеспечение. Поэтому основная часть данной публикации посвящена проблемам развития языка и системы программирования Java. На примере Java можно проследить как язык, первоначально ориентированный, в основном, на написание апплетов, постепенно превращается в мощный универсальный язык программирования. Развитие окружения Java нетрудно проследить по многочисленным публикациям в WWW, но именно их многочисленность делает эту задачу довольно трудной: ведь нужно не только успевать просмотреть все эти, порой противоречивые, а порой и просто ошибочные публикации, но и суметь сделать правильные выводы о тенденциях развития Java. Одна из попыток уловить такие тенденции и сформулировать их сделана в данной статье.

Основным свойством апплетов является возможность выполнять их на различных платформах и в различных окружениях, не оказывая вредного влияния на аппаратуру, программы и данные их пользователей. Язык, ориентированный на программирование апплетов должен прежде всего обеспечивать надежность и безопасность. Этого легче всего достичь в интерпретируемом языке, хотя интерпретация, как правило, ведет к существенной потере эффективности программы (она выполняется гораздо медленнее, чем могла бы), причем эти потери растут (нелинейно!) с ростом объема программы и объема обрабатываемых ею данных. Пока язык используется для разработки сравнительно небольших апплетов (например, апплета, выводящего на экран текущее состояние табло аэропорта, или биржи, или баскетбольного матча), эти потери просто не замечаются. Создается иллюзия, что скоро вообще можно будет решить проблему составления новых программ путем объединения ("сшивания") уже имеющихся в сети апплетов. Если стать на такую точку зрения, то интерпретируемый язык является наиболее естественным: ведь программа, состоящая из вызовов большого числа апплетов, все равно интерпретируется. К сожалению, с ростом объема такой программы она вообще перестанет выполняться ввиду нехватки ресурсов, или будет выполняться неприемлемо долго. Поэтому в окружении Java остро стоит проблема эффективности Java-программ. Авторы языка Java предчувствовали возникновение этой проблемы. Они ввели в язык легковесные процессы (трэды), обеспечив их параллельное выполнение на многопроцессорных компьютерах (которых становится все больше), они сконструировали интерпретатор языка (JavaVM) таким образом, что в Java-программу можно включать фрагменты, написанные на других языках и выполняемые в объектном коде (native code) соответствующей платформы. Но, как будет показано, эти средства языка Java не решают проблемы эффективности в полной мере, так как потери, связанные с интерпретацией намного больше. В данной статье будут рассмотрены основные пути решения проблемы эффективности системы Java.

Как уже было отмечено, Java - объектно-ориентированный язык. Это дало возможность зафиксировать достаточно компактное ядро языка, ограничив его сравнительно небольшим числом различных синтаксических конструкций, а большую часть возможностей языка вводить с помощью классов. Так, трэды включены в язык с помощью классов Thread и ThreadGroup. В виде классов реализованы и такие базовые языковые понятия, как функции обработки строк и обработка исключений. Развитие языка Java тоже ведется путем включения в него новых классов и пакетов (пакеты заменяют в системе программирования Java файлы-заголовки окружения C/C++, однако, в отличие от файлов-заголовков, пакеты содержат как спецификацию классов, так и их реализацию; подробнее о пакетах см. ниже). Такой способ расширения языка удобен тем, что старые компиляторы остаются пригодными и для расширенного языка. Многие новые свойства языка, введенные в него через новые классы и пакеты, будут рассмотрены (или хотя бы упомянуты) ниже. В частности, будут рассмотрены пакеты GJL и SJL, обеспечивающие некоторые удобные для приложений структуры объектов (контейнеры и итераторы)[6,7]. В языке C++ такие возможности поддерживаются широко известной библиотекой классов STL [8], в 1995 году включенной в его стандарт.

В заключение будут кратко рассмотрены и некоторые дополнительные средства окружения Java. Такими средствами являются, например, web'овский браузер HotJava [9] (именно этому браузеру система Java обязана своей эмблемой - чашечкой дымящегося кофе), а также небольшой объектно-ориентированный язык JavaScript [10], предназначенный для разработки CGI-скриптов [2, с. 189 - 199], используя конструкции языка Java. Netscape Navigator 2.0, или HotJava, интерпретирует операторы JavaScript, которые включаются непосредственно в страницу HTML. На языке JavaScript часто программируют текущую дату, различные "бегущие строки" и другие меняющиеся во времени объекты, встречающиеся на страницах HTML.