[ milos 2 @ 18.05.2010. 17:44 ] @
e ovako, ne znam da li ovo spada u c++ za pocetnike, ne bi rekao, pa pisem ovde.

elem, u cemu je problem, ja treba da napravim program preko kog ce moci da se cetuje izmedju dva umrezena racunara, ali u borland c++ builder-u. da li je i ako jeste kako izvesti?
[ X Files @ 18.05.2010. 18:28 ] @
* chat primer (ako se ne varam) postoji i u Primerima koji dolaze uz BCB6
* chat sa Indy-jem (uz video tutorijal) je uradio i itf:
http://www.elitesecurity.org/p2130884
* chat primer postoj i u Indy primerima na zvanicnom Indy sajtu i na jos par mesta po netu

[ milos 2 @ 18.05.2010. 19:32 ] @
da, ali tu nije objasnjeno kako napraviti server, a kako klient
[ tkaranovic @ 19.05.2010. 05:16 ] @
Da li treba da budeo kao ovaj uz poruku:



reč je o Borland->Embarcadero kodu...
[ itf @ 19.05.2010. 23:44 ] @
Na prijašnjem linku je priložen video kako napraviti chat upotrebom Indy 9 komponenti a ovdje možete vidjeti i:

Chat Indy 10 TCP/IP komponentama
http://www.youtube.com/watch?v=DBtzYB-h4hI

Chat Indy 10 UDP komponentama
http://www.youtube.com/watch?v=-JD7F1QrBtk
[ milos 2 @ 20.05.2010. 17:04 ] @
izgleda se nismo dobro razumeli, sve je to u redu kada je u pitanju jedan komp, ali ja treba dva povezana u mrezu da koristim, gde je tu opisano napraviti server od jednog, a na drugom klijent, a da mogu da se dopisuju medjusobno?
[ itf @ 20.05.2010. 17:14 ] @
Očito da baš i nisi shvatio o čemu sam pričao u tim videima niti na koju logiku je to napravljeno. Znači, chat aplikacija u sebi ima ujedno i klijent i server. U računalu A pokreneš ovu aplikaciju i u računalu B pokreneš ovu aplikaciju. U aplikaciji koja se nalazi na A ukucaš IP adresu od računala B, a u aplikaciji koja je na B ukucaš IP adresu od računala A. I to radi. Nije potrebno kreiranje nikakvog zasebnog i izdvojenog chat servera već chat aplikacija sama u sebi ima svoj server preko kojeg prima poruke poslane na svoju ip adresu dok ima klijent koji šalje poruke na neku ip adresu.
[ kosmopolita @ 20.05.2010. 18:57 ] @
Citat:
itf
Očito da baš i nisi shvatio o čemu sam pričao u tim videima niti na koju logiku je to napravljeno. Znači, chat aplikacija u sebi ima ujedno i klijent i server. U računalu A pokreneš ovu aplikaciju i u računalu B pokreneš ovu aplikaciju. U aplikaciji koja se nalazi na A ukucaš IP adresu od računala B, a u aplikaciji koja je na B ukucaš IP adresu od računala A. I to radi. Nije potrebno kreiranje nikakvog zasebnog i izdvojenog chat servera već chat aplikacija sama u sebi ima svoj server preko kojeg prima poruke poslane na svoju ip adresu dok ima klijent koji šalje poruke na neku ip adresu.



Nisam postavljač teme a napravio sam primer po uputstvu da vidim kako radi. Jedna od stvari koja me je zanimala je koliko će biti izvršni fajl veći zbog toga što se koristi indy komponenta jer mi je jedan program narasto zbog jedne druge indy komponente. Misliom sam da je povećanje izvršnog fajla obavezno sa indy komponentom a(li) u ovom primeru se to nije dogodilo.

Druga svar koja bi me konkretno interesovala vezanao baš za ove Server i Client komponente je može li se napraviti Server sa više klijenata koji su istovremeno ulogovani i da svi mogu da razmenjuju zajednički chat?

Ovaj primer sam prepravio tako da se klijenti ne izloguju i vidim da može više njih da se uloguje ali nisam uspeo (za ovo kratko vreme koje sam gledao) da nađem način da se sa servera svim ulogovanim klijentima pošalje poruka.

[ milos 2 @ 20.05.2010. 19:12 ] @
ok, probacu, ali to i mene zanima za cet na vise racunara, da budem precizniji 16
[ itf @ 20.05.2010. 20:36 ] @
Citat:
kosmopolita: Nisam postavljač teme a napravio sam primer po uputstvu da vidim kako radi. Jedna od stvari koja me je zanimala je koliko će biti izvršni fajl veći zbog toga što se koristi indy komponenta jer mi je jedan program narasto zbog jedne druge indy komponente. Misliom sam da je povećanje izvršnog fajla obavezno sa indy komponentom a(li) u ovom primeru se to nije dogodilo.

Druga svar koja bi me konkretno interesovala vezanao baš za ove Server i Client komponente je može li se napraviti Server sa više klijenata koji su istovremeno ulogovani i da svi mogu da razmenjuju zajednički chat?

Ovaj primer sam prepravio tako da se klijenti ne izloguju i vidim da može više njih da se uloguje ali nisam uspeo (za ovo kratko vreme koje sam gledao) da nađem način da se sa servera svim ulogovanim klijentima pošalje poruka.


Primjer s TCP/IP chatom je kada je chat između samo dva računala. Ukoliko je potrebno da više njih istovremeno razgovara onda se eventualno može upotrijebiti UDP (broadcast) ili baš nekakav centralni server koji bi zaprimao poruke sviju a zatim ih slao onima kojima treba. To bi bila tek mala modifikacija ovog mog primjera. Zapravo, klijent u chat aplikaciji bi se preusmjerio tako da šalje poruku na centralni server,a on bi prosljeđivao poruku svima (npr. sekvencijalno for petljom svim ip adresama).

Jednom kada se shvati osnovna "shema" klijent-server komunikacije s Indy komponentama onda niti takav program ne predstavlja problem.
[ milos 2 @ 20.05.2010. 21:06 ] @
a kako ako necu da svi vide, nego samo odredjena IP adresa, ali da sam konektovan na server, a ne na njegovu IP adresu direktno, ili jos bolje ako je moguce da svaki IP ima svoj nick


[Ovu poruku je menjao milos 2 dana 20.05.2010. u 22:18 GMT+1]
[ kosmopolita @ 20.05.2010. 21:08 ] @
Citat:
itf: Primjer s TCP/IP chatom je kada je chat između samo dva računala. Ukoliko je potrebno da više njih istovremeno razgovara onda se eventualno može upotrijebiti UDP (broadcast) ili baš nekakav centralni server koji bi zaprimao poruke sviju a zatim ih slao onima kojima treba. To bi bila tek mala modifikacija ovog mog primjera. Zapravo, klijent u chat aplikaciji bi se preusmjerio tako da šalje poruku na centralni server,a on bi prosljeđivao poruku svima (npr. sekvencijalno for petljom svim ip adresama).

Jednom kada se shvati osnovna "shema" klijent-server komunikacije s Indy komponentama onda niti takav program ne predstavlja problem.


Da li to znači da bi se konekcije uspostavljale za slanje svake pojedinačne poruke?

Ili bi klijenti bili konektovani na server sve vreme dok se događa komunikacija?
[ milos 2 @ 20.05.2010. 21:23 ] @
koliko sam ja shvatio po ovom programu sto je za samo izmedju dva racunara, trebalo bi da nisu stalno konektovani, jer u kodu imas onaj deo:
Code:
AThread->Connection->Disconnect();

i svaki put kada pritisnes dugme da posalje poruku, on se opet konektuje.
[ kosmopolita @ 20.05.2010. 21:28 ] @
Kako bi onda server znao ko su sve klijenti?

Imao bi spisak ip adresa na kojima su klijenti?
[ milos 2 @ 20.05.2010. 21:35 ] @
dobro pitanje. :)

kako onda isprogramirati server?

recimo u mom slucaju sa 16 racunara. jedan uzmemo za server, i kako da programiram idUDPServer komponentu (posto si rekao da moze samo preko UDP porta da se komunicira sa vise od dva racunara), ili se pak uzima neka druga komponenta.
[ itf @ 20.05.2010. 21:44 ] @
Citat:
milos 2: koliko sam ja shvatio po ovom programu sto je za samo izmedju dva racunara, trebalo bi da nisu stalno konektovani, jer u kodu imas onaj deo:
Code:
AThread->Connection->Disconnect();

i svaki put kada pritisnes dugme da posalje poruku, on se opet konektuje.


To je nekakva praksa klijent-server komunikacije tj. da klijent pošalje zahtjev, drži konekciju aktivnom dok server ne zaprimi zahtjev i dok ne dobije odgovor od njega (ukoliko je potrebno). Nakon toga prekida konekciju i oslobađa mrežne resurse. Vrlo čest primjer s bazama. No, može se napraviti i da je stalna konekcija. Više možda stvar ukusa, iako ja više preferiram konekciju u vrijeme zahtjeva.

Citat:
kosmopolita: Kako bi onda server znao ko su sve klijenti?

Imao bi spisak ip adresa na kojima su klijenti?

Centralni server bi prikupljao podatke o svima koji chataju na sljedeći način:

Klijent upali chat aplikaciju i logira se na centralni server. Tada taj server zapravo zapiše sve potrebne podatke tj. IP adresu, port i npr. njegov nick.

Citat:
milos 2: dobro pitanje. :)

kako onda isprogramirati server?

recimo u mom slucaju sa 16 racunara. jedan uzmemo za server, i kako da programiram idUDPServer komponentu (posto si rekao da moze samo preko UDP porta da se komunicira sa vise od dva racunara), ili se pak uzima neka druga komponenta.


..i onda nakon što se klijent prijavio na centralni server prilikom slanja poruke server će znati od koga je poruka (po ip adresi koja je prethodno prijavljena kad se klijent logirao), te će tu poruku kroz for petlju poslati svim ostalim ip adresama koje su kod njega prijavljene. Tako će zapravo jedna poruka upućena na centralni server biti proslijeđena svima koji su na taj server prijavljeni (logirani).

Možda malo zvuči komplicirano no ne vjerujem da je preveliki problem za shvatiti. Također, ne mora nužno biti UDP. Može i TCP. UDP je više pogodan ako je riječ o lokalnoj mreži pa preko broadcasta svatko tko chata zapravo "glumi" centralni server.
[ milos 2 @ 21.05.2010. 12:50 ] @
sve je to ok, ali kako da napravim ako je npr. 16 korisnika ulogovano na server, da ja odaberem sa kim cu da se dopisujem, i kako IP adresi da dodelim nick?
[ kiklop74 @ 21.05.2010. 13:31 ] @
[ itf @ 21.05.2010. 13:46 ] @
Citat:
milos 2: sve je to ok, ali kako da napravim ako je npr. 16 korisnika ulogovano na server, da ja odaberem sa kim cu da se dopisujem, i kako IP adresi da dodelim nick?
Uopće ne čitaš što gore pišem a meni je dosadilo da ponavljam. Imaš gore video, imaš uputstva, a crtati mi se neda. Zapravo, napravi si osnovni chat s dva računala pa si onda osmisli kako da to proširiš. Tek kad sam probaš i vidiš kako to radi će ti valjda biti jasnije.
[ milos 2 @ 21.05.2010. 16:18 ] @
napravio sam za dva racunara, i znam kako sa tim osnovnim da prikacim da svi vide poruku, tako da cu morati da malo vise trazim po net-u
[ tkaranovic @ 22.05.2010. 04:28 ] @
Evo kako bi radio Indy server na koji bi bili ulogovani klijenti sve vreme četovanja. Neću staviti kod nego izvršne fajlove za one koji bi da probaju kako radi. Staviću i slikicu da može samo da se pogleda.

Umesto koda evo hint šta treba tražiti u kodu za server (za komunikaciju sa ulogovanim klijentima):

TList *Lista = IdTCPServer1->Contexts->LockList();

[ itf @ 22.05.2010. 07:54 ] @
Ključni dio koda za listanje prijavljenih IP adresa na serveru bi bio ovo:

Code:
TList *list = S1->Contexts->LockList();
ListBox1->Items->Clear();
for (int i = 0; i < list->Count; i++) {
    TIdServerContext *peer = (TIdServerContext*) list->Items[i];
    ListBox1->Items->Add(peer->Connection->Socket->Binding->PeerIP);
}
S1->Contexts->UnlockList();


Ovo podrazumijeva da je klijent konstantno spojen na server. Sad preko ovoga se mogu dalje slati poruke.
[ tkaranovic @ 22.05.2010. 11:04 ] @
Citat:
itf: Ključni dio koda za listanje prijavljenih IP adresa na serveru bi bio ovo:

Code:
TList *list = S1->Contexts->LockList();
ListBox1->Items->Clear();
for (int i = 0; i < list->Count; i++) {
TIdServerContext *peer = (TIdServerContext*) list->Items[i];
ListBox1->Items->Add(peer->Connection->Socket->Binding->PeerIP);
}
S1->Contexts->UnlockList();


Ovo podrazumijeva da je klijent konstantno spojen na server. Sad preko ovoga se mogu dalje slati poruke.


Da se koriste IP adrese za slanje poruka klijentima?

Nema potrebe. Pošto su klijenti već konektovani može direktno njima, umesto ...->Binding... ovako:

Code:

        peer->Connection->Socket->Write(Poruka.Length());
        peer->Connection->Socket->Write(Poruka);


Tako server program šalje poruke klijentima u primeru koji sam poslao. Klijen programi koje sam posao nemaju uopšte tidtcpserver komponentu (ima samo tidtcpclient), a server program nema tidtcpclient nego samo tidtcpserver.


[ itf @ 22.05.2010. 11:26 ] @
U mom primjeru koda ne koriste se IP adrese za slanje poruka već samo da se izlistaju aktivni klijenti u listboxu. A dalje za sve se koristi pokazivač peer.

Citat:
tkaranovic: ...Klijen programi koje sam posao nemaju uopšte tidtcpserver komponentu (ima samo tidtcpclient), a server program nema tidtcpclient nego samo tidtcpserver.

Serveru nije potrebna klijent komponenta, no ne razumijem na koji način klijent aplikaciji ne treba server komponenta. Koliko znam, da bi indy tcp klijent mogao čitati nešto mora biti u stanju čekanja, što znači da klijent kada očekuje odgovor (poruku) je zablokiran sve dok ju ne dobije ili dok se ne dogodi timeout, pa tako nije moguće ništa s njim raditi (niti slati druge poruke) dok mu ne stigne odgovor (poruka) od servera? Upravo zbog toga bi se tu trebala nalazi server komponenta koja bi okidala OnExecute event i primala poruke bez obzira na to što trenutno radi klijent komponenta.

Ajd prikaži code ako već nije tajna?

