Пишемо чат на Delphi. Робимо примітивний чат на DELPHI. Встановлення необхідних компонентів

У цій темі я хотів би докладно написати як створити найпростіший свій ICQ чат на Delphi!

Що нам для цього потрібно:
1.Delphi (найкраще використовувати 7)
2.Встановлений компонент TICQ.
3. Прямі руки.

Почнемо!
І так створюємо новий проект у Delphi і кидаємо на форму компонентів TICQ.
кидаємо на форму Memo1, EDit1, Edit2, button1, ListBox1, ListBox2.
Пояснення:
Memo1 - лог чату
Edit1 - UIN
Edit2 - password
button1 - підключення
ListBox1 - online user
ListBox2 - reg user

Button1:

Procedure TForm1.Button1Click(Sender: TObject); begin ICQClient1.UIN:=StrToInt(Edit1.Text); ICQClient1.Password:=Edit2.Text; icqclient1.Login(); end;

Подія ICQClient1MessageRecv1 має виглядати так:

Procedure TForm1.ICQClient1MessageRecv1(Sender: TObject; Msg, UIN: String); begin Memo1.Lines.Add(trim(nick(UIN))+": "+Msg); //лог if Msg<>"!" then //якщо повідомлення починається з "!" не кидаємо у чат begin if OnLine(UIN)<>-1 then //перевірка в чаті чи користувач Send(Msg,UIN) //якщо в чаті приймає повідомлення в чат else if Reged(UIN)=-1 then//перевірка на реєстрацію icqclient1.SendMessage(StrToInt(UIN), "ласкаво просимо до чату!" + #13#10 + "для реєстрації введіть!рег<ваш ник>") else begin icqclient1.SendMessage(StrToInt(UIN), "Для входу в чат використовуйте команду!чат" + #13#10 + "Для допомоги надішліть!довідка") //юзер не в чаті! end; end else Command( UIN, Msg); // Команди чату!

Функція OnLine:

Function TForm1.OnLine(UIN:string):integer; var i:integer; begin OnLine:=-1; for i:=0 to ListBox1.Items.Count-1 do if Trim(Copy(ListBox1.Items[i],4,9))=UIN then //Довга уїна OnLine:=i; end;

Надсилання повідомлень у чат:

Procedure TForm1.Send(Msg,UIN:string); var i2:integer; i:integer; Str,Str2:string; begin Str2:=ListBox1.Items; for i:=0 до ListBox1.Items.Count-1 до початку if i2=5 then begin Sleep(2000); i2:=0; end; if OnLine(UIN)<>i then begin i2:=i2+1; Str:=ListBox1.Items[i]; if Trim(Copy(Str,1,2))=Trim(Copy(Str2,1,2)) then icqclient1.SendMessage(StrToInt(Copy(ListBox1.Items[i],4,9)), nick(UIN) +": "+Msg); end; end; end;

Функція Нік:

Function TForm1.nick(UIN:string):string; begin if Reged(UIN)<>-1 then nick:=TRIM(Copy(ListBox2.Items,13,50)) end

Функція Reged:

Function TForm1.Reged(UIN:string):integer; var i:integer; begin Reged:=-1; для i:=0 до ListBox2.Items.Count-1 до if Copy(ListBox2.Items[i],4,9)=UIN then Reged:=i; end;

І на кінець процедура Command (команди чату):

