Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
13
Добавлен:
12.03.2016
Размер:
112.64 Кб
Скачать

Описание свойств и методов

компонента TClientSocket

Свойства

Методы

События

Port - номер порта (Тип: Integer

 

OnError - продолжает грустную

(Word)), к которому следует

 

тему предыдущего события :).

подключиться. Допустимые

 

Возникает при ошибке в

значения - от 1 до 65535;

 

работе сокета. Следует

Service - строка (Тип:

 

отметить, что это событие не

string), определяющая

 

поможет Вам отловить

службу (ftp, http, pop, и т.д.),

 

ошибку в момент открытия

к порту которой произойдет

 

сокета (Open). Для того,

подключение. Это

 

чтобы избежать выдачи

своеобразный справочник

 

виндозного сообщения об

соответствия номеров портов

 

ошибке, надо заключить

различным стандартным

 

операторы открытия сокета в

протоколам;

 

блок try..except (обработка

ClientType - тип соединения.

 

исключительных ситуаций);

ctNonBlocking - асинхронная

 

OnLookup - возникает при

передача данных, т.е.

 

попытке получения от DNS

посылать и принимать

 

IP-адреса указанного хоста;

данные по сокету можно с

 

OnRead - возникает, когда

помощью OnRead и OnWrite.

 

удаленный компьютер послал

ctBlocking - синхронная

 

Вам какие-либо данные. При

(одновременная) передача

 

возникновении этого события

данных. События OnRead и

 

возможна обработка данных;

OnWrite не работают. Этот

 

OnWrite - возникает, когда

тип соединения полезен для

 

Вам разрешена запись

организации обмена данными

 

данных в сокет.

с помощью потоков (т.е.

 

 

работа с сокетом как с

 

 

Пример

procedure Button1Click(Sender: TObject);

begin

{Присваиваем свойствам Host и Port нужные значения}

ClientSocket1.Host := Edit1.Text;

ClientSocket1.Port := StrToInt(Edit2.Text);

{Пытаемся открыть сокет и установить соединение}

ClientSocket1.Open;

end;

procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);

begin

{Как только произошло соединение - закрываем сокет и прерываем связь}

ClientSocket1.Close;

end;

В форму нужно поместить две кнопки TButton и три TEdit. При нажатии на первую кнопку вызывается обработчик события OnClick - Button1Click. Перед этим в первый из TEdit-ов нужно ввести хост-имя, а во второй - порт удаленного компьютера. После установления соединения можно посылать текстовые сообщения, вводя текст в третий TEdit и нажимая вторую кнопку TButton. Чтобы отсоединиться, нужно еще раз нажать первую TButton. Еще нужно добавить TListBox, в который будем помещать принятые и отправленные сообщения.

НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TClientSocket!

procedure Button1Click(Sender: TObject);

begin

{Если соединение уже установлено - прерываем его.} if ClientSocket1.Active then begin

ClientSocket1.Close;

Exit; {...и выходим из обработчика}

end;

{Присваиваем свойствам Host и Port нужные значения}

ClientSocket1.Host := Edit1.Text;

ClientSocket1.Port := StrToInt(Edit2.Text);

{Пытаемся открыть сокет и установить соединение}

ClientSocket1.Open;

end;

procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);

begin

{Как только произошло соединение - посылаем приветствие}

Socket.SendText('Hello!'); ListBox1.Items.Add('< Hello!'); end;

procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

begin

{Если пришло сообщение - добавляем его в ListBox}

ListBox1.Items.Add('> '+Socket.ReceiveText); end;

procedure Button2Click(Sender: TObject); begin

{Нажата кнопка - посылаем текст из третьего TEdit}

ClientSocket1.Socket.SendText(Edit3.Text); ListBox1.Items.Add('< '+Edit3.Text);

end;

procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); var c: Char;

beginMySocket: TWinSocketStream;

{Как только произошло соединение - создаем поток и ассоциируем его с сокетом (60000 - таймаут в мсек)}

MySocket := TWinSocketStream.Create(Socket,60000);

{Оператор WaitForData ждет данных из потока указанное время в мсек (в данном примере - 100) и возвращает True, если получен хотя бы один байт данных, False - если нет никаких данных из потока.}

while not MySocket.WaitForData(100) do Application.ProcessMessages;

{Application.ProcessMessages позволяет Windows перерисовать нужные элементы окна и дает время другим программам. Если бы этого оператора не было и данные бы довольно долго не поступали, то система бы слегка "подвисла".}

MySocket.Read(c,1);