EDIT: Sad sam malo bolje pogledao tvoj primjer, pa i napravio vlastiti klijent da provjerim jednu pretpostavku. Kako mi se čini tvoja klijent aplikacije pošalje poruku server i zatim odmah ode u stanje čitanja jer čeka da joj server vrati tu istu poruku. Na taj način nije potrebna server komponenta. No kvaka je u tome što ovo samo radi ako su server i klijent na istoj ip adresi. I na svojoj slici si pokazao upravo to - dva klijenta na istim ip adresama kao i server. Kada bi server bio na jednoj ip adresi a klijenti na drugim ip adresama onda bi poruku dobio samo onaj klijent koji ju je poslao, a ostali ne bi. Ona bi bila u bufferu i čekala dok ti ostali klijenti ne budu u stanju čekanja (a umjesto toga možda su u stanju slanja druge poruke). Stoga, to po meni ne ide bez server komponente, pa tako niti ovaj tvoj primjer neće raditi na različitim računalima.

No, možda sam fulao pa nisi tako rješio, ali kako mi se čini, jesi, jer bez server komponente klijenti na drugim ip adresama neće uopće znati da išta očekuju na ulazu.

[Ovu poruku je menjao itf dana 22.05.2010. u 13:09 GMT+1]
[ itf @ 22.05.2010. 13:55 ] @
Zapravo mi se ovo čini dosta kompliciranije nego što bi trebalo biti.... Vjerovatno može jednostavnije, pa ako itko zna kako neka napravi, a evo mog rješenja:



Program + source code (BCB 2010).
http://www.box.net/shared/obnmess81h
[ milos 2 @ 22.05.2010. 16:13 ] @
hvala ti mnogo na ovome, ali gde mogu da nadjem da sginem borland c bilder 2010, ja na svim torentima i share-ovima nalazim samo sesticu
[ tkaranovic @ 23.05.2010. 18:45 ] @
Možda više i nije bitan odgovor jer milos 2 ne može da koristi ali...


Citat:
itf
Serveru nije potrebna klijent komponenta, no ne razumijem na koji način klijent aplikaciji ne treba server komponenta. Koliko znam, da bi indy tcp klijent mogao čitati nešto mora biti u stanju čekanja, što znači da klijent kada očekuje odgovor (poruku) je zablokiran sve dok ju ne dobije ili dok se ne dogodi timeout, pa tako nije moguće ništa s njim raditi (niti slati druge poruke) dok mu ne stigne odgovor (poruka) od servera? Upravo zbog toga bi se tu trebala nalazi server komponenta koja bi okidala OnExecute event i primala poruke bez obzira na to što trenutno radi klijent komponenta.

Ajd prikaži code ako već nije tajna?


Napravio sam klijent koji ima okidajući OnExecute event i zamenio kod klijenta koji sam poslao a radi u suštini na isti način. Ipak code klijenta je u obj fajlu. :)

Citat:
itf
EDIT: Sad sam malo bolje pogledao tvoj primjer, pa i napravio vlastiti klijent da provjerim jednu pretpostavku. Kako mi se čini tvoja klijent aplikacije pošalje poruku server i zatim odmah ode u stanje čitanja jer čeka da joj server vrati tu istu poruku. Na taj način nije potrebna server komponenta. No kvaka je u tome što ovo samo radi ako su server i klijent na stoj ip adresi. I na svojoj slici si pokazao upravo to - dva klijenta na istim ip adresama kao i server. Kada bi server bio na jednoj ip adresi a klijenti na drugim ip adresama onda bi poruku dobio samo onaj klijent koji ju je poslao, a ostali ne bi. Ona bi bila u bufferu i čekala dok ti ostali klijenti ne budu u stanju čekanja (a umjesto toga možda su u stanju slanja druge poruke). Stoga, to po meni ne ide bez server komponente, pa tako niti ovaj tvoj primjer neće raditi na različitim računalima.

No, možda sam fulao pa nisi tako rješio, ali kako mi se čini, jesi, jer bez server komponente klijenti na drugim ip adresama neće uopće znati da išta očekuju na ulazu.