Procedure TForm1.Command(UIN,Msg:string); var i,i1,razdel:integer; command,key,key2:string; Str:string; help: TStrings; begin try razdel:=0; for i:=1 to Length(Msg) до початку help:= TStringList.Create; help.LoadFromFile("command/help.txt"); //Відкрити файл із текстом if (Msg[i]=" ") and (razdel=0) then razdel:=i; end; if razdel<>0 then begin command:=Copy(Msg,1,razdel-1); key:=Copy(Msg,razdel+1,Length(Msg)); key2:=Copy(Msg,razdel+1,Length(Msg)); end else begin command:=Msg; key:=""; end; if (command="!чат") or (command="!chat") then begin ListBox1.Items.Append(ListBox2.Items); icqclient1.SendMessage(StrToInt(UIN), "ви увійшли"); end; if (command = "!help") або (command = "!довідка") then begin if OnLine(UIN)<>-1 then begin icqclient1.SendMessage(StrToInt(UIN), help.Text); end else icqclient1.SendMessage(StrToInt(UIN), "Щоб використовувати команди увійдіть до чату!"); end; //end; if (command="!вихід") or (command = "!Вихід") or (command = "!вихід") then begin ListBox1.Items.Delete(OnLine(UIN)); end; if (command="!рег") or (command="!нік") or (command="!РЕГ") and (key<>"") then begin if Reged(UIN)<>-1 then icqclient1.SendMessage(StrToInt(UIN), "Ви вже зареєстровані в чаті!:)") else if (Length(Trim(key))>15) then icqclient1.SendMessage(StrToInt(UIN), "Занадто довгий нік , Він повинен бути довжиною більше 3 і менше 15 символів, не повинен зберігати пробілів") else if (Length(Trim(key))<3) then icqclient1.SendMessage(StrToInt(UIN), "Слишком короткий ник, Он должен быть длинной,больше 3 и менее 15 символов, не должен сожержать пробелов") else //if (Length(Trim(UIN))<9) then //icqclient1.SendMessage(StrToInt(UIN), "Ваш уин не подходит для регистрации!") //else begin ListBox2.Items.Append("0 "+UIN+" "+Trim(Key)); icqclient1.SendMessage(StrToInt(UIN), "Вы успешно зарегистрировались!Для входа в чат наберите!чат"); ListBox2.Items.SaveToFile("user/user.txt"); end; end; //end; except end; end;

Деякі читачі, дивлячись на назву розділу, можуть обуритися і запитати: "А який зв'язок між X-Coding і простим чатом?" У принципі зв'язку немає. Чат – це проста програма, що працює з мережею. Я знаю, що не можна все підводити під один гребінець, і якщо якась утиліта використовує мережу, то це ще не означає, що вона хакерська. Але все ж таки я опишу тут створення чату, тому що ми побудуємо його принципово на іншому протоколі, ніж зазвичай. У жодному разі зайвими ці знання не будуть.

Але про чат ми поговоримо трохи пізніше, а зараз трохи теорії.

На даний момент існує два основних протоколи: TCP та UDP. Раніше був дуже поширений IPX, який використовувала фірма Novell. Але зараз він відходить, і вже рідко побачиш такого звіра. Тільки на старих системах можна побачити IPX. Більшість інших протоколів, які ви знаєте (FTP, HTTP, РОРЗ, SMTP і далі так само), працюють поверх TCP або UDP.

Що це означає: "поверх іншого протоколу"? У TCP реалізовані основні функції до роботи з мережею. Він вміє встановлювати з'єднання з віддаленим комп'ютером, передавати та приймати дані перевіряти правильність отримання сервером відправлених пакетів. Нехай ми хочемо створити протокол передачі файлів (FTP). Для цього ми беремо TCP, наділяємо його потрібними нам можливостями і отримайте-розпишіться. Ось і виходить, що FTP працює через (поверх) протоколу TCP. Якщо ми захочемо створити FTP із чистого аркуша, то нам доведеться заново реалізовувати функції встановлення з'єднання та передачі даних. А так потрібно лише підготувати дані у спеціальному форматі (протоколу FTP) та віддати їх протоколу TCP, який сам встановить з'єднання та віддасть ці дані куди треба.

Якщо ви знайомі з Delphi не з чуток і хоч трохи розібралися в теорії ООП, то вже помітили аналогію з об'єктно-орієнтованим програмуванням. Саме за таким принципом і працює мережа. Вся ця справа стандартизована, і якщо хочете дізнатися докладніше, то почитайте якусь документацію про модель OSI (Open Systems Interconnection) та її сім рівнів (тут знову можу надіслати на свій сайт або див. розд. 4.1 цієї книги). Ця тема є досить цікавою, і в будь-якому випадку бажано знати пристрій протоколів.

Протокол UDP дуже схожий TCP. У ньому так само реалізовані можливості передачі даних, але він не встановлює з'єднання і не підтримує цілісності даних, що передаються. Протокол просто відкриває порт, викидає туди порцію даних і навіть не переймається тим, дійшли вони до одержувача, чи ні. Тому UDP працює набагато швидше, ніж TCP.

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

У Delphi для роботи з добре підходить бібліотека

Я думаю, що незабаром вона стане вашим найкращим другом.

