Майстри delphi, приклад чату на основі сокетів (документація, вихідні коди, скачати)

Приклад чату на основі сокетів

Всім відомо, що довідковий матеріал - це добре. Але вивчення майже будь-якого питання набагато легше, якщо розглядати його на прикладах. Тому метою даної статті, на відміну від попередніх на цю тему, буде вивчення різних методів і прийомів роботи з сокетами на наочному прикладі.

Тут ми розглянемо практичний приклад додатка-чату для локальної мережі.

Чат для локальної мережі

Розглянемо досить простий приклад чату для локальної мережі. У цьому прикладі два додатки - чат-сервер і чат-клієнт. Чат-клієнти підключаються до сервера миттєвих і через нього обмінюються повідомленнями. Чат-сервер може бути запущений і на тому комп'ютері, де запущено один з клієнтів. Крім того, для тестування Ви можете запустити на своєму комп'ютері відразу чат-сервер і декілька чат-клієнтів. Для цього потрібно вказати localhost в поле Host. а в поле Port у сервера і у клієнта повинні бути однакові значення. Не плутайте сервер в розумінні програми, що приймає виклики клієнтів, з комп'ютером-сервером! Те ж саме і з клієнтом.

Вихідні тексти обох додатків (чат-сервера і чат-клієнта) Ви можете завантажити, натиснувши тут. Цей приклад зроблений на Borland Delphi 5. Однак, код буде працювати в будь-якій версії Дельфі, де є компоненти TServerSocket і TClientSocket. У більш ранніх версіях можливі проблеми з відкриттям форм, але їх легко зробити самому, тому що тут наведені скріншоти цих прикладів.

Щоб подивитися цей приклад, скачайте його вихідні коди, відкомпілюйте обидва проекти, запустіть srv_ex.exe. в його вікні натисніть кнопку Start. У вікні запиту потрібно вказати порт, на якому буде працювати сервер. Значення за замовчуванням - 1001.

Ну а тепер розберемо вихідний код чат-сервера:

Отже, що ж робить даний код? Button1Click і Button2Click - думаю, зрозуміло, що вони запускають і зупиняють сервер відповідно. Додаткового розгляду вимагає ServerSocket1ClientRead.

Далі, в рядок s (інформація в якій вже не потрібна) записуємо команду "#U" і послідовно всіх користувачів зі списку ListBox1. Потім всю цю рядок розсилаємо ВСІМ клієнтам.

Потім, якщо ми отримали не "#N", а "#M" або "#P" (просте або приватне повідомлення) - розсилаємо його всім клієнтам (а вони вже розберуться, кому це повідомлення :-)).

ServerSocket1ClientDisconnect - обробник події, що виникає коли хто-небудь з клієнтів від'єднався від сервера. Тут ми очищаємо список користувачів і посилаємо всім клієнтам запити на отримання їх ників (псевдонімів).

ПРИМІТКА. Даний приклад максимально спрощений, щоб просто була зрозуміла технологія створення подібних додатків. Можливості нормального чату повинні бути набагато ширше. Також майте на увазі, що команди типу "#N", "#U", "#M", і т.д. вводяться самим розробником просто щоб визначити, що надіслали з сокета. Ці команди ніяк не прив'язані непостредственно до сокета.

Далі наведемо вихідний текст чат-клієнта з необхідними поясненнями:

Спочатку ми зберігаємо отримані по сокету дані в рядок s. Потім, якщо нам прислали список інших підключених клієнтів, то ми виділяємо з рядка s по одному користувачеві і додаємо їх послідовно в ListBox1. Таким чином ListBox1 стає списком користувачів.

Далі - якщо нам прислали команду "#M" - звичайне повідомлення, то ми виділяємо з s відправника і саме повідомлення, а потім все це в стандартній для чатів формі виводимо в Memo1.

Якщо ж було отримано запит на ім'я користувача (нік) - команда "#N", то посилаємо сервера свій нік.

Edit1KeyDown потрібен для того, щоб замість натискання кнопки Button1 кожен раз, коли потрібно відправити повідомлення, просто натискати Enter.

Карих Микола. (Nitro) Київська область, Жуковський