» Главная
eXcode.ru » Статьи » Delphi/Pascal » Сеть
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 15





Использование компонента ClientSocket




Эта статья представляет собой практический материал по использованию компонента ClientSocket.Написана она была всвязи с возросшей активностью написания приложений при помощи Socket′ов.

Как всегда, рассмотрим сначала свойства этого компонента: Важнейшие его свойства- Active, address , Host , Port , Service ,ClientType.

Свойство Active имеет тип Boolen и указывает, открыт Сокет или нет.Установка true, является запуском Сокета.
Свойство Host, имеющее тип String указывает на адрес, по которому будет обращаться сокет.Например:

Листинг 1. Код Delphi/Pascal


Form1.FormCreate(Sender:TObject);
begin
ClientSocket1.Host:="http://delphi-k17.narod.ru";
end;


Adress отличается от Host тем, что должно иметь значение типа:

Листинг 2. Код Delphi/Pascal


Form1.FormCreate(Sender:TObject);
begin
ClientSocket1.Adress:="123.197.1.2";
end;


Свойство Port просто указывает порт, по которому будет обращаться сокет.
Service - свойство имеющее Тип: string и определяющее службу (ftp, http, pop, и т.д.), к порту которой произойдет подключение. Это своеобразный справочник соответствия номеров портов различным стандартным протоколам.

ClientType Указывает тип соединения. ctNonBlocking - ассинхронная передача данных, передавать данные можно при помощи событий OnRead и OnWrite.
ctBlocking - синхронная передача данных.OnRead и OnWrite не работают. Этот тип связи полезен, для передачи данных используя потоки(Stream или Thread).
Методов у этого компонента не очень много, конкретнее, их всего 2. Это методы:
Open и Close.

Open - запуск сокета. Равнозначно установлению значения Active в true.
Close - наоборот закрывает сокет. То же самое, что и Active в false.
Всё остальное проще понимается на примерах.Итак, начнём:
Киньте на пустую форму компоненты: кнопка(TButton) и 2 поля(TEdit). В 1-ый Edit надо ввести имя-хост, а во второй - номер порта. Не забудьте поместить на форму компонент TClientSocket.

Листинг 3. Код Delphi/Pascal


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;


Этот пример не бесполезен, как может показаться вначале. Если присмотреться, то это простой сканер портов, который смотрит, открыт ли указанный порт на удалённой машине. По такому принципу работает программа PortScanner из программы NetToolsPro.
Далее рассмотрим пример посылки текстовых сообщений и их приём.
Киньте на форму компоненты: 2 кнопки(TButton), 3 поля(TEdit) и список(TListBox). В первый Edit нужно ввести имя-хост, во второй номер порта на удалённой машине. После установки соединения можно посылать и принимать текстовые сообщения. Текст отсылаемого сообщения будет находиться в 3-ем TEdit. Принимаемые сообщения, будут находиться в ListBox′e. Не забудьте поместить на форму компонент TClientSocket.

Листинг 4. Код Delphi/Pascal


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;


Впринципе на этом можно остановиться, но как вы понимаете, приведённый метод не очень удобен, особенно для работы с сокетами. Рассмотрим более удобный способ передачи данных.

Листинг 5. Код Delphi/Pascal


procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
var c: Char;
MySocket: TWinSocketStream;
begin
{Как только произошло соединение - создаем поток и ассоциируем его с сокетом (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;


Примечание:
Для использования потока поставьте тип TypeClient в ctBlocking.
И напоследок приведу ещё один пример: пример авторизации на сервере.
На нашу форму надо кинуть ещё 2 поля(TEdit). Для ввода логина и пароля.

Листинг 6. Код Delphi/Pascal


procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
var c: Char;
MySocket: TWinSocketStream;
login,password: string;
begin
MySocket := TWinSocketStream.Create(Socket,60000);
{Добавляем к логину и паролю символ перевода строки, чтобы сервер смог отделить логин и пароль.}
login := Edit3.Text+#10;
password := Edit4.Text+#10;
MySocket.Write(login,Length(Edit3.Text)+1);
MySocket.Write(password,Length(Edit4.Text)+1);
while not MySocket.WaitForData(100) do
Application.ProcessMessages;
MySocket.Read(c,1);
{Здесь сервер посылает нам один байт, значение 1 которого
соответствует подтверждению успешной авторизации, а 0 - ошибку (это
лишь пример). Далее мы выполняем нужные действия (прием/пересылку
данных) и закрываем поток.}
MySocket.Free;
end;


Вот и всё...Нет, это конечно не всё, так как описывать сокеты можно почти вечно. Здесь описана самая малость того, что можно написать про сокеты, но надеюсь, что она вам поможет.

Автор статьи : Dima-k17
К началу статьи





Добавил: LedWormДата публикации: 2005-12-17 21:56:11
Рейтинг статьи:3.75 [Голосов 8]Кол-во просмотров: 12391

Комментарии читателей

Всего комментариев: 9

2016-12-19 18:30:22
Vladimir

Увлекательная работа не выходя из дома. Приглашаются люди, желающие работать и зарабатывать. График свободный. Оплата сдельная, от 15 тыс. руб. в месяц. Выплаты каждую неделю. Стабильно! Ваш возраст и образование значения не имеют. Обязательные условия: наличие компьютера и интернета. Предложение ограничено!
Более подробная информация у нас на сайте. > 100-yspex.ga < скопируйте и вставьте в адресную строку вашего браузера.

2016-12-19 15:47:53
megordem
Несложная работа с обучением, оплата ежедневно!

Вы работаете дома!

Полностью честно и прозрачно;
Доступно для всех - неважно кто вы и какой у вас опыт работы в интернете!
Вы будете зарабатывать: свыше четырёх тысяч рублей в день!
Сложность: Несложно!
Оплата: - уже на следующий деньги у вас на счету!

Ознакомтесь с условиями на нашем сайте. > realno.zarplatt(точка)ru <

2016-12-19 13:23:13
segordem
В наше время по сути никто не защищен от денежных проблем. Не иметь подушки безопасности в виде источника доп.дохода — по меньшей мере глупо.

Не оставайтесь глупцом! И не живите впроголодь, когда можно жить припеваючи!

Мы не не показываем, а предоставляем уникальный инструмент автоприбыли — достаточно 10 минут в день. чтобы ежемесячная зп превышала 100 000 р. При этом доступ к инструменту для Вас — бесплатен!

Вы спросите, какой нам в этом интерес? Все просто! Не будем скрывать — надеемся на процент от вашего дохода.

Чем больше зарабатываете Вы, тем лучше нам.

Считаем, это взаимовыгодное сотрудничество, поэтому ждем вас на нашем сайте! ( manymakker.ga ) скопируйте и вставьте в адресную строку вашего браузера.

2016-12-19 10:48:09
legordem
Теперь Ваш новый график работы будет выглядеть так -
В день вы будете заняты всего 60 минут - остальное время посвящайте себе и своим близким!

Мы гарантируем:
- Первые деньги на вашей карте уже сегодня.
- Обучение. Поддержка учеников пн-птн с 10-18 мск.
- Куратор, который скоординирует ваше обучение.
- Никаких сложных схем!
- Работаете дома, по своему графику.

Все подробности на нашем сайте. ( stabilno.zarplatt.ru )

2016-12-18 22:15:08
tegordem
Требуются работники. Обработка зказов на дому.

Без вложений, на системе автоматического приёма и обработки заказов.

Более подробно >> obrabotka-zakazov.tk <<

2016-12-18 18:30:59
negordem
Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline-online»

Крупнейшая международная компания по продаже А/В билетов
срочно набирает сотрудников на постоянную основу для несложной
работы через интернет, с ежедневными выплатами.

Работая в нашей компании Вы получаете:

- Соблюдение трудового кодекса
- Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
- Высокий доход
- Каждый наш сотрудник на дому гарантированно получает стабильную зарплату.
- Гарантированные стабильные выплаты заработанных денег.
- Выплаты происходят ежедневно на банковские карты или электронные кошельки.

Пройдите регистрацию на нашем сайте. > airline.zarplatt(точка)ru <

Без вложений, опыт и профессиональные навыки не требуются!

2007-11-29 00:19:34
Hwor
Замечательная статья! А продолжение будет?

2007-11-28 11:13:07
Mazdai
Плз выкиньте больше инфы про сокетное программирование, болше теории, больше примеров, больше описаний. Мне как ничего не умеющему нубу статья с 1 раза сложноватой показалась, ну потом вроде во всем разобрался

2006-09-02 17:08:09
iDen
Во втором примере да и вообще следуе добавлять на форму еще и сервер сокета, иначе ошибки не избежать.
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Каким способом вы подключены к интернету
Dial-Up
26% (59)
ISDN
1% (2)
Выделенная линия
27% (61)
ADSL
32% (71)
Спутниковый интернет
2% (5)
GPRS-интернет
8% (17)
Другое
4% (9)

Проголосовало: 224
Разговор двух программистов:
- Ты слышал, Костя умер.
- А он записался?!!
Рейтинг: 4.2/10 (4)
Посмотреть все анекдоты