Biz Delphida chat yozamiz. DELPHI da ibtidoiy chat qilish. O'rnatish shartlari

Bu mavzuda men Delphida eng oddiy ICQ chatini qanday yaratishni batafsil yozmoqchiman!

Buning uchun bizga nima kerak:
1.Delphi (7 eng yaxshisi)
2. O'rnatilgan TICQ komponenti.
3. To'g'ri qo'llar.

Qani boshladik!
Shunday qilib, biz Delphida yangi loyiha yaratamiz va TICQ komponentini formaga tashlaymiz.
Formaga Memo1, EDit1,Edit2,button1,ListBox1,L istBox2 ni tashlaymiz.
Tushuntirish:
Memo1 - suhbatlar jurnali
Edit1 - UIN
Edit2 - parol
tugma 1 - ulanish
ListBox1 - onlayn foydalanuvchi
ListBox2 - reg foydalanuvchisi

1-tugma:

Protsedura TForm1.Button1Click(Sender: TObject); start ICQClient1.UIN:=StrToInt(Edit1.Text); ICQClient1.Password:=Edit2.Text; icqclient1.Login(); oxiri;

ICQClient1MessageRecv1 hodisasi quyidagicha ko'rinishi kerak:

Protsedura TForm1.ICQClient1MessageRecv1(Sender: TObject; Msg, UIN: String); begin Memo1.Lines.Add(trim(nick(UIN))+": "+Msg); // agar xat bo'lsa jurnalga kiring<>"!" keyin //agar xabar "!" bilan boshlansa. Agar OnLine(UIN) ni chatga kiritmang<>-1 keyin //foydalanuvchining chatda ekanligini tekshirish Send(Msg,UIN) //agar chatda bo'lsa, u holda chatda xabarlarni qabul qiladi, agar Reged(UIN)=-1 bo'lsa//ro'yxatdan o'tishni tekshirish icqclient1.SendMessage( StrToInt(UIN), "suhbatga xush kelibsiz" + #13#10 + "ro'yxatdan o'tish uchun kiring!reg<ваш ник>") else begin icqclient1.SendMessage(StrToInt(UIN), "Chatga kirish uchun buyruqdan foydalaning!chat" + #13#10 + "Yordam uchun, send! help") //foydalanuvchi chatda emas! end ; end else Buyruq (UIN, Msg //chat buyruqlari);

Onlayn funksiya:

Funktsiya TForm1.OnLine(UIN:string):integer; var i:integer; Onlayn boshlash:=-1; i:=0 to ListBox1.Items.Count-1 uchun bajaring, agar Trim(Copy(ListBox1.Items[i],4,9))=UIN keyin //UIN uzunligi OnLine:=i; oxiri;

Chatga xabar yuborish:

Protsedura TForm1.Send(Msg,UIN:string); var i2:integer; i:integer; Str,Str2:string; start Str2:=ListBox1.Items; for i:=0 to ListBox1.Items.Count-1 agar i2=5 bo'lsa, keyin Sleep(2000) boshlanadi; i2:=0; oxiri; Agar OnLine (UIN)<>keyin i2:=i2+1 ni boshlayman; Str:=ListBox1.Items[i]; agar Trim(Copy(Str,1,2))=Trim(Copy(Str2,1,2)) keyin icqclient1.SendMessage(StrToInt(Copy(ListBox1.Items[i],4,9)), nick(UIN) +": "+xabar); oxiri; oxiri; oxiri;

Nik funktsiyasi:

Funktsiya TForm1.nick(UIN:string):string; Agar Reged boshlanadi (UIN)<>-1 keyin nik:=TRIM(Copy(ListBox2.Items,13,50)) end

Reged funktsiyasi:

Funktsiya TForm1.Reged(UIN:string):integer; var i:integer; beginReged:=-1; for i:=0 to ListBox2.Items.Count-1 agar Copy(ListBox2.Items[i],4,9)=UIN keyin Reged:=i; oxiri;

Va nihoyat Buyruqning protsedurasi (chat buyruqlari):

Protsedura TForm1.Command(UIN,Msg:string); var i,i1,razdel:integer; buyruq, kalit, kalit2: string; Str:string; yordam: TStrings; sinash bo'limini boshlang:=0; for i:=1 to Length(Msg) uchun yordamni boshlang:= TStringList.Create; help.LoadFromFile("command/help.txt"); //Matnli faylni oching, agar (Msg[i]=" ") va (razdel=0) keyin razdel:=i; oxiri; bo'lsa<>0 keyin start buyrug'i:=Copy(Msg,1,razdel-1); kalit:=Nusxalash(Msg,razdel+1,Length(Msg)); key2:=Nusxalash(Msg,razdel+1,Length(Ssg)); end else begin buyrug'i:=Msg; kalit:=""; oxiri; agar (command="!chat") yoki (buyruq = "!chat") bo'lsa, ListBox1.Items.Append(ListBox2.Items) boshlang; icqclient1.SendMessage(StrToInt(UIN), "siz tizimga kirgansiz"); oxiri; agar (buyruq = "!yordam") yoki (buyruq = "!yordam") agar OnLine(UIN) bo'lsa, boshlang<>-1 keyin icqclient1.SendMessage(StrToInt(UIN), help.Text) ni boshlang; end else icqclient1.SendMessage(StrToInt(UIN), "Buyruqlardan foydalanish uchun chatga kiring!"); oxiri; //oxiri; agar (command="!exit") yoki (buyruq = "!Chiqish") yoki (buyruq = "!EXIT") keyin ListBox1.Items.Delete(OnLine(UIN)) boshlang; oxiri; agar (buyruq="!reg") yoki (buyruq="!nick") yoki (buyruq="!REG") va (kalit)<>"") keyin Reged (UIN) bo'lsa, boshlang<>-1 keyin icqclient1.SendMessage(StrToInt(UIN), "Siz allaqachon chatda ro'yxatdan o'tgansiz!:)") aks holda (Length(Trim(key))>15) keyin icqclient1.SendMessage(StrToInt(UIN), "Nikk juda uzun , U 3 dan ortiq va 15 ta belgidan kam boʻlishi va boʻsh joy boʻlmasligi kerak") aks holda (Length(Trim(tugma))<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;

Ba'zi o'quvchilar bo'lim sarlavhasiga qarab, g'azablanib: "X-kodlash va oddiy suhbat o'rtasida qanday bog'liqlik bor?" Umuman olganda, hech qanday aloqa yo'q. Chat - bu tarmoq bilan ishlaydigan oddiy dastur. Bilaman, siz hamma narsani bitta cho'tka ostiga qo'ya olmaysiz va agar biron bir yordamchi dastur tarmoqdan foydalansa, bu uning xaker ekanligini anglatmaydi. Ammo baribir, men bu erda chatning yaratilishini tasvirlab beraman, chunki biz uni odatdagidan tubdan boshqacha protokol asosida quramiz. Har holda, bu bilim ortiqcha bo'lmaydi.

Ammo biz suhbat haqida biroz keyinroq gaplashamiz, lekin hozir biroz nazariya.

Hozirgi vaqtda ikkita asosiy protokol mavjud: TCP va UDP. Ilgari IPX hali ham juda keng tarqalgan edi, bu Novell tomonidan ishlatilgan. Ammo hozir u uzoqlashmoqda va siz bunday hayvonni kamdan-kam ko'rasiz. Faqat eski tizimlarda siz IPXni ko'rishingiz mumkin. Siz bilgan boshqa protokollarning aksariyati (FTP, HTTP, POP3, SMTP va boshqalar) TCP yoki UDP ustida ishlaydi.

Bu nimani anglatadi: "boshqa protokol ustida"? TCP tarmoq bilan ishlash uchun asosiy funktsiyalarni amalga oshiradi. U masofaviy kompyuter bilan aloqa o'rnatishi, ma'lumotlarni uzatishi va qabul qilishi va server yuborilgan paketlarni to'g'ri qabul qilganligini tekshirishi mumkin. Aytaylik, biz fayl uzatish protokoli (FTP) yaratmoqchimiz. Buning uchun biz TCP ni olamiz, unga kerakli imkoniyatlarni beramiz va uni olamiz - imzolaymiz. Shunday qilib, FTP TCP protokoli orqali (yuqorida) ishlaydi. Agar biz FTPni noldan yaratmoqchi bo'lsak, ulanishni sozlash va ma'lumotlarni uzatish funksiyalarini qaytadan amalga oshirishimiz kerak bo'ladi. Va shuning uchun siz faqat ma'lumotlarni maxsus formatda (FTP protokoli) tayyorlashingiz va uni TCP protokoliga berishingiz kerak, u o'zi ulanishni o'rnatadi va bu ma'lumotlarni kerakli joyga yuboradi.

