Отже, почнемо з теорії. Якщо Ви переконаний практик (і в очі не можете бачити будь-яких алгоритмів), то Вам слід пропустити цей розділ.
Алгоритм роботи сокетного сервера
Що ж дозволяє робити сокетних сервер. За яким принципом він працює. Сервер, заснований на сокетних протоколі, дозволяє обслуговувати відразу безліч клієнтів. Причому, обмеження на їх кількість Ви можете вказати самі (або взагалі прибрати це обмеження, як це зроблено за замовчуванням). Для кожного підключеного клієнта сервер відкриває окремий сокет, за яким Ви можете обмінюватися даними з клієнтом. Також відмінним рішенням є створення для кожного підключення окремого процесу (Thread).
Розберемо схему докладніше:- Визначення св-в Port і ServerType - щоб до сервера могли нормально підключатися клієнти, потрібно, щоб порт, який використовується сервером точно збігався з портом, використовуваним клієнтом (і навпаки). Властивість ServerType визначає тип підключення (докладніше див.нижче);
- Відкриття сокета - відкриття сокета і зазначеного порту. Тут виконується автоматичний початок очікування під'єднання клієнтів (Listen);
- Підключення клієнта і обмін даними з ним - тут підключається клієнт і йде обмін даними з ним. Детальніше про це етапі можна дізнатися нижче в цій статті і в статті про сокети (клієнтська частина);
- Відключення клієнта - Тут клієнт відключається і закривається його сокетних з'єднання з сервером;
- Закриття сервера і сокета - По команді адміністратора сервер завершує свою роботу, закриваючи всі відкриті сокетних канали та припиняючи очікування підключень клієнтів.
Слід зауважити, що пункти 3-4 повторюються багаторазово, тобто ці пункти виконуються для кожного нового підключення клієнта.
Короткий опис компонента TServerSocket
Тут ми познайомимося з основними властивостями, методами і подіями компонента TServerSocket.
Socket - клас TServerWinSocket, через який Ви маєте доступ до відкритих сокетних каналах. Далі ми розглянемо це властивість більш докладно, тому що воно, власне і є одне з головних. Тип: TServerWinSocket;
ServerType - тип сервера. Може приймати одне з двох значень: stNonBlocking - синхронна робота з клієнтськими сокетами. При такому типі сервера Ви можете працювати з клієнтами через події OnClientRead і OnClientWrite. stThreadBlocking - асинхронний тип. Для кожного клієнтського сокетного каналу створюється окремий процес (Thread). Тип: TServerType;
ThreadCacheSize - кількість клієнтських процесів (Thread), які будуть кешуватися сервером. Тут необхідно підбирати середнє значення в залежності від завантаженості Вашого сервера. Кешування відбувається для того, щоб не створювати кожен раз окремий процес і не вбивати закритий сокет, а залишити їх для подальшого використання. Тип: Integer;
Active - показник того, активний в даних момент сервер, чи ні. Тобто фактично, значення True вказує на те, що сервер працює і готовий до прийому клієнтів, а False - сервер вимкнений. Щоб запустити сервер, потрібно просто привласнити цій властивості значення True. Тип: Boolean;
Port - номер порту для встановлення з'єднань з клієнтами. Порт у сервера і у клієнтів повинні бути однаковими. Рекомендуються значення від тисячу двадцять п'ять до 65535, тому що від 1 до 1024 - можуть бути зайняті системою. Тип: Integer;
Service - рядок, що визначає службу (ftp. Http. Pop. І т.д.), порт якої буде використаний. Це своєрідний довідник відповідності номерів портів різних стандартними протоколами. Тип: string;
Open - Запускає сервер. По суті, ця команда ідентична присвоєння значення True властивості Active;
Close - Зупиняє сервер. По суті, ця команда ідентична присвоєння значення False властивості Active.
OnClientConnect - виникає, коли клієнт встановив сокетних з'єднання і чекає відповіді сервера (OnAccept);
OnClientDisconnect - виникає, коли клієнт від'єднався від сокетного каналу;
OnClientError - виникає, коли поточна операція завершилася невдало, тобто Виникла помилка;
OnClientRead - виникає, коли клієнт передав Бервер будь-які дані. Доступ до цих даних можна отримати через пеаедаваемий параметр Socket: TCustomWinSocket;
OnClientWrite - виникає, коли сервер може відправляти дані клієнта по сокету;
OnGetSocket - в обробнику цієї події Ви можете відредагувати параметр ClientSocket;
OnGetThread - в обробнику цієї події Ви можете визначити унікальний процес (Thread) для кожного окремого клієнтського каналу, присвоївши параметру SocketThread потрібну підзадачу TServerClientThread;
OnThreadStart. OnThreadEnd - виникає, коли подзадача (процес, Thread) запускається або зупиняється, відповідно;
OnAccept - виникає, коли сервер приймає клієнта або відмовляє йому в з'єднанні;
OnListen - виникає, коли сервер переходить в режим очікування під'єднання клієнтів.
TServerSocket.Socket (TServerWinSocket)
Практика і приклади
А тепер розглянемо вищенаведене на конкретному прикладі. Завантажити вже готові вихідні можна, клацнувши тут.
Отже, розглянемо дуже непоганий приклад роботи з TServerSocket (цей приклад - найбільш наочний посібник для вивчення цього компонента). У наведених нижче исходниках демонструється протоколювання всіх важливих подій сервера, плюс можливість приймати і відсилати текстові повідомлення: