SOCKET WINDOWS
Одним
из наиболее популярных способов взаимодействия программ является использование
сокетов. Сокет-набор API-функций Windows, с помощью которых моно установить
связь между двумя программами или процессами, запущенных на разных компах.
В
системе OSI сокеты располагаются над низкоуровневым транспортным протоколом
TCP/IP, являющийся базовым протоколом для взаимодействия в сети Internet и ниже
специализированных протоколов, таких как ftp, smtp, и других. При любом способе
взаимодействия программ одна из них играет пассивную роль(она является
сервером), другая-активную(клиент). Процесс, который использует сокетное
соединение с сетью называется хостом. Один из сокетов работает в режиме
прослушивания сети, те ждет запросов клиента. Клиент обращается к хосту,
указывая его имя. На компьютере может быть запущено несколько серверных
хостов,связанных с одной и той же сетевой картой. В этом случае серверная
машина предоставляет каждому клиенту несколько служб, для идентификации которых
используются номера портов(это целые числа от 0 до 65535).Некоторые стандартные
службы используют заранее определенные порты. Например, web-сервер - порт 80.
Каждый
сокет может работать в одном из двух режимов: синхронном и асинхронном.
Обращение к синхронному сокету блокирует дальнейшую работу программы, вплоть до
завершения операции обмена данными. Асинхронный сокет получив обращение от
программы тут же возвращает ей управление и выполняет операцию обмена в
отдельном потоке комманд. В этом случае программа может реагировать на
завершение операции обмена с помощью соответствующего обработчика событий.
КОМПОНЕНТЫ ДЕЛФИ ДЛЯ ПОДДЕРЖКИ SOCKET
Для
установления сокетной связи используется пара компонентов TServerSocket и
TClientSocket имеющие общий родительский класс TCustomSocket. Центральным
свойством обоих компонентов является свойство Socket: TServerWinSocket и
TClientWinSocket.
Свойства класса
property Active:boolean указывает открыт ли сокет в данный момент.
Переустановка данного свойства во время выполнения программы эквивалентно
обращению к методам open и close
property Port:integer указывае порт, по которому осуществляется
взаимодействие
property Service:string указывает сервис компонента. Используется вместо
Port. Допустимые значения этого свойства должны быть записаны в файле Services
Методы класса
OnConnect возникает на клиентском сокете после установления
связи с сокетом. OnConnect возникает на клиентском сокете после того как был
обнаружен серверный сокет, но до установления с ним связи
OnDisConnect возникает на клиентском сокете перед разрывом связи с
сервером
OnListen возникает на сервере непосредственно перед тем как он
начинает прослушивать порты
OnLookup возникает на клиентском сокете непосредственно перед
тем ак он начинает поиск сервера
OnRead возникает когда клиент должен прочитать данные из
сокета
OnWrite возникает когда клиент должен послать данные серверу
Установление
связи клиента с сокетом сопровождается такой последовательностью событий:
1)сразу
после обращения к методу Open возникает событие OnLookup
2)сокет
начинает поиск сервера
3)после
того как сервер найдется возникает событие OnConnecting
4)сокет
требует соединение
5)событие
OnConnect возникает сразу после установления связи
procedure Look блокирует дальнейшую работу всех других потоков, с
помощью которых сервер обслуивает остальных клиентов вплоть до обращения к
методу UnLook
function ReceiveBuf(var Buf;
count:integer):integer читает из
сокетного соединения не более count байт в буфер Buf и возвращает количество
действительно полученных байт
function ReceiveLength:integer возвращает количество, которое следует прочитать из
сокетного соединения
function ReceiveText:string читает из сокетного соединения строку
function SendBuf(var Buf;
count:integer):integer посылает в
сокетное соединение не более count байт из буфера Buf и возвращает количество
действительно посланных байт
function
SendStream(AStream:TStream):boolean
посылает в сокетное соединение всю инфу, которую можно прочитать из потока
AStream и возвращает true, если операция прошла успешно
function
SendStreamThenDrop(AStream:TStream):boolean посылает поток AStream и разрывает соединение
function SendText(const
s:string):integer посылает текстовую
строку и возвращает 0, если операция прошла успешно
procedure OnLook отменяет действия метода Look
Как
сервер, так и клиент передают данные одним блоком, если длина блока не
превышает 8192 байта. Это относится также и к текстовым строкам. Кроме того,
строка, передаваемая методом SendText не должна включать в себя символы, коды
которых<32.
В
класс объединены два события OnErrorEvent и OnSocketEvent(возникают при перходе
сокета из одного состояния в другое)
TSERVERSOCKET AND TCLIENTSOCKET
Эти
компоненты большинство своих свойств, методов и событий унаследовали от своего
родительского класса TCustomSocket.
Класс
TServerWinSocket чодержит свойство Connections[Index:integer]:TCustomWinSocket,
с помощью которого открывается индексный доступ к любому активному соединению,
установленному с сервером. Каждый компонент TCustomWinSocket в этои массиве
обслуживает своего клиента. Используя это свойство легко создать примитивный
чат, в котором каждый клиент посылает серверу тектовую строку, а тот передает
этот текст всем подключенным к нему клментам.
Для
сервера определено свойство ServerType:TServerType
type
TServerType=(stNonBlocking, stThreadBlocking)
С
помощью данного свойства можно установить тип сервера - асинхронный
(stNonBlocking) или блокирующий (stThreadBlocking).
Аналогичное
свойство есть и у клиента: ClientType:TClientType
type
TClientType=(ctNonBlocking, ctBlocking)
Асинхронный
сокет выполняет обмен данными в отдельном потоке команд и т.о. не задерживает
выполнение программы, в блокирующем сокете работа программы приостнанавливается
вплоть до завершения обмена.