Agar siz Delphi bilan bevosita tanish bo'lsangiz va OOP nazariyasi haqida ozgina ma'lumotga ega bo'lsangiz, unda siz ob'ektga yo'naltirilgan dasturlash bilan o'xshashlikni allaqachon payqadingiz. Tarmoq aynan shu tamoyil asosida ishlaydi. Bularning barchasi standartlashtirilgan va agar siz ko'proq ma'lumotga ega bo'lishni istasangiz, OSI (Ochiq tizimlar o'zaro bog'lanishi) modeli va uning etti darajasi haqida ba'zi hujjatlarni o'qing (bu erda men uni yana veb-saytimga yuborishim mumkin yoki ushbu kitobning 4.1-bo'limiga qarang). Bu mavzu juda qiziq va har holda protokollar tuzilishini bilish maqsadga muvofiqdir.

UDP protokoli TCP ga juda o'xshaydi. Shuningdek, u ma'lumotlarni uzatish imkoniyatlarini amalga oshiradi, lekin u ulanishlarni o'rnatmaydi va uzatilgan ma'lumotlarning yaxlitligini saqlamaydi. Protokol shunchaki portni ochadi, ma'lumotlarning bir qismini u erga tashlaydi va u qabul qiluvchiga etib boradimi yoki yo'qmi, deb o'ylamaydi. Shuning uchun UDP TCP ga qaraganda ancha tezroq.

Agar siz ushbu protokol bilan ishlashni istasangiz, ma'lumotlarni qabul qilishning to'g'riligini tekshirishni o'zingiz amalga oshirishingiz kerak bo'ladi. Shuning uchun, fayllarni yoki boshqa katta ma'lumotlarni uzatish uchun siz TCP ni tanlashingiz kerak, chunki faylning kichik bir qismi ham yo'qolsa, u tiklanmaydi. Xo'sh, bugun biz yozadigan suhbat uchun UDP qulayroq variant bo'ladi. Bu kichik xabar o'lchamlari uchun juda tez va juda samarali.

Delphida kutubxona ishlash uchun juda mos keladi

O'ylaymanki, u tez orada sizning eng yaxshi do'stingizga aylanadi.

Nazariya tugadi, suhbatni yozishga o'tamiz. Barmoqlaringizni, sichqonchani, klaviaturani cho'zing va Delphi-ni ishga tushiring. Endi biz sevimli mashg'ulotim - dasturlashni boshlaymiz. Shaklda bizga 3 ta komponent kerak bo'ladi.

□ Tmeto komponenti. U deyarli butun shaklga cho'zilishi mumkin.

□ TEdit komponenti, unga biz yuboriladigan xabarni yozamiz.

□ TB tugmasi bosilganda xabar yuboriladi. Shaklda. 4.21-rasmda kelajakdagi suhbat shakli ko'rsatilgan.

Portlar bilan ishlash uchun Indy Clients yorlig'idan idUDPClient komponentlari (ma'lumotlarni yuborishi mumkin, 4.22-rasm) va "Mening serverlarim" yorlig'idan idUDPServer (ma'lumotlarni qabul qilishi mumkin, 4.23-rasm) kerak. Bunday komponentlardan birini formaga o'tkazing.

4.22-rasm. idUDPCiient komponentining xususiyatlari

Guruch. 4.23. idUDPServer komponentining xususiyatlari

Endi biz protokolni va O R ni sozlashimiz kerak. Biz qiladigan birinchi narsa aloqa sodir bo'ladigan 1 dan 65 000 gacha bo'lgan istalgan portni tanlashdir. Men 11245 ni tanlashga qaror qildim (siz boshqasini tanlashingiz mumkin). Ushbu qiymatni idUDpc mijoz komponentining Port xususiyatiga va idUDPServer komponentining Default Port xususiyatiga belgilang. Bu mijoz va serverni aloqa ishlashi uchun zarur bo'lgan bir xil portda ishlashga majbur qiladi.

UNDA OLING!!! UDP protokoli portlari TCP portlari bilan bir-biriga mos kelmaydi. Bu shuni anglatadiki, TCP 80 porti UDP 80 portiga teng emas.