{Оператор Read читает указанное количество байт из потока (в данном примере - 1) в указанную переменную определенного типа (в примере - в переменную c типа Char). Обратите внимание на то, что Read, в отличие от ReadBuffer, не устанавливает строгих ограничений на количество принятой информации. Т.е. Read читает не больше n байтов из потока (где n - указанное число). Эта функция возвращает количество полученных байтов данных.}

MySocket.Write(c,1);

{Оператор Write аналогичен оператору Read, за тем лишь исключением, что Write пишет данные в поток.}

MySocket.Free;

{Не забудем освободить память, выделенную под поток} end;

Сервер сокет

Сервер, основанный на сокетном протоколе, позволяет обслуживать сразу множество клиентов. Причем, ограничение на их количество Вы можете указать сами (или вообще убрать это ограничение, как это сделано по умолчанию). Для каждого подключенного клиента сервер открывает отдельный сокет, по которому Вы можете обмениваться данными с клиентом. Также отличным решением является создание для каждого подключения отдельного процесса (Thread).

Определение св-в Port и ServerType - чтобы к серверу могли нормально подключаться клиенты, нужно, чтобы порт, используемый сервером точно совпадал с портом, используемым клиентом (и наоборот). Свойство ServerType определяет тип подключения (подробнее см.ниже);

Открытие сокета - открытие сокета и указанного порта. Здесь выполняется автоматическое начало ожидания подсоединения клиентов (Listen);

Подключение клиента и обмен данными с ним - здесь подключается клиент и идет обмен данными с ним. Подробней об этом этапе можно узнать ниже в этой статье и в статье про сокеты (клиентская часть);

Отключение клиента - Здесь клиент отключается и закрывается его сокетное соединение с сервером;

Закрытие сервера и сокета - По команде администратора сервер завершает свою работу, закрывая все открытые сокетные каналы и прекращая ожидание подключений клиентов.

Свойства

Методы

События

Socket - класс

Open - Запускает сервер.

OnClientConnect -

TServerWinSocket, через

По сути, эта команда

возникает, когда

который Вы имеете

идентична присвоению

клиент установил

доступ к открытым

значения True свойству

сокетное соединение и

сокетным каналам. Далее

Active;

ждет ответа сервера

мы рассмотрим это

Close - Останавливает

(OnAccept);

свойство более подробно,

сервер. По сути, эта

OnClientDisconnect -

т.к. оно, собственно и

команда идентична

возникает, когда

есть одно из главных.

присвоению значения

клиент отсоединился от

Тип: TServerWinSocket;

False свойству Active.

сокетного канала;

ServerType - тип

 

OnClientError -

сервера. Может

 

возникает, когда

принимать одно из двух

 

текущая операция

значений: stNonBlocking -

 

завершилась неудачно,

синхронная работа с

 

т.е. произошла ошибка;

клиентскими сокетами.

 

OnClientRead -

При таком типе сервера

 

возникает, когда

Вы можете работать с

 

клиент передал

клиентами через события

 

серверу какие-либо

OnClientRead и

 

данные. Доступ к этим

OnClientWrite.

 

данным можно

stThreadBlocking -

 

получить через

асинхронный тип. Для

 

передаваемый

каждого клиентского

 

параметр Socket:

сокетного канала

 

TCustomWinSocket;

создается отдельный

 

OnClientWrite -

процесс (Thread). Тип:

 

возникает, когда

TServerType;

 

сервер может

 

 

отправлять данные

 

 

клиенту по сокету;

 

 

OnGetSocket - в

ThreadCacheSize -

OnGetThread - в

количество клиентских

обработчике этого

процессов (Thread),

события Вы можете

которые будут

определить

кэшироваться сервером.

уникальный процесс

Здесь необходимо

(Thread) для каждого

подбирать среднее

отдельного

значение в зависимости

клиентского канала,

от загруженности

присвоив параметру

Вашего сервера.

SocketThread нужную

Кэширование

подзадачу

происходит для того,

TServerClientThread;

чтобы не создавать

OnThreadStart,

каждый раз отдельный

OnThreadEnd -

процесс и не убивать

возникает, когда

закрытый сокет, а

подзадача (процесс,

оставить их для

Thread) запускается

дальнейшего

или останавливается,

использования. Тип:

соответственно;

Integer;

OnAccept -

Active - показатель

возникает, когда

того, активен в данных

сервер принимает

момент сервер, или нет.

клиента или

Т.е., фактически,

отказывает ему в

значение True указывает

соединении;

на то, что сервер

OnListen -

работает и готов к

возникает, когда

приему клиентов, а

сервер переходит в

False - сервер выключен.

режим ожидания

Чтобы запустить сервер,

подсоединения

нужно просто присвоить

клиентов.

этому свойству

 

Соседние файлы в папке Операционные системы презентации