Примечание:
Передаваемый в качестве параметра последних двух функций лоток данных AStream переходит "под надзор" объекта TServerWinSocket и удаляется им по мере пересылки. Программист не должен предпринимать попыток удалить AStream после вызова методов SendStream или SendStreamThenDrop.
При помощи метода:
function GetClientThread(ClientSocket: TServerClientWinSocket): TServerClientThread;
можно получить указатель на поток, занимающийся обслуживанием конкретного сокета.
События:
property OnClientConnect;
property OnClientDisconnect;
property OnClientRead;
property OnClientWrite;
имеют одинаковый тип:
TSocketNotifyEvent = procedure (Sender: TObject; Socket:
TCustomWinSocket) of object;
Они происходят при соединении/отключении от клиента, а также при чтении и записи. Если произошла ошибка, возникает событие:
property OnClientError: TSocketErrorEvent;
TErrorEvent = (eeGeneral/ eeSend, eeReceive, eeConnect, eeDisconnect, eeAccept) ;
TSocketErrorEvent = procedure (Sender: TObject; Socket: TCustomWin-
Socket; ErrorEvent: TErrorEvent; var ErrorCode: Integer) of object;
Параметры его имеют следующее назначение. ErrorEvent указывает на тип операции, во время которой произошла ошибка. При этом ErrorCode содержит код ошибки Windows. Если вы сами обработали ошибку и не хотите дальнейших действий по ее обработке со стороны системы, нужно установить параметр ErrorCode в 0.
Компонент tServerSocket
Самое главное свойство этого компонента - уже упоминавшаяся ссылка на объект:
property Socket: TServerWinSocket;
Именно через него доступны все функциональные возможности сокета. Компонент же создан только для того, чтобы опубликовать необходимые свойства и события. В нем имеются свои события OnClientConnect, OnClientDisconnect, OnClientRead, OnClientWrite, OnClientError, но они не самостоятельны, а только отсылают к соответствующим событиям объекта TServerWinSocket. Также обстоит дело и со свойствами ServerType и ThreadCacheSize.
Дополнительно в компоненте предусмотрены события:
property OnListen: TSocketNotifyEvent; - происходит после того, как заданы адрес и порт сокета и перед тем, как он включается в режим прослушивания (готовности к соединению)
property OnAccept: TSocketNotifyEvent; - происходит непосредственно после установки соединения.
Свойство property Active: Boolean; отвечает за состояние сокета. Для клиентского сокета изменение его значения соответствует подключению/отключению от сервера. Для серверного - включение/выключение состояния прослушивания. Использование этого свойства равносильно применению следующих методов:
procedure Open;
procedure Close;
Свойство
property Service: string;
пригодится для идентификации предназначения сокета. Здесь должно храниться символьное имя сервиса, для которого используется сокет (ftp, http, telnet и др.)
Объект tClientWinSocket
Многие из событий и методов этого объекта уже описаны выше (см. объект TServerWinSocket), так как они имеют общего предка. Но есть и различия, требующие комментария. Как и серверный, клиентский сокет может быть двух типов:
type TClientType = (ctNonBlocking, ctBlocking) ;
property ClientType: TClientType;
В отличие от сервера, в блокировке клиента большой беды нет. Если установлен режим ctBlocking, клиентское приложение блокируется до завершения операции. Если это вас пугает, отдельный поток для работы с сокетом в режиме ctBlocking предлагается создать самому. В режиме ctNonBlocking операции выполняются асинхронно.