Программирование на Delphi
GND. Следует также отметить, что параметр метода является записью
типа tWMEraseBkgnd.
type TWMEraseBkgnd=record
Msg:Cardinal;
DC:HDC;
Unused:Longint;
Result:Longint;
end;
В VCL имеются записи для большинства сообщений Windows® (они определены в
модуле Messages.pas). Именем записи является имя сообщения с префиксом t и
без подчеркивания. Сам метод можно назвать как угодно, но приведенная выше
форма является общепринятой. В этом методе может возникнуть необходимость
вызвать обработчик сообщения, установленный по умолчанию. Для этого
необходимо вызвать виртуальный метод класса tObject DefaultHandler:
procedure tObject.DefaultHandler(var Message); virtual;
Помимо нормальных сообщений Windows®, можно создать свое собственное
сообщение. еализация и перехват определяемого пользователем сообщения
идентичны обработке сообщений Windows®. Единственное отличие состоит в том,
что это сообщение необходимо сначала определить:
Const My_Message = WM_USER + 1;
Эта строка объявляет пользовательское сообщение с именем My_Message.
Для обработки сообщений, определенных пользователем в качестве типа
параметра обработчика сообщения следует использовать запись общего вида
tMessage:
type tMessage = record
Msg:Cardinal;
WParam:Longint;
LParam:Longint;
Result:Longint;
end;
Здесь, как и во всех других определенных в VCL для сообщений записях, поле
Msg определяет передаваемое сообщение, поле Result - результат действия
обработчика. Уникальные для данной записи поля WParam и LParam содержат
соответствующие параметры сообщения.
Для посылки определяемых пользователем сообщений можно использовать функции
SendMessage, PostMessage, однако, предпочтительнее в данном случае
использовать Perform.
Сокеты
Наиболее современным и даже "модным" является общение процессов на уровне
сокетов. Популярность их обусловлена взрывным ростом интереса как
пользователей, так и специалистов к Internet и всему, что связано с этой
сетью.
Общепринятой и стандартизованной на международном уровне является
семиуровневая модель структуры протоколов связи под названием интерфейс
открытых систем (Open Systems Interface, OSI). На каждом из уровней — от
первого, физического, до высших уровней представления и приложений —
решается свой объем задач и используется свой инструментарий.
Сокеты находятся как раз на промежуточном, так называемом транспортном
уровне семиуровневой структуры. "Под ним", на сетевом уровне, находится
протокол IP (основа TCP/IP — Transmission Control Protocol/Internet
Protocol). Над ним находятся протоколы сеансового уровня (сервисы),
ориентированные на конкретные задачи — например, FTP (для передачи файлов),
SMTP (почтовый), всем известный гипертекстовый протокол HTTP и другие.
Использование сокетов, с одной стороны, позволяет абстрагироваться от
частностей работы на нижних уровнях, с другой — решать широкий круг задач,
недоступный специализированным протоколам.
С точки зрения своей сущности сокет — это модель одного конца сетевого
соединения, со своими свойствами и возможностью читать и записывать данные.
С точки зрения содержания — это прикладной программный интерфейс, входящий
в состав разных операционных систем, в том числе Windows — начиная с версии
3.11. Последняя его реализация носит название WinSock 2.0. Прототипы
функций содержатся в файле WINSOCK.PAS, поставляемом с Delphi.
API сокетов впервые появился в среде Unix и стал популярен вместе с (и
благодаря) протоколом TCP/IP. Именно они являются строительным материалом,
из которого построена сеть Internet. Но сокеты не обязательно базируются на
TCP/IP, они могут базироваться на IPX/SPX и других протоколах.
Механизм соединения при помощи сокетов таков. На одной стороне создается
клиентский сокет. Для инициализации связи ему нужно задать путь к
серверному сокету, с которым предстоит установить соединение.
Путь в сети задается двумя параметрами: адресом или равноценным ему именем
хоста, или просто хостом и номером порта. Хост — это система, в которой
запущено приложение, содержащее сокет. Неверно приравнивать понятие "хост"
или "адрес" к понятию "компьютер" — у компьютера может быть несколько
сетевых устройств и несколько адресов. Адрес в сетях TCP/IP задается
четверкой чисел в диапазоне 0..255, например, так: 192.168.99.1.
Естественно, каждый адрес даже в рамках Internet уникален — за этим следит
специальная организация. Имя хоста, как правило, — символьная строка,
поставленная в соответствие адресу и записанная по правилам UNC, например
http://www.microsoft.com. Взаимное соответствие между именами и адресами
может осуществляться по-разному, в зависимости от масштаба сети и
применяемой ОС. В Internet существует система имен доменов (DNS) —
специальные серверы, хранящие и поддерживающие таблицы соответствия между
символьным именем и адресом. Но в любом случае соединение по адресу
быстрее, так как не нужно обращаться за дополнительной информацией.
В случае, если ваши клиент/серверные приложения отлаживаются на одной и той
же машине, можно связать сокеты четырьмя способами:
. Указанием сетевого имени вашего компьютера (узнать его можно через
апплет "Сеть" Панели управления)
. Указанием IP — адреса вашего компьютера (узнать его можно в свойствах
протокола ТСР/IP: на машине должен стоять этот протокол и иметься
постоянный IP-адрес)
. Указанием имени localhost, указывающего, что сервер находится на том
же компьютере
. Указанием IP-адреса 127.0.0.1, указывающего на тоже самое
Номер порта — простое средство для поддержания одновременно нескольких
связей между двумя хостами. Это число, обычно зарезервированное для
протоколов более высокого уровня. Так, для протокола FTP выделен порт 21,
SMTP — 25, популярная игра Quake II использует порт 27910 и т. п.
Программист должен ознакомиться со списком уже закрепленных портов, прежде
чем установит и использует свое значение.
С одной из двух вступающих в связь сторон запускается серверный сокет.
Первоначально он находится в состоянии просушивания (listening), то есть
ожидания связи. После получения запроса от другой стороны — клиента —
устанавливается связь. Но в то же время создается новый сокет для
продолжения прослушивания.
Естественно, в составе Delphi имеется полноценная поддержка сокетов. Еще в
версии 2 появился заголовочный файл WINSOCK.PAS. Есть он и сейчас — для
желающих использовать API WinSock напрямую. Мы же рассмотрим здесь
компоненты TServerSocket и TClientSocket, имеющиеся в Delphi 4 на странице
Internet Палитры компонентов.
Очень важным моментом в использовании сокетов является задание их типа —
блокирующего (синхронного) и неблокирующего (асинхронного). По существу,
работа с сокетами — не что иное, как операции ввода/вывода, которые, как мы
знаем, также могут быть синхронными и асинхронными (отложенными). В первом
случае при вызове функции ввода/вывода приложение блокируется до его
окончания. Во втором — инициируется ввод/вывод и выполнение приложения
сразу же продолжается; окончание ввода/вывода будет "ознаменовано" в
системе возникновением некоторого события. В библиотеке WinSock 2.0
поддерживаются оба типа операций с сокетами; соответственно, в компонентах
Delphi также можно установить нужный тип. Отвечают за него свойства
serverType и clientType, о которых рассказано ниже.
Специфика компонентов TServerSocket и TClientSocket в том. что они являются
"двухэтажными" надстройками над API сокетов. И у того, и у другого имеется
свойство:
property Socket: TClientWinSocket;
у компонента TClientSocket и
property Socket: TServerWinSocket;
у компонента TServerSocket
Это свойство представляет собой объект — собственно оболочку сокета, со
всеми функциями поддержки установления соединения, чтения и записи.
азделение труда между ними такое—на уровне TServerSocket (TClientSocket)
сосредоточены основные опубликованные свойства и события, обработку которых
можно запрограммировать; на уровне TServerWinSocket (TClientWinSocket)
следует искать функции, в том числе чтения и записи в сокет.
Объект TServerWinSocket
На уровне этого объекта ведется список соединений с клиентскими сокетами,
содержащийся в свойстве:
property Connections [Index: Integer]: TCustomWinSocket;
Общее число соединений (и число элементов в свойстве connections) равно
значению свойства:
property ActiveConnections: Integer;
Этим списком и счетчиком удобно пользоваться для рассылки всем клиентам
какой-нибудь широковещательной информации, например:
for i:=0 to ServerSocket.Socket.ActiveConnections-1 do
ServerSocket.Socket.Connections[i].SendText('Hi! ');
Тип сервера (блокирующий/неблокирующий) задается свойством
type TServerType = (stNonBiocking, stThreadBiocking);
property ServerType: TServerType;
Поскольку сервер, который блокируется каждым чтением/записью, представить
себе трудно, разработчики фирмы Inprise пошли таким путем. Блокирующий
режим заменен режимом stThreadBlocking. В этом случае при установлении
каждого нового соединения запускается отдельный программный поток3 (объект
класса TServerclientThread). Он отвечает за связь с отдельным клиентом, и
его блокировка не влияет на работу остальных соединений.
Если вы не х
| | скачать работу |
Программирование на Delphi |