З теорією покінчено, переходьте до написання чату. Розімніть пальці, мишку, клавіатуру і запустіть Delphi. Зараз ми приступимо до мого улюбленого заняття – програмування. На формі нам знадобляться 3 компоненти.

□ Компонент тмето. Його можна розтягнути майже за всією формою.

□ Компонент TEdit, в який ми будемо писати повідомлення.

□ Кнопка TButton, при натисканні якої повідомлення надсилатиметься. На рис. 4.21 показано форму майбутнього чату.

Для роботи з портами нам потрібні компоненти idUDPClient (уміє відсилати дані, рис. 4.22) із закладки Indy Clients та idUDPServer (уміє отримувати дані, рис. 4.23) із закладки My Servers. Перенесіть по одному компоненту на форму.

Рис, 4.22. Властивості компонента idUDPCiient

Мал. 4.23. Властивості компонента idUDPServer

Тепер потрібно налаштувати протокол і Р. Перше, що ми зробимо - виберемо будь-який порт від 1 до 65 000, через який відбуватиметься зв'язок. Я вирішив вибрати 11245 (ви можете вибрати будь-яке інше). Призначте це значення властивості Port компонента idUDpc lient та властивості De fault Port компонента idUDPServer. Це змусить клієнта і сервер працювати одному й тому порту, що потрібно роботи зв'язку.

ПАМ'ЯТАЙТЕ!!! Порти UDP не перетинаються з портами TCP. Це означає, що ТСР-порт 80 не дорівнює UDP-порту 80.

Тепер у клієнта (idüDPCilent) потрібно вказати властивість Host. Сюди записується IP-адреса комп'ютера, якому надсилатимуться повідомлення. Але у нас чат та повідомлення повинні отримувати всі користувачі у сітці, що запустили програму. Тому, щоб не було проблем, бажано встановити обидва компоненти ЖЙТВЕ BroadcastEnabled рівним true. А Замість конкретної IP-адреси використовувати широкомовну (таку адресу, яку отримують усі). Якщо у вас у сітці використовуються адреси типу 192,168,100.x, то для вас широкомовна адреса буде 192.168.100.255 (останній октет змінюємо на 255).

Приготування закінчено, можна програмувати.

Створіть обробник події кнопки та напишіть там наступний код:

Procedure TForml.ButtonlClick(Sender: TObject); begin IdUDPClientl.Send(Editl.Text); end;

Тут лише один рядок, який відправляє за допомогою UDP-клієнта вміст рядка введення (компонента

Тепер потрібно навчити UDP-сервер отримувати цю інформацію. Для цього створіть обробник події OnUDPRead для компонента idUDPServer. У ньому напишіть таке:

Procedure TForml. IdODPSserverlüDPRead (Sender: TObject; ÄEata: TStream; ABrnding: TIdSocketHandle);

var StringFormatedStream: TStringStream; s: String; begin //Ініціалізація

StringFormatedStream: = TStringStream.Create(""); //Копіювання з простого потоку в рядковий StringFormatedStream.CopyFrom(AData, AData.Size);

//Виведення отриманого повідомлення

Memol.Lines.Add(ABinding.PeerIP+" "+StringFormatedStream.DataString);

ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s, Length(s)); //Звільнення рядкового потоку StringFormatedStream.Free; end;

У процедури-обробника події є три параметри. Перший є присутнім у всіх оброблювачах і нічого цікавого для нас у собі не несе. Другий – це дані, які отримані з мережі. Третій – у ньому зберігається інформація про те, звідки прийшли дані.

Отже, отримані дані зберігаються у другому параметрі. Вони приходять до нас як простий неформатований потік TStream. Щоб зручніше було працювати з даними, краще перегнати їх у рядковий потік Ви думаєте, це незручно? А раптом ви передаєте не текст, а картинку і компонент відформатує її в текст? Оце вже буде не незручно, а повний облом!

Подивіться, як легко все перетворюється на текст. У обробнику оголошено одну Змінну StringFormatedStream типу TStringStream (рядковий потік). Першим рядком коду вона ініціалізується. У другому рядку дані із простого неформатованого потоку копіюються в рядковий потік. Все! Тепер переданий текст знаходиться у властивості Datastring рядкового ГОДОКУ StringFormatedStream. Після цього межею сміливо виводити цей результат у компоненті Memo.