Endi mijoz (idüDPCilent) Xost xususiyatini ko'rsatishi kerak. Xabarlar yuboriladigan kompyuterning IP-manzili bu yerda qayd etilgan. Ammo bizning suhbatimiz va xabarlarimiz dasturni ishga tushirgan tarmoqdagi barcha foydalanuvchilar tomonidan qabul qilinishi kerak. Shuning uchun, muammolarni oldini olish uchun BroadcastEnabled ni ikkala komponent uchun ham rost ga tenglashtirish tavsiya etiladi. A Muayyan IP manzil o'rniga translyatsiya manzilidan foydalaning (hamma qabul qiladigan manzil). Agar siz tarmog'ingizda 192,168,100.x kabi manzillardan foydalansangiz, translyatsiya manzilingiz 192.168.100.255 bo'ladi (biz oxirgi oktetni 255 ga o'zgartiramiz).

Tayyorgarlik tugallandi, dasturlash mumkin.

Tugma hodisasi ishlov beruvchisini yarating va u erga quyidagi kodni yozing:

Protsedura TForml.ButtonlClick(Sender: TObject); start IdUDPClientl.Send(Editl.Text); oxiri;

UDP mijozi yordamida kirish liniyasi (komponent) tarkibini yuboradigan faqat bitta satr mavjud

Endi biz UDP serveriga ushbu ma'lumotni olishni o'rgatishimiz kerak. Buning uchun idUDPServer komponenti UCHUN OnUDPRead hodisasi ishlov beruvchisini yarating. Unga quyidagilarni yozing:

TForml protsedurasi. IdODPServerlüDPRead(Yuborish: TObject; ÄEata: TStream; ABrnding: TIdSocketHandle);

var StringFormatedStream: TStringStream; s: string; boshlash // Boshlash

StringFormatedStream: = TStringStream.Create(""); //Oddiy oqimdan satrga nusxalash StringFormatedStream.CopyFrom(AData, AData.Size);

//Qabul qilingan xabarni chiqaring

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

ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s , Uzunlik(lar)); //String oqimini ozod qilish StringFormatedStream.Free; oxiri;

Hodisalarni qayta ishlash protsedurasi uchta parametrga ega. Birinchisi barcha ishlov beruvchilarda mavjud va biz uchun qiziq narsa yo'q. Ikkinchisi - tarmoqdan olingan ma'lumotlar. Uchinchidan, ma'lumotlar qaerdan kelganligi haqidagi ma'lumotlarni saqlaydi.

Shunday qilib, olingan ma'lumotlar ikkinchi parametrda saqlanadi. Ular bizga oddiy formatlanmagan TStream sifatida keladi. Ma'lumotlar bilan ishlashni yanada qulayroq qilish uchun uni string oqimiga o'tkazish yaxshidir, bu noqulay deb o'ylaysizmi? Agar siz matnni emas, balki rasmni uzatsangiz va komponent uni matnga formatlasa-chi? Endi bu endi noqulay bo'lmaydi, balki butunlay bummer!

Hamma narsa matnga qanchalik oson aylanayotganini ko'ring. Ishlovchi TStringStream (string oqimi) turidagi bitta StringFormatedStream o'zgaruvchisini e'lon qiladi. Kodning birinchi qatori uni ishga tushiradi. Ikkinchi qator ma'lumotlarni oddiy xom oqimdan satr oqimiga ko'chiradi. Hammasi!!! Endi uzatilgan matn StringFormatedStream ning Datastring xususiyatida. SHUNDAN so'ng, iltimos, ushbu natijani Memo komponentida CHIQARING.


4.24-rasm. Amalda suhbat

Lekin biz chat yozyapmiz va bu matnni kim yuborganligi haqida ma'lumot ko'rsatish maqsadga muvofiqdir. Masalan, uchinchi ABinding parametrining repe xususiyatida joylashgan ma'lumot jo'natuvchining IP manzili ko'rsatiladi. Ammo bu shunchaki misol va haqiqiy dasturda u xunuk ko'rinadi. Janob 192.168.100.x nima haqida gapiryapti? Yoki gapirayotgan ayol ham bo'lishi mumkin. Shuning uchun siz yuboruvchining ismini to'g'ridan-to'g'ri yuboruvchi matnga qo'shishingiz mumkin. Kod quyidagicha o'zgaradi:

IdUDPClisntl. Send("Yuborganning ismini shu yerga qo'ying" Editl.Text); Siz foydalanuvchiga alohida Edit2 kiritish qatoriga nom kiritishiga ruxsat berishingiz mumkin. Bu holda kod shunday bo'ladi; IdUDPClisntl.Send(Edit2.Text+" "+Editl.Text);

\Misollar\Chapter 4\Chat katalogidagi kompakt diskda ushbu dasturning namunasini ko'rishingiz mumkin.

yangi futbolchi 2012 yil 4 iyul, soat 18:26

Biz velosipedimizni Delphida yozamiz

  • Yog'och xonasi *

Xayrli kun, Xabrauzer. Rostini aytsam, men Delfi tilini yaxshi ko'raman va uni asossiz ravishda unutgan deb o'ylayman. Va bu mavzuda men siz bilan suhbat yozish tajribamni baham ko'rmoqchiman. Bu juda murakkab masala emas, lekin juda, juda kulgili.

Kirish.

Ushbu suhbatni yozish uchun men IDE Borland Delphi 7 Lite yig'ilishidan foydalandim. Kerakli barcha kutubxonalar allaqachon kiritilgan.

I qism. Interfeysni yozish.

Aslida, bu qism eng oson. Avvalo, suhbatimiz qanday ishlashi haqida o'ylashimiz kerak. Men port, server manzili va taxallusni qo'lda tanlashga qaror qildim. Printsipial jihatdan siz portni o'zingiz tanlashingiz va uni manba kodida ko'rsatishingiz mumkin, ammo shu yo'l bilan biz portlar tugamaguncha server rejimida dasturning qancha nusxasini xohlasak, shuncha ishlay olamiz. Shunday qilib, biz to'rtta kiritish maydonini, bitta Memo tipidagi elementni va uchta tugmani yaratamiz. Ikkita rozetka, server va mijoz qo'shishni unutmang. Biz tugmachalarga matn yozamiz. Dastur nomi, belgisi. Va hokazo. Bu birinchi qismni yakunlaydi.

2-qism. Ichki ishlar.

Aslida, bu erda juda ko'p ish yo'q, lekin barchasi muhim. Birinchidan, biz tugmalar uchun kodni yozamiz. Bu quyida.

TForm 1 protsedurasi. Button1Click(Yuborish: TObject);
boshlanishi
tugma 2. Yoqilgan: = noto'g'ri; // Server tugmachasini o'chiring
Clsocket. manzil:= tahrirlash1. Matn;
Clsocket. Port: = StrtoInt(edit2.Text); //Port va IP-ni yozib oling
Clsocket. Faol: = rost; //Rozetkani yoqing
Clsocket. Ochiq ;
// Oching tugma 3. yoqilgan := rost ;
//Yuborish tugmachasini oching

oxiri ;

Va boshqa barcha tugmalar uchun taxminan bir xil.

Kirish maydonlari uchun sizga hech narsa kerak emas.

Alohida, men xabar yuborish tugmasi uchun kod yozishni ko'rib chiqmoqchiman, chunki bu juda muhim.
TForm 1 protsedurasi. Button3Click(Yuborish: TObject);
boshlanishi
var f: integer; bugun: TdateTime;
bugun : = hozir ; //Vaqtni bilib oling s1:=tahrirlash4. Matn;
//Taxallus va yuborish vaqti bilan chiziq hosil qiling
s2: = tahrirlash3. Matn; s3: = "[" + s2+ "] (" + TimetoStr(bugun) + ") :" + s1;
//Hammasini bir-biriga yopishtiring
ifclsocket. faol = rost ClSocket. Soket. SendText(s3)
//Serverga satr yuboring
boshlanishi
boshqa f uchun: = 0 dan SrSocket ga. Soket. ActiveConnections - 1 ta
boshlanishi
//Server nomidan barcha mijozlarga yuborish
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
oxiri ; Eslatma1. chiziqlar. qo'shish(s3);
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
// O'zingiz uchun suhbat sanasini yozing
//Yuborish tugmachasini oching

tahrir 4. matn : = "" ;

Va nihoyat, ulanish/ajralish/qabul qilish kodini yozamiz. Bu erda voqealarni protseduralar bilan bog'lashni unutmaslik kerak.

TForm 1 protsedurasi. SrsocketClientRead(Yuborish: TObject;
boshlanishi
var i: integer ; //Qabul qilingan matnni o'zgaruvchiga o'tkazing
i uchun: = 0 - SrSocket. Soket. ActiveConnections - 1 ta //Qabul qilingan ma'lumotlarni barcha ulangan mijozlarga yuboring
Srsocket. Soket. Ulanishlar[i]. SendText(Qabul qilingan);
eslatma1. Chiziqlar. qo'shish (qabul qilingan); //Buni o'zimiz uchun yozing
Srsocket. Soket. Ulanishlar[f]. SendText(s3);

TForm 1 protsedurasi. SrSocketClientDisconnect(Yuborish: TObject;
Soket: TCustomWinSocket);
boshlanishi
Eslatma1. Chiziqlar. qo'shish ( "Mijoz aloqani uzdi") ; //Faqat serverga xabar bering
Srsocket. Soket. Ulanishlar[f]. SendText(s3);

TForm 1 protsedurasi. SrSocketClientConnect (yuboruvchi: TObject; Soket: TCustomWinSocket) ;
boshlanishi
Eslatma1. Chiziqlar. qo'shish ( "Mijoz ulandi") ;
//Yuborish tugmachasini oching

3-qism. Yakuniy testlar.

Bu qism eng qisqasi. Loyiha sozlamalarida nom, versiya qo'shing, tuzing va belgini chizing.

Bundan tashqari, Internetda biroz qidirganimdan so'ng, men IP-manzilni ko'rsatish uchun ushbu kodni topdim va uni chatimga kiritdim.

funksiya GetLocalIP: String ;
const WSVer = $101 ;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: Char ning [ 0.. 127] massivi;
boshlanishi
Natija: = "" ;
agar WSAStartup(WSVer, wsaData) = 0 bo'lsa, boshlang //Men bu yerda hech narsaga izoh berishni xohlamayman, chunki... Bu qanday ishlashiga to'liq ishonchim komil emas
agar GetHostName(@ Buf, 128 ) = 0 bo'lsa, boshlang
P : = GetHostByName(@Buf) ;
agar P<>unda nol
Natija : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
WSACleanup;
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
//Yuborish tugmachasini oching

Aslida, bu butun suhbat. Ko'rib turganingizdek, uni yozish juda oddiy. Va men ushbu postni hurmat qilganingiz uchun sizga minnatdorman.

Omadli kun!

Teglar: Delphi, dasturlash

Xayrli kun, Xabrauzer. Rostini aytsam, men Delfi tilini yaxshi ko'raman va uni asossiz ravishda unutgan deb o'ylayman. Va bu mavzuda men siz bilan suhbat yozish tajribamni baham ko'rmoqchiman. Bu juda murakkab masala emas, lekin juda, juda kulgili.

Kirish.

Ushbu suhbatni yozish uchun men IDE Borland Delphi 7 Lite yig'ilishidan foydalandim. Kerakli barcha kutubxonalar allaqachon kiritilgan.

I qism. Interfeysni yozish.

Aslida, bu qism eng oson. Avvalo, suhbatimiz qanday ishlashi haqida o'ylashimiz kerak. Men port, server manzili va taxallusni qo'lda tanlashga qaror qildim. Printsipial jihatdan siz portni o'zingiz tanlashingiz va uni manba kodida ko'rsatishingiz mumkin, ammo shu yo'l bilan biz portlar tugamaguncha server rejimida dasturning qancha nusxasini xohlasak, shuncha ishlay olamiz. Shunday qilib, biz to'rtta kiritish maydonini, bitta Memo tipidagi elementni va uchta tugmani yaratamiz. Ikkita rozetka, server va mijoz qo'shishni unutmang. Biz tugmachalarga matn yozamiz. Dastur nomi, belgisi. Va hokazo. Bu birinchi qismni yakunlaydi.

2-qism. Ichki ishlar.

Aslida, bu erda juda ko'p ish yo'q, lekin barchasi muhim. Birinchidan, biz tugmalar uchun kodni yozamiz. Bu quyida.

TForm 1 protsedurasi. Button1Click(Yuborish: TObject);
boshlanishi
tugma 2. Yoqilgan: = noto'g'ri; // Server tugmachasini o'chiring
Clsocket. manzil:= tahrirlash1. Matn;
Clsocket. Port: = StrtoInt(edit2.Text); //Port va IP-ni yozib oling
Clsocket. Faol: = rost; //Rozetkani yoqing
Clsocket. Ochiq ;
// Oching tugma 3. yoqilgan := rost ;
//Yuborish tugmachasini oching

oxiri ;

Va boshqa barcha tugmalar uchun taxminan bir xil.

Kirish maydonlari uchun sizga hech narsa kerak emas.

Alohida, men xabar yuborish tugmasi uchun kod yozishni ko'rib chiqmoqchiman, chunki bu juda muhim.
TForm 1 protsedurasi. Button3Click(Yuborish: TObject);
boshlanishi
var f: integer; bugun: TdateTime;
bugun : = hozir ; //Vaqtni bilib oling s1:=tahrirlash4. Matn;
//Taxallus va yuborish vaqti bilan chiziq hosil qiling
s2: = tahrirlash3. Matn; s3: = "[" + s2+ "] (" + TimetoStr(bugun) + ") :" + s1;
//Hammasini bir-biriga yopishtiring
ifclsocket. faol = rost ClSocket. Soket. SendText(s3)
//Serverga satr yuboring
boshlanishi
boshqa f uchun: = 0 dan SrSocket ga. Soket. ActiveConnections - 1 ta
boshlanishi
//Server nomidan barcha mijozlarga yuborish
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
oxiri ; Eslatma1. chiziqlar. qo'shish(s3);
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
// O'zingiz uchun suhbat sanasini yozing
//Yuborish tugmachasini oching

tahrir 4. matn : = "" ;

Va nihoyat, ulanish/ajralish/qabul qilish kodini yozamiz. Bu erda voqealarni protseduralar bilan bog'lashni unutmaslik kerak.

TForm 1 protsedurasi. SrsocketClientRead(Yuborish: TObject;
boshlanishi
var i: integer ; //Qabul qilingan matnni o'zgaruvchiga o'tkazing
i uchun: = 0 - SrSocket. Soket. ActiveConnections - 1 ta //Qabul qilingan ma'lumotlarni barcha ulangan mijozlarga yuboring
Srsocket. Soket. Ulanishlar[i]. SendText(Qabul qilingan);
eslatma1. Chiziqlar. qo'shish (qabul qilingan); //Buni o'zimiz uchun yozing
Srsocket. Soket. Ulanishlar[f]. SendText(s3);

TForm 1 protsedurasi. SrSocketClientDisconnect(Yuborish: TObject;
Soket: TCustomWinSocket);
boshlanishi
Eslatma1. Chiziqlar. qo'shish ( "Mijoz aloqani uzdi") ; //Faqat serverga xabar bering
Srsocket. Soket. Ulanishlar[f]. SendText(s3);

TForm 1 protsedurasi. SrSocketClientConnect (yuboruvchi: TObject; Soket: TCustomWinSocket) ;
boshlanishi
Eslatma1. Chiziqlar. qo'shish ( "Mijoz ulandi") ;
//Yuborish tugmachasini oching

3-qism. Yakuniy testlar.

Bu qism eng qisqasi. Loyiha sozlamalarida nom, versiya qo'shing, tuzing va belgini chizing.

Bundan tashqari, Internetda biroz qidirganimdan so'ng, men IP-manzilni ko'rsatish uchun ushbu kodni topdim va uni chatimga kiritdim.

funksiya GetLocalIP: String ;
const WSVer = $101 ;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: Char ning [ 0.. 127] massivi;
boshlanishi
Natija: = "" ;
agar WSAStartup(WSVer, wsaData) = 0 bo'lsa, boshlang //Men bu yerda hech narsaga izoh berishni xohlamayman, chunki... Bu qanday ishlashiga to'liq ishonchim komil emas
agar GetHostName(@ Buf, 128 ) = 0 bo'lsa, boshlang
P : = GetHostByName(@Buf) ;
agar P<>unda nol
Natija : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
WSACleanup;
Srsocket. Soket. Ulanishlar[f]. SendText(s3);
//Yuborish tugmachasini oching

Aslida, bu butun suhbat. Ko'rib turganingizdek, uni yozish juda oddiy. Va men ushbu postni hurmat qilganingiz uchun sizga minnatdorman.

Omadli kun!

Teglar: Delphi, dasturlash


O'ylaymanki, o'zingizning (korporativ) chatingizni yaratish g'oyasi sizga bir necha marta kelgan. Xuddi shu fikr menga keldi va har doimgidek, men Internetda ma'lumot izlay boshladim, lekin yaxshi narsa topolmadim. Bu qanday amalga oshirilishi mumkinligini hamma narsa to'liq tasvirlamaydi.

Va men o'zimga va'da berdimki, men uni o'rganishim bilanoq ushbu mavzu bo'yicha to'liq ma'lumot joylashtiraman. Men suhbatimni rozetkalarda qildim. Ulardan foydalangan holda Internet orqali ham, mahalliy tarmoq orqali ham muloqot qilishingiz mumkin. Buni amalga oshirish uchun siz faqat IP-manzilni bilishingiz kerak. Delphi 7 da dasturlashtirilgan.

O'rnatish shartlari

Men buni delphi7 da qilganim uchun, menga kerak bo'lgan komponentlar sukut bo'yicha yo'q edi. ( ServerSocket1, ClientSocket1).
Buning uchun siz Socket komponentlarini qo'shishingiz kerak.

Komponent --> Paketlarni o'rnatish...--> Qo'shish --> dclsockets70.bpl menyusiga o'ting.

Va biz komponentlar bilan paketga yo'lni ko'rsatamiz, u Bin paketidagi Delphi ildiz papkasida joylashgan. Menda bor edi:

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

Ushbu qo'shimchadan so'ng, ushbu komponentlar Internet yorlig'ida paydo bo'lishi kerak.

Komponentlarni joylashtirish va kodni yozish

Shaklga quyidagi elementlarni qo'shdim: ServerSocket1, ClientSocket1, Edit1 (chat uchun), Edit2 (server IP manzili uchun), Memo1 xabarni ko'rsatish uchun va 3 tugma.

Server yaratish uchun tugmadagi hodisaga quyidagi narsani yozing:

funktsiyasi GetLocalIP: String;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: massiv ning Char;
boshlanishi
Natija:= "";
agar WSAStartup (WSVer, wsaData) = 0 keyin boshlang
agar GetHostName (@Buf, 128) = 0 keyin boshlang
P:= GetHostByName(@Buf);
agar P<> unda nol
Natija:= iNet_ntoa(PInAddr(p^.h_addr_list^)^);
oxiri;
WSACleanup;
oxiri;
oxiri;

tartib TForm1.Button3Click(Sender: TObject);
boshlanishi
ServerSocket1.Port:=65000; // Serveringiz portiga o'zingizga yoqqanini o'rnating
ServerSocket1.Active:=To'g'ri; // serverni faollashtiring
ServerSocket1.Open; //boshlash
ShowMessage("Sizning IP: "+GetLocalIP); //mijoz bizga ulanishi uchun biz IP manzilimizni beramiz
oxiri;

Server yoqilgandan so'ng, mijoz serverga ulanishi mumkin bo'ladi.
Buning uchun u Edit2-ga serverning IP-manzilini kiritadi va ulanish tugmasini bosadi:

tartib TForm1.Button2Click(Sender: TObject);
boshlanishi
ClientSocket1.Address:=Edit2.Text; // Server IP manzili
ClientSocket1.Port:=65000; //uning porti
ClientSocket1.Active:=To'g'ri; // mijozni faollashtirish
ClientSocket1.Open; //boshlash
oxiri;

Diqqat: Mijoz faqat xabar yuborishi mumkin, Server esa o'z navbatida qabul qilishi mumkin. Ikki tomonlama aloqa uchun tarmoqning turli uchlarida joylashgan ikkita dasturda Mijoz va Serverni yoqing.

Xabarni o'qish uchun server xabarni qabul qilishini kutadi... mana bu

tartib TForm1.ServerSocket1ClientRead(Yuborish: TObject;
Soket: TCustomWinSocket);
boshlanishi
memo1.Lines.add(Socket.RemoteAddress+": ");
memo1.Lines.add(Socket.ReceiveText);
StatusBar1.Panels.Items.Text:=Socket.RemoteAddress;
oxiri;

Xabarni yuborish uchun men ikkita protsedurada yozdim. Mana ular:

tartib TForm1.SendMes(Matn: String);
boshlanishi
agar form1.ServerSocket1.Active keyin
agar form1.ServerSocket1.Socket.ActiveConnections>0 keyin
form1.ServerSocket1.Socket.Connections.SendText(Matn);

agar form1.ClientSocket1.Active keyin
form1.ClientSocket1.Socket.SendText(Matn);
oxiri; tartib TForm1.Button1Click(Sender: TObject);
boshlanishi
SendMes(Edit1.Text);
memo1.Lines.add(GetLocalIP+": ");
memo1.Lines.add(Edit1.Text);
oxiri;



gastroguru 2017