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)

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

Hosted by uCoz