Рис.4.24. Чат у дії

Але ж ми пишемо чат, і бажано ще вивести інформацію про те, хто передав цей текст. Для прикладу виводиться IP-адреса відправника даних, яка знаходиться у властивості реєстру третього параметра ABinding. Але це тільки для прикладу, і в реальній програмі це виглядатиме некрасиво. Про що це пан 192.168.100.x каже? А може, це навіть пані каже. Тому ви можете додавати ім'я відправника одразу до тексту відправки. Код зміниться так:

IdUDPClisntl. Send ("Сюди помісти ім'я відправника" Editl.Text); Можна дати можливість користувачеві вводити ім'я в окремому рядку Edit2. У цьому випадку код буде таким; IdUDPClisntl.Send(Edit2.Text+" "+Editl.Text);

На компакт-диску директорії \Приклади\Глава 4\Chat ви можете побачити приклад цієї програми.

new player 4 липня 2012 в 18:26

Пишемо свій ведосипед на Delphi

  • Чулан *

Доброго дня, Хабраюзер. Скажу чесно, я люблю мову Delphi, і вважаю, що її невиправдано забули. А в цьому топіці, я хотів би поділитися з вами досвідом написання чату. Справа ця не дуже складна, але вельми і дуже кумедна.

Введення.

Для написання цього самого чату я використав IDE Borland Delphi 7 Lite збірку. Усі бібліотеки, які знадобилися, вже були включені.

Частина I. Пишемо інтерфейс.

Власне ця частина і є найлегша. Для початку треба обміркувати, як працюватиме наш чат. Я зупинився на ручному виборі порту, адреси сервера і ніку. В принципі, можна самому вибрати порт, і вказати у вихідному коді, але так ми можемо запускати скільки завгодно копій програми в режимі сервера, доки не закінчуються порти. Отже, створюємо чотири поля введення, один елемент типу Memo і три кнопки. Не забудьте додати два сокети, серверний та клієнтський. Пишемо текст на кнопках. Назва програми, значок. І т.д. На цьому перша частина закінчується.

Частина 2. Начинки.

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

procedure TForm1. Button1Click (Sender: TObject);
begin
button2. Enabled: = false; // Відключаємо кнопку сервера
Clsocket. address: = edit1. Text;
Clsocket. Port: = StrtoInt (edit2. Text); //Записуємо порт, та IP
Clsocket. Active: = true; //Включаємо сокет
Clsocket. Open; // Відкриваємо його
button3. enabled: = true; //Розблокуємо кнопку відправити
end;

І приблизно так само всі інші кнопки.

Для полів уведення нічого не треба.

Окремо я хочу розглянути написання коду для кнопки відправки повідомлення, оскільки він дуже важливий.

procedure TForm1. Button3Click (Sender: TObject);
var f: integer; today: TdateTime;
begin
today: = now; //Дізнаємо час
s1: = edit4. Text; //Формуємо рядок з ніком та часом відправлення
s2: = edit3. Text;
s3: = "[" + s2+ "] (" + TimetoStr (today) + ") :" + s1; //Склеюємо всі разом
якщо clsocket. active = true then
ClSocket. Socket. SendText (s3) // Відправляємо на сервер рядок
else
begin
for f: = 0 до SrSocket. Socket. ActiveConnections - 1 do // Відправляємо від імені сервера всім клієнтам
begin
Srsocket. Socket. Connections [f]. SendText (s3);
end;
Memo1. lines . add (s3); // Записуємо собі термін чату
end;
edit4. text: = "";
end;

І нарешті, пишемо код підключення \ відключення \ прийому повідомлення. Тут важливо не забути прив'язати івенти до процедур.

