KVRSOFT - Програмиране на сокети в Delphi

За първи път се запознах с контакти, ако не се лъжа, преди година или половина. Тогава задачата беше да се разработи протокол за приложение, който да изпрати заявка до сървърна машина (работеща на Unix/Linux OS) и да получи отговор чрез сокет канал. Трябва да се отбележи, че за разлика от други протоколи (FTP, POP, SMTP, HTTP и др.), Сокетите са в основата на тези протоколи. По този начин, използвайки гнезда, можете сами да създадете (симулирате) FTP, POP и всеки друг протокол и не непременно вече създаден, но дори и ваш собствен!

Така че нека започнем с теорията. Ако сте отдаден практикуващ (и не виждате алгоритми в очите си), тогава трябва да пропуснете този раздел.

Алгоритъм за работа с сокет протоколи

И така, какво ни позволяват гнездата? Всичко! И това е едно от основните предимства на този метод за обмен на данни в мрежата. Въпросът е, че когато работите с сокет, просто изпращате последователност от символи на друг компютър. Така че с този метод можете да изпращате както прости съобщения, така и цели файлове! Освен това не е необходимо да контролирате коректността на прехвърлянето (както беше при работа с COM портове)!

По-долу е дадена примерна схема за работа с сокети в приложенията на Delphi

Нека анализираме схемата по-подробно:

Изпращането/получаването на данни всъщност е това, за което е била отворена връзката на сокета. Комуникационният протокол също зависи от сървъра;

Затваряне на сокет - след като всички операции са изпълнени, трябва да затворите сокета, използвайки метода Close на компонента TClientSocket (или да зададете свойството Active на False).

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

Тук ще се запознаем с основните свойства, методи и събития на компонента TClientSocket.

Активен - показва дали гнездото е отворено или не. Тип: Boolean. Съответно True е отворен, а False е затворен. Това свойство може да се записва;

Хост - низ (Тип: низ), указващ името на хоста на компютъра, към който да се свържете;

Порт - номер на порт (Тип: Цяло число (Word)), към който да се свържете. Валидни стойности са от 1 до 65535;

Услуга - низ (Тип: низ), определящ услугата (ftp, http, поп и т.н.), към която ще бъде свързан портът. Това е вид справка за съответствието на номерата на портове с различни стандартни протоколи;

ClientType - тип връзка. ctNonBlocking - асинхронно предаване на данни, тоест можете да изпращате и получавате данни през сокет, използвайки OnRead и OnWrite. ctBlocking - синхронен (едновременен) трансфер на данни. Събитията OnRead и OnWrite не работят. Този тип връзка е полезен за организиране на обмен на данни с помощта на потоци (т.е. работа с сокет като файл);

Open - отваряне на сокет (подобно на задаването на свойството Active на True);

Close - затваря сокета (подобно на присвояване на False на свойството Active);

OnConnecting - задейства се, когато се установи връзка. Разликата от OnConnect е, че връзката все още не е установена. Обикновено тези междинни събития се използват за актуализиране на състоянието;

OnDisconnect - Повишава се, когато гнездото е затворено. Нещо повече, затваряне както от вашата програма, така и от страната на отдалечен компютър (или поради повреда);

OnError - продължава тъжната тема на предишното събитие:). Възниква, когато възникне грешка в сокет. Трябва да се отбележи, че това събитие няма да ви помогне да уловите грешка в момента на отваряне на сокета (Open). За да избегнете издаването на съобщение за грешка в Windows, трябва да приложите отворените отчети на сокета в блок try.except (обработка на изключения);

OnRead - възниква, когато отдалеченият компютър ви е изпратил някакви данни. Когато се случи това събитие, е възможна обработка на данни;

OnWrite - възниква, когато ви е позволено да записвате данни в сокета.

Практика и примери

Пример 1. Най-проста програма за сокети

При натискане на бутона се извиква манипулаторът на събитието OnClick - Button1Click.

Преди това трябва да въведете името на хоста в първия от TEdits,

а във втория - порта на отдалечения компютър.