Evo klijent sa IdTCPClientEx koji ima OnExecute metodu koji se događa samo onda kada Sever pošalje poruku. TIdTCPClientEx je TIdTCPClient + OnExecute. (Server program je samo sa IdTCPServer.)
[ milos 2 @ 23.05.2010. 20:20 ] @
ja nisam hteo da zloupotrebim tudje delo, trebalo mi je objasnjenje za skolu inace, ali ako si ti shvatio drugacije, ok. Ja sam hteo da vidim sistem kako se radi, da mogu da uradim sam svoj program, ovih dana nemam mnogo vremena, jer sutra imam 2 kontrolna i 2 odgovaranja, ali napravicu, pa cu okaciti, da se uveris da ne koristim tudje delo u potpunosti, inace, ako se malo potrudim mogu u 6-ici da napravim, jer mogu da otvorim .obj, .cpp fajl, gde mi pise ceo kod, i komponente sa kojim dogadjajima su koriscene, public, i private funkcije, ali onda bi to stvarno bila zloupotreba.

hvala ti itf sto si okacio odmah i source fajlove. cak mislim da to moze da otvori visual studio, ali ne shvatam zasto necete da mi kazete gde mogu da skinem BCB10.
[ itf @ 23.05.2010. 21:11 ] @
Citat:
milos 2: ja nisam hteo da zloupotrebim tudje delo, trebalo mi je objasnjenje za skolu inace, ali ako si ti shvatio drugacije, ok. Ja sam hteo da vidim sistem kako se radi, da mogu da uradim sam svoj program, ovih dana nemam mnogo vremena, jer sutra imam 2 kontrolna i 2 odgovaranja, ali napravicu, pa cu okaciti, da se uveris da ne koristim tudje delo u potpunosti, inace, ako se malo potrudim mogu u 6-ici da napravim, jer mogu da otvorim .obj, .cpp fajl, gde mi pise ceo kod, i komponente sa kojim dogadjajima su koriscene, public, i private funkcije, ali onda bi to stvarno bila zloupotreba.

hvala ti itf sto si okacio odmah i source fajlove. cak mislim da to moze da otvori visual studio, ali ne shvatam zasto necete da mi kazete gde mogu da skinem BCB10.

Ovo što sam prikačio sam dao na slobodnu upotrebu, tako da to možeš koristiti kako god želiš. A što se tiče BCB-a... Sumnjam da će ti itko ovdje dati link na nelegalnu verziju bilo kakvog software, a ja pošto radim u BCB-u sam sebi kupio original verziju. Općenito mislim da ti može koristiti bilo koja verzija BCB-a koja ima Indy 10 komponente, a to je svakako BCB 2009, a mislim i BCB 2007, ali za njega nisam 100% siguran.

[ milos 2 @ 23.05.2010. 21:23 ] @
ja imam 6-icu, postoje indy komponente, ali neke fajlove ne mogu da otvorim, a verziju iznad 6-ice, ni trial verziju ne mogu da nadjem
[ itf @ 23.05.2010. 21:30 ] @
Citat:
milos 2: ja imam 6-icu, postoje indy komponente, ali neke fajlove ne mogu da otvorim, a verziju iznad 6-ice, ni trial verziju ne mogu da nadjem

U 6-ici je Indy 8 kako se sjećam, a u 2006 je Indy 9. Niti jedan od njih ti ne odgovara da bi pokrenuo gornji code.
[ milos 2 @ 23.05.2010. 22:18 ] @
evo sada sam skinuo sa neta embarcadero RAD studio 2010, i tu ima kao instalacija BCB10 i delphi 10, pa sada kada instaliram cu videti da li je to to
[ milos 2 @ 30.05.2010. 19:53 ] @
mozda sada vec mnogo trazim, ali da li mozes da mi objasnis delove koda?
[ itf @ 01.06.2010. 10:58 ] @
Nemaš mnogo koda. Što ti nije jasno?
[ milos 2 @ 01.06.2010. 19:06 ] @
zasto se kod servera kada primi IP adresu sakljucava lista

ali nije vise bitno