Exemplu de chat pe bază de socket
Toată lumea știe că materialul de referință este bun. Dar studierea aproape oricăror întrebări este mult mai ușoară, dacă o considerăm cu exemple. Prin urmare, scopul acestui articol, spre deosebire de cele precedente pe această temă, va fi studierea diferitelor metode și tehnici de lucru cu prize într-un exemplu clar.
Aici vom examina un exemplu practic al unei aplicații de chat pentru o rețea locală.
Chat pentru rețeaua locală
Luați în considerare un exemplu destul de simplu de chat pentru o rețea locală. În acest exemplu, cele două aplicații sunt serverul de chat și clientul de chat. Clienții de chat se conectează la serverul de chat și fac schimb de mesaje prin intermediul acestuia. Serverul de chat poate fi pornit, de asemenea, pe computerul în care funcționează unul dintre clienți. În plus, pentru testare, puteți porni de pe computer imediat chat server și mai mulți clienți de chat. Pentru aceasta, specificați localhost în câmpul gazdă. iar în câmpul Port serverul și clientul ar trebui să aibă aceleași valori. Nu confunda serverul cu înțelegerea programului care acceptă apeluri de la clienți, cu computerul server! E același lucru cu clientul.
Codul sursă pentru ambele aplicații (server de chat și client de chat) puteți descărca făcând clic aici. Acest exemplu se face pe Borland Delphi 5. Cu toate acestea, codul va funcționa în orice versiune a Delphi, unde există componente TServerSocket și TClientSocket. În versiunile anterioare, pot apărea probleme cu deschiderea formularelor, dar sunt ușor de făcut de unul singur, deoarece Iată capturi de ecran ale acestor exemple.
Pentru a vedea acest exemplu, descărcați codul sursă, compilați ambele proiecte, executați srv_ex.exe. în fereastra sa, faceți clic pe butonul Start. În fereastra care apare, trebuie să specificați portul pe care va funcționa serverul. Valoarea implicită este 1001.
Ei bine, acum să analizăm codul sursă al serverului de chat:
Deci, ce face acest cod? Button1Click și Button2Click - Cred că este de înțeles că ei încep și opresc serverul în consecință. O examinare suplimentară necesită ServerSocket1ClientRead.
Apoi, în șirul s (informațiile nu mai sunt necesare), scrieți comanda "#U" și succesiv toți utilizatorii din lista ListBox1. Apoi întreaga linie este trimisă clienților TOȚI.
Apoi, dacă nu am primit "#N", dar "#M" sau "#P" (mesaj simplu sau privat), îl trimitem tuturor clienților (și trebuie deja să dau seama cine este acest mesaj :-)).
ServerSocket1ClientDisconnect este un handler de evenimente care apare atunci când unul dintre clienți este deconectat de la server. Aici ștergem lista de utilizatori și trimitem toate solicitările clienților pentru pseudonimele lor (pseudonime).
NOTĂ. Acest exemplu este simplificat pentru a facilita înțelegerea tehnologiei de creare a unor aplicații similare. Posibilitățile de chat normal ar trebui să fie mult mai largi. De asemenea, rețineți că comenzile "#N", "#U", "#M" etc. sunt înscrise de către dezvoltator însuși doar pentru a determina ce a fost trimis de la soclu. Aceste comenzi nu sunt legate direct de prize.
Iată textul sursă al clientului de chat cu explicațiile necesare:
Mai întâi, stocăm datele în soclu în șirul s. Apoi, dacă am fost trimisă o listă de alți clienți conectați, atunci selectăm un utilizator din rândul s și le adăugăm succesiv în ListBox1. Astfel, ListaBox1 devine o listă de utilizatori.
Mai departe - dacă am trimis comanda "#M" - mesajul obișnuit, atunci vom selecta s de la expeditor și mesajul în sine și apoi vom afișa toate acestea într-un formular standard de chat în Memo1.
Dacă cererea pentru numele de utilizator (porecla) a fost primită - comanda "#N", atunci ne trimitem porecla la server.
Edit1KeyDown este necesar pentru ca în loc să apăsați Button1 de fiecare dată când doriți să trimiteți un mesaj, trebuie doar să apăsați Enter.
Karikh Nikolay. (Nitro) regiunea Moscova, Zhukovsky