Umíme to s Delphi: 129. díl – klientská aplikace přes sockety od A do Z

Diskuze čtenářů k článku

Martin  |  17. 05. 2004 19:50  | 

Sice to nebylo v tomhle článku ale jelikož je ten článek psán spíše pro začátečníky rád bych se dozvěděl jak v delphi realizovat Broadcast (do hosta mi adresa broadcastu nejde nacpat) a abych nemusel znát adresu serveru...


Díky váš čtenář

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  18. 05. 2004 00:27  | 

Realizace Broadcastu, resp. Multicastu je samozrejme v Delphi mozna. Jak jiz kolega v clancich serialu zminoval jedna se vzdy o zapouzdreni urciteho typu API do nejake lepe pristupne komponenty. Problem proc nemuzete pouzit broadcastovou adresu v komponentach TCPServer a TTCPClient je v pouziti protokolu. TCP protokol neumoznuje hromadne rozesilani dat po siti. K temto ucelum slouzi protokol UDP. Zkuste prozkoumat komponentu UDPsocket (Delphi7). Uvedomte si ze tento protokol nenavazuje zdne spojeni, pouze posila balicek dat zabalenych do paketu UDP kamsi do site. Neni zde zadna kontrola zda data dorazila na misto urceni. Proto je nutne toto potvrzeni zajistit na vyssi vrstve aplikace. Pokud tvorite aplikaci jenz si ma na siti sama vyhledat klienty bez nutnosti konfigurace, doporucuji vytvorit si naslouchaci UDP socket na obou stranch a pri spusteni aplikace opakovane poslat na tento port broadcastovou informaci o sve dostupnosti. Druha strana by pak mela provest odpoved, nebo navazani komunikace po protokolu TCP.


Princip je jednoduchy, ale podrobnejsi zabyvani se touto problematikou by zcela jiste vystacilo na samostatny clanek.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Nyny  |  17. 05. 2004 19:53  | 

Chtel sem se zeptat, nedavno sem nekde videl neco o Delphi 8, nevite nekdo co je v nem noveho?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  18. 05. 2004 00:02  | 

Delphi 8 (Octane) jsou dosti prepracovne. Hodne se zmenilo GUI, podle vychoziho schematu je vse slepeno do jednoho formulare, tak jak je to napriklad u MS Visual Studia. Nekomu to mozna vyhovuje ale pokud napriklad pouzivate vice jak jeden monitor, jsou jednotliva plovouci okna skovnejsi. Samozrejme je i dostupne schema s plovoucimi okenky. Dalsi vyraznou zmenou je presunuti komponent z listy do jednoho z toolsovych okenek kde jsou ikonky serazeny do ruznych kategorii, rozlisenych ruznou barvou podkladu. Je to takovy barevny ListBox s popiskou a malou ikonkou komponenty na zacatku radku. Skala komponent trosicku proridla, ale myslim ze vetsinu chybejicich nebudeme postradat.


Co se tyce novinek Delphi 8 z pohledu technologii, tak je tu jeden skok kupredu a to je podpora .NET

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  18. 05. 2004 10:15  | 
LoWang  |  18. 05. 2004 01:10  | 

DLouho jsem hledal na webu nějaké tutoriály k těmto standartním komponentám z palety internet v Delphi 7, ale nic jsem nenašel. Bohužel jsem to asi z nápovědy dostatečně nepochopil a nedokážu mezi TCpServerme a clientem přenést žádná data, tak aby to spustilo nějaký event handler nebo aby se to vůbec nějak dalo přečíst u druhého. Přestože spojení mezi instancemi těchto komponent se mi podle všeho udělat podaří. Nechcete jednou napsat díl o jednoduché komunikaci za použití těchto standartních komponent? Já vím, že Indy jsou možná lepší, ale co když programuju třeba školní projekt a do školních Delphi nemůžu žádné Indy přiinstalovávat?

Pokud by se ale aspoň našel někdo kdo tyto standartní komponenty v něčem pouzžil a myslí si, že ví jak to funguje, tak ať mi prosím dá vědět. Udělal by mi fuckt radost, kdyby mi s něčím pomoh :)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Václav Kadlec  |  18. 05. 2004 12:03  | 

Temito komponentami se budu v serialu brzy zabyvat. Do te doby Vam asi nezbude nez si nainstalovat ClientSocket a ServerSocket do Delphi 7 :)

Souhlasím  |  Nesouhlasím  |  Odpovědět
ptosek  |  10. 02. 2005 10:53  | 

Zdarec,
přečti si si od Václava Kadlece knihu "Hotová řešení". (str 241).
Nebude to nikdy komunikovat když nepochopíš jak se spouštějí thready a jak si předávají data. Je to fakt maso! Ale na TCP/IP raději používej Indy http://www.atozed.com/indy/plus/Files.iwp.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Shut Down  |  18. 05. 2004 21:18  | 

Nejprve bych vám chtěl poděkovat za vynikající článeky - ne že bych byl v internetových aplikacích úplný začátečník, ale spoustu detailů jsem nevěděl. A hlavně - poté co jsem přešel na Delphi 7 jsem přišel o naprosto perfektní komponenty Client/ServerSocket, které jsem díky vašim článkům opět získal - ne že by Indy komponenty byly úplně špatné(naopak), ale přiznejme si to - jsou příšerně přetláskané a nepřehledné, navíc jim některé věci chybí(např. TCPClient nemá událost pro příjem dat) - takže ještě jednou moc díky. A teď k tomu hlavnímu, co jsem se chtěl zeptat vyvýjí teď hru s muliplayerem (prostě více hráčů po síti) a chtěl bych k ní kromě internetu dodat i podporu komunikace po místní síti(přez síťové karty) - budete se této problematice také věnovat?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  19. 05. 2004 15:56  | 

Nejsem si zcela jist zda rozumim vasi otazce. Resp. jestli vy spravne rozumite popisovane sitove komunikaci. Uvadene clanky ktere zde komentujeme nabizi reseni jak pro komunikaci po lokalni siti, tak i v Internetu, samozrejme prostrednictvim nejake "sitove karty". Komunikace v lokalni siti byva jednoducha, u Internetu se navic musi pocitat s komplikacemi jako jsou napriklad firewally, smerovace atp..


muzete tedy svuj problem vice upresnit?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Shut Down  |  19. 05. 2004 19:50  | 

Jo, jasně - no zajímá mně, jak načíst všechny počítače v lokální síti a jak navázat spojení se servery, co na nich běží.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  20. 05. 2004 13:51  | 

Pro tento pripad bych doporucoval pouzit komunikacniho protokolu UDP, ktery umoznuje posilani broadcastu. V kazde aplikaci kterou chcete mit propojenou s ostatnimi si otevrete jeden UDP port. Po spusteni aplikace vysilejte na tomto portu broadcast do lokalni site. Kazda z aplikaci by mela tuto zpravu obdrzet a vy si tak muzete poznamenat informace o dalsim klientovi. Je pak jen na Vas jestli budete i nadale pouzivat komunikaci mezi aplikacemi na urovni protokolu UDP a zpravy si potvrzovat ve vyssi vrstve, nebo zda se pokusite aplikace mezi sebou spojit protokolem TCP. Pro vyssi spolehlivost je dobre broadcasty posilat do site periodicky po nejakem delsim case (radove vteriny) pro pripad ze by vsichni prijemci neobdrzeli prvni zpravu vysilanou po spusteni. Samozrejme je take treba obdobne resit odhlaseni aplikace pri jejim ukoncenim. 


ps. Pokud by se kolega (autor serialu) nehodlal timto v pristich dilech zabyvat, mohu napsat nejaky podrobnejsi samostatny clanek s priklady na toto tema

Souhlasím  |  Nesouhlasím  |  Odpovědět
Martin Homolka  |  20. 05. 2004 19:10  | 

Bylo by dobrý něco víc napsat o UDP protokolu, nějak sem nepřišel na to jak se v delphi 7 v TUDPServer a Klientovi čtou data po přijetí například broadcastu... A jaké řešení je lepší při získávání adresy serveru...

Souhlasím  |  Nesouhlasím  |  Odpovědět
David Vávra  |  19. 05. 2004 14:51  | 

Dobrý den,


váš seriál se mi velmi líbí, konečně vím jak poslat data ze serveru klientovi. Chybí mi ale jedna věc - na server je připojeno více klientů a chtěl bych vědět, jak může server "vybrat" klienta, kterému pošle nějaká data. Snažím se udělat jednoduchý chat, kde by server poslal data přijatá od jednoho klienta všem připojeným klientům. Zatím mi jde poslat data pouze tomu, od kterého data přišly.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  19. 05. 2004 15:47  | 

Reseni neni nijak slozite, pouze si musite uvedomit jak komponenty funguji. Rekneme ze mate nejaky server ktery se stara o pripojene klienty. Na tomto serveru mate pouzitou komponentu TServerSocket. Je potreba si nejakym zpusobem pamatovat WinSockety ktere jsou navazane s klienty. Nejlepsi zpusob je povesit se na onClientConnect, ktery preda jako parametr TCustomWinSocket. Tento objekt si pridejte do nejakeho vaseho dynamickeho pole. Na udalost onClientDisconnect si odkaz na tento objekt ze seznamu vyskrtnete (dulezite je take spravne rozhodnout o vyskrtnuti ze seznamu a osetreni vyjimky vyvolane na onClientError). No a pokud prijdou nejaka data od jakohokoliv klienta, dojde k vyvolani udalosti na ni pak staci jen postavit algoritmus, ktery projde cele pole se zaznamenanimi (tj. prave otevrenymi) WindowsSockety a prez vsechny odesle zpravu. Samozrejme lze provest pred odeslanim zpravy nejake porovnani ktere urci komu se data odeslou a komu ne.

Souhlasím  |  Nesouhlasím  |  Odpovědět
JimmyFLASH  |  04. 02. 2007 20:15  | 

Názorná ukázka by byla super

Díky

Souhlasím  |  Nesouhlasím  |  Odpovědět
Akwky  |  02. 03. 2008 17:49  | 

Nevím, zda-li to již někde bylo uvedeno, ale pro posílání dat vybranému klientovi stačí použít ServerSocket1.Socket.Connection[index].SendText (podobně lze získat informace o klientovi s indexem, ale dlouho to trvá, takže užívat s mírou)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Ing. Jiří Sokol  |  24. 05. 2004 11:38  | 

Dobry den.


Hodnotim se za dlouholeteho ctenare a tak mi neuniklo, ze puvodne kazdy tyden pribyvajici clanky se zmenily na 14-ti denni. Jedna se o zmenu a bude to tak vzdy a nebo nas Ing. Kadlec jen zkousi a napina, kdyz zrovna zacal rozebirat tak zajimave tema... ;o)


Diky za odpoved


Jiri Sokol

Souhlasím  |  Nesouhlasím  |  Odpovědět
Václav Kadlec  |  24. 05. 2004 12:59  | 

Dobrý den,


není to ani úmysl ani nové pravidlo. Důvody jsou v zásadě dva: občas jsou na vině všemožné červy a emailové viry, které způsobí neefektivní (a místy dokonce nefunkční) emailovou komunikaci, ovšem typickým důvodem poslední doby je nedostatek času. Moc mě to mrzí, rád bych přinášel nové díly pravidelně, ale v poslední době se mi to občas bohužel nepodařilo. Pokusím se polepšit

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jiri  |  30. 05. 2004 18:43  | 

Zdravim všechny delfaře


Měl bych také malou poznámku o tom čím by se další seriál mohl zabívat.Tak za prvé mě zaujal protokol UDP o kterém už tady byla řeč a jehož použití nic nevím,kromně toho co jsem se tady dočet v diskuzi.Dále bych jako další tema viděl hromadné odesílání správ.V posledním dílu zde byl uveden příklad kdy server spracuje zadaní od klienta a výsledek pošle zpět,ale to byla jen jedna správa.V mém případě sem se pokoušel servrem zjistit běžící procesy které sem uložil do proměné TStringList a v cyklu sem je řádek po řádku poslal klientovi,aby s nimi naplnil ListBox.Co se ale nestalo první správa se odeslala v pořádku,ale ostatní se spojili do jedné.Vyřesil sem to tak že po odeslání jedné správy sem použil sleep na 200 ms.Tuším,ale že to není moc štastné řešení.Testoval sem to na lokální smyčce.Na internetu  to odesílání bude trvat déle než 200ml a data by opět nepřišla v pořádku.Nevím jak bych to vyřešil jinak.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Tomas Jantac  |  06. 08. 2004 10:15  | 

Dobry den,


Myslim ze by stacilo ta data zabalit do nejakeho vlstniho protokolu. Asi za nejjednodussi reseni bych povazoval odesilani jednotlivych polozek StringListu oddelene nejakym ukoncovacim znakem (napr. CR=$0D=13=Enter). Na prijimaci strane bych si vytvoril nejaky buffer (string)  do ktereho bych prichozi data pripisoval. Vzdy pri doplneni bufferu o nove prichozi data bych ve smycce vybral vsechny uplne polozky (tj. retezce ukoncene znakem #13).


While Pos(#13,FBuffer)<>0 do


  ListBox1.Items.Add(Copy(fBuffer,1,Pos(#13,FBuffer));


  Delete(FBuffer,1,Pos(#13,FBuffer))


end;


Problem UDP je ale jak uz bylo mnohokrate receno v tom ze si nemuzete byt jisti ze Vam projdou vsechna data. Proto je nutne tyto pripadne stavy osetrit ve vyssi vrstve. (potvrzovani dorucenych zprav) A nebo radeji pouzit UDP jen pro scan LAN a pak navazovat komunikaci prez TCP. Myslim ze uz jsem to tu jednou psal.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Michal  |  02. 01. 2005 17:08  | 

Mám problem s verzi delphi - nemam soubor dclsockets70.bpl. Zjistil jsem, ze to jde i pomoci nejakeho souboru .pas ale mam ho jen v prelozene forme a nejde to.
Mohl by mi prosim nekdo poslat dclsockets70.bpl na mail? : jauzah@seznam.cz.
Nebo napsat adresu, kde bych ho mohl stahnout?
Budu Vam opravdu vdecny. Predem diky za pomoc.

Souhlasím  |  Nesouhlasím  |  Odpovědět
SUK  |  06. 04. 2005 19:05  | 

helle to je pjekny ale jak to udelat kdyz budu chtit pres tohle poslat soubor - exe soubor...???
De to nejakym jednoduchym spusobem??
Predem diky SUK

Souhlasím  |  Nesouhlasím  |  Odpovědět
Habo  |  25. 02. 2007 18:28  | 

mám síce delphi 7 ale nemám v bin ten dclsocket ci jak sa to vola mohol by mi ho niekto poslať? budem veľmi rad a možno tiez v niecom pomozem
ak budete potre bovat vopred dakujem moj e-mail je Martin.R24@atlas.sk

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor
Aktuální číslo časopisu Computer

Megatest: 20 powerbank s USB-C

Test: mobily do 3 500 Kč

Radíme s výběrem routeru

Tipy na nejlepší vánoční dárky