Вибір читачів
Популярні статті
Деякі читачі, дивлячись на назву розділу, можуть обуритися і запитати: "А який зв'язок між 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, і вважаю, що її невиправдано забули. А в цьому топіці, я хотів би поділитися з вами досвідом написання чату. Справа ця не дуже складна, але вельми і дуже кумедна.
Введення.
Для написання цього самого чату я використав IDE Borland Delphi 7 Lite збірку. Усі бібліотеки, які знадобилися, вже були включені.
Власне ця частина і є найлегша. Для початку треба обміркувати, як працюватиме наш чат. Я зупинився на ручному виборі порту, адреси сервера і ніку. В принципі, можна самому вибрати порт, і вказати у вихідному коді, але так ми можемо запускати скільки завгодно копій програми в режимі сервера, доки не закінчуються порти. Отже, створюємо чотири поля введення, один елемент типу Memo і три кнопки. Не забудьте додати два сокети, серверний та клієнтський. Пишемо текст на кнопках. Назва програми, значок. І т.д. На цьому перша частина закінчується.
Тут у принципі роботи небагато, але вона вся важлива. Спочатку пишемо код для кнопок. Він знаходиться нижче.
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;
Ця частина є найкоротшою. Додаємо в налаштуваннях проекту ім'я, версію, білд та малюємо іконку.
Також, після деяких пошуків в інтернеті я знайшов такий код для вказівки 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 збірку. Усі бібліотеки, які знадобилися, вже були включені.
Власне ця частина і є найлегша. Для початку треба обміркувати, як працюватиме наш чат. Я зупинився на ручному виборі порту, адреси сервера і ніку. В принципі, можна самому вибрати порт, і вказати у вихідному коді, але так ми можемо запускати скільки завгодно копій програми в режимі сервера, доки не закінчуються порти. Отже, створюємо чотири поля введення, один елемент типу Memo і три кнопки. Не забудьте додати два сокети, серверний та клієнтський. Пишемо текст на кнопках. Назва програми, значок. І т.д. На цьому перша частина закінчується.
Тут у принципі роботи небагато, але вона вся важлива. Спочатку пишемо код для кнопок. Він знаходиться нижче.
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;
Ця частина є найкоротшою. Додаємо в налаштуваннях проекту ім'я, версію, білд та малюємо іконку.
Також, після деяких пошуків в інтернеті я знайшов такий код для вказівки 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;procedure TForm1.Button3Click(Sender: TObject);
begin
ServerSocket1.Port:=65000; // Порт вашого сервера, задаємо будь-який вам сподобатися
ServerSocket1.Active:=True; // активуємо сервер
ServerSocket1.Open; //запускаємо
ShowMessage("Ваш IP: "+GetLocalIP); //видаємо нашу IP адресу, щоб клієнт зміг до нас підключитися
end;
Після того, як сервер був увімкнений, клієнт зможе підключитися до сервера.
Для цього він прописує IP адресу сервера Edit2, І натискає кнопку з'єднатися:
Увага: Клієнт може тільки надсилати повідомлення, а Сервер у свою чергу – приймати Для двостороннього спілкування увімкніть Клієнта та Сервера на двох програмах різного кінця мережі.
Для читання повідомлення, сервер має очікування прийому повідомлення ... ось вона
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Для надсилання повідомлення я написав у двох процедурах. Ось вони:
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;
Статті на тему: | |
Не проходить оплата в додатку Aliexpress - чому і що робити
Навіть у досвідчених користувачів, які здійснюють покупки через інтернет, часто... Безкоштовні файлообмінники - як залити фото та отримати посилання на картинку
Здрастуйте, шановні читачі блогу сайт. Кожен із вас спілкуючись на... Програми шпигуни для комп'ютера
Добре це чи погано, але сучасні реалії такі, що з кожним роком... |