procedure TForm1. SrsocketClientRead (Sender: TObject;

var i: integer;
begin
Recieved: = Socket. ReceiveText(); //Переносимо прийнятий текст у змінну
for i: = 0 до SrSocket. Socket. ActiveConnections - 1 do // Відправляємо прийняту інформацію всім підключеним клієнтам
Srsocket. Socket. Connections [i] . SendText (Recieved);
memo1. Лінії . add (Recieved); //Записуємо собі
end;

procedure TForm1. SrSocketClientDisconnect (Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1. Лінії . Add ( "Клієнт від'єднався") ; //Просто повідомляємо сервер
end;

procedure TForm1. SrSocketClientConnect (Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1. Лінії . Add ( "Клієнт підключився") ;
end;

Частина 3. Фінальні випробування.

Ця частина є найкоротшою. Додаємо в налаштуваннях проекту ім'я, версію, білд та малюємо іконку.

Також, після деяких пошуків в інтернеті я знайшов такий код для вказівки IP адреси, і включив його в свій чат.

function GetLocalIP: String ;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0.. 127] of Char;
begin
Result: = "";
if WSAStartup(WSVer, wsaData) = 0 then begin //Не хочу тут щось коментувати, т.к. до кінця сам не впевнений, як це працює
if GetHostName(@ Buf, 128 ) = 0 then begin
P: = GetHostByName(@ Buf);
if P<>nil then
Result : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
end;
WSACleanup;
end;
end;

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

Вдалого дня!

Теґи: Delphi, програмування

Доброго дня, Хабраюзер. Скажу чесно, я люблю мову Delphi, і вважаю, що її невиправдано забули. А в цьому топіці, я хотів би поділитися з вами досвідом написання чату. Справа ця не дуже складна, але вельми і дуже кумедна.

Введення.

Для написання цього самого чату я використав IDE Borland Delphi 7 Lite збірку. Усі бібліотеки, які знадобилися, вже були включені.

Частина I. Пишемо інтерфейс.

Власне ця частина і є найлегша. Для початку треба обміркувати, як працюватиме наш чат. Я зупинився на ручному виборі порту, адреси сервера і ніку. В принципі, можна самому вибрати порт, і вказати у вихідному коді, але так ми можемо запускати скільки завгодно копій програми в режимі сервера, доки не закінчуються порти. Отже, створюємо чотири поля введення, один елемент типу Memo і три кнопки. Не забудьте додати два сокети, серверний та клієнтський. Пишемо текст на кнопках. Назва програми, значок. І т.д. На цьому перша частина закінчується.

Частина 2. Начинки.

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

procedure TForm1. Button1Click (Sender: TObject);
begin
button2. Enabled: = false; // Відключаємо кнопку сервера
Clsocket. address: = edit1. Text;
Clsocket. Port: = StrtoInt (edit2. Text); //Записуємо порт, та IP
Clsocket. Active: = true; //Включаємо сокет
Clsocket. Open; // Відкриваємо його
button3. enabled: = true; //Розблокуємо кнопку відправити
end;

І приблизно так само всі інші кнопки.

Для полів уведення нічого не треба.

Окремо я хочу розглянути написання коду для кнопки відправки повідомлення, оскільки він дуже важливий.

procedure TForm1. Button3Click (Sender: TObject);
var f: integer; today: TdateTime;
begin
today: = now; //Дізнаємо час
s1: = edit4. Text; //Формуємо рядок з ніком та часом відправлення
s2: = edit3. Text;
s3: = "[" + s2+ "] (" + TimetoStr (today) + ") :" + s1; //Склеюємо всі разом
якщо clsocket. active = true then
ClSocket. Socket. SendText (s3) // Відправляємо на сервер рядок
else
begin
for f: = 0 до SrSocket. Socket. ActiveConnections - 1 do // Відправляємо від імені сервера всім клієнтам
begin
Srsocket. Socket. Connections [f]. SendText (s3);
end;
Memo1. lines . add (s3); // Записуємо собі термін чату
end;
edit4. text: = "";
end;

І нарешті, пишемо код підключення \ відключення \ прийому повідомлення. Тут важливо не забути прив'язати івенти до процедур.

procedure TForm1. SrsocketClientRead (Sender: TObject;

var i: integer;
begin
Recieved: = Socket. ReceiveText(); //Переносимо прийнятий текст у змінну
for i: = 0 до SrSocket. Socket. ActiveConnections - 1 do // Відправляємо прийняту інформацію всім підключеним клієнтам
Srsocket. Socket. Connections [i] . SendText (Recieved);
memo1. Лінії . add (Recieved); //Записуємо собі
end;

procedure TForm1. SrSocketClientDisconnect (Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1. Лінії . Add ( "Клієнт від'єднався") ; //Просто повідомляємо сервер
end;

procedure TForm1. SrSocketClientConnect (Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1. Лінії . Add ( "Клієнт підключився") ;
end;

Частина 3. Фінальні випробування.

Ця частина є найкоротшою. Додаємо в налаштуваннях проекту ім'я, версію, білд та малюємо іконку.

Також, після деяких пошуків в інтернеті я знайшов такий код для вказівки IP адреси, і включив його в свій чат.

function GetLocalIP: String ;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0.. 127] of Char;
begin
Result: = "";
if WSAStartup(WSVer, wsaData) = 0 then begin //Не хочу тут щось коментувати, т.к. до кінця сам не впевнений, як це працює
if GetHostName(@ Buf, 128 ) = 0 then begin
P: = GetHostByName(@ Buf);
if P<>nil then
Result : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
end;
WSACleanup;
end;
end;

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

Вдалого дня!

Теґи: Delphi, програмування


Думаю вам неодноразово приходила ідея створити свій (корпоративний) чат. Така ж ідея прийшла і мені, і я як завжди почав шукати інформацію в інтернеті, але таки нічого хорошого і не знайшов. Все як не повно описує як це можна зробити.

І я собі обіцяв, як вивчу так викладу повну інформацію з цієї теми. Я робив свій чат на сокетах. По них можна спілкуватися, як у мережі інтернет, і по локальної мережі. Для цього вам достатньо знати IP адресу. Програмував Delphi7.

Встановлення необхідних компонентів

Так як я робив на delphi7, там не було за замовчуванням компонентів, які мені потрібні. ( ServerSocket1, ClientSocket1).
Для цього необхідно додати компоненти Сокета.

У меню заходимо Component --> Install Packages…--> Add --> dclsockets70.bpl

І вказуємо шлях до пакету з компонентами, він знаходиться у кореневому папці Delphi у паку Bin. У мене він знаходився в:

C:\Program Files\Borland\Delphi7\Bin\ dclsockets70.bpl

Після такого додавання у вас на вкладці Internet повинні з'явитися дані компоненти.

Розміщення компонентів та написання коду

На форму я кинув такі елементи: ServerSocket1, ClientSocket1, Edit1 (для чату), Edit2 (для IP адреси сервера), Memo1 для відображення повідомлення, та 3 кнопки.

Для створення Сервера пишемо на подію в кнопці таку річ:

function GetLocalIP: String;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array of Char;
begin
Result:= "";
if WSAStartup(WSVer, wsaData) = 0 then begin
if GetHostName(@Buf, 128) = 0 then begin
P:= GetHostByName(@Buf);
if P<> nil then
Result:= iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end;
WSACleanup;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ServerSocket1.Port:=65000; // Порт вашого сервера, задаємо будь-який вам сподобатися
ServerSocket1.Active:=True; // активуємо сервер
ServerSocket1.Open; //запускаємо
ShowMessage("Ваш IP: "+GetLocalIP); //видаємо нашу IP адресу, щоб клієнт зміг до нас підключитися
end;

Після того, як сервер був увімкнений, клієнт зможе підключитися до сервера.
Для цього він прописує IP адресу сервера Edit2, І натискає кнопку з'єднатися:

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Address:=Edit2.Text; // IP адреса сервера
ClientSocket1.Port:=65000; //його порт
ClientSocket1.Active:=True; //активуємо клієнта
ClientSocket1.Open; //запускаємо
end;

Увага: Клієнт може тільки надсилати повідомлення, а Сервер у свою чергу – приймати Для двостороннього спілкування увімкніть Клієнта та Сервера на двох програмах різного кінця мережі.

Для читання повідомлення, сервер має очікування прийому повідомлення ... ось вона

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.add(Socket.RemoteAddress+": ");
memo1.Lines.add(Socket.ReceiveText);
StatusBar1.Panels.Items.Text:=Socket.RemoteAddress;
end;

Для надсилання повідомлення я написав у двох процедурах. Ось вони:

procedure TForm1.SendMes(Text: String);
begin
if form1.ServerSocket1.Active then
if form1.ServerSocket1.Socket.ActiveConnections>0 then
form1.ServerSocket1.Socket.Connections.SendText(Text);

if form1.ClientSocket1.Active then
form1.ClientSocket1.Socket.SendText(Text);
end; procedure TForm1.Button1Click(Sender: TObject);
begin
SendMes(Edit1.Text);
memo1.Lines.add(GetLocalIP+": ");
memo1.Lines.add(Edit1.Text);
end;



gastroguru 2017