PDA

Prikaži potpunu verziju : Socketi šta je to tačno, i čemu služi.


zokocx
21.5.2010, 13:01
Već jedno vreme radim na samoedukacije konkretno C# i .NET 2.0 ,i dosao sam do dela gde treba da napravim ovako nesto, za pocetak:
Server program koji osluškuje na nekom portu i kad primi određenu poruku da odgovori klijentu ,i naravno klijent koji pokusava da se konektuje preko nekog porta na taj server i salje neku poruku.

Na netu nalazim gomilu teoretisanja oko šta su socketi , pa ae možda neko zna da mi pojsni na malo jednostavniji načim.
I ako neko može da pomogne oko koda.

(Znam trebaćemi i rad sa nitima ,ali sa time se snalazim kolko tolko).

irreal
21.5.2010, 16:01
ne brini se, u .NET-u ces ovo izvesti jako jednostavno.

evo, ja sam bas pre nedelju dana napravio mini chat server i klijente za isti, za podrskom za kanale, nickove i svasta nesto (lici na jednostavniji irc)

tako da ako se bilo gde zaglavis mocicu da ti pomognem.
jedino sto, nazalost, ne mogu da te vodim korak po korak jer mi nedostaje slobodnog vremena za tako nesto.

za pocetak cu ti objasniti osnovnu logiku koju ces pratiti.

server kreira objekat TcpListener (System.Net.Sockets.TcpListener)
podesi port, i pokrene start metodu.

nakon toga kada nad tim objektom pozoves .AcceptTcpClient, taj poziv ce da blokira konkretnu nit sve dok neko ne pokusa da se konektuje.

dakle ideja je da inicijalizaciju objekta i podesavanje odradis negde, a onda u beskonacnoj petlji pozivas accept connection, i svaki put kada primis konekciju, od nje ces dobiti objekat TcpClient, njega prosledis novoj niti koja ce sluziti samo za komunikaciju sa tim klijentom.

dakle za svakog klijenta kreiras po nit.
(pretpostavljam da ne pravis server za neku nenormalnu kolicinu klijenata...)

sa TcpClientom komuniciras krajnje jednostavno. kada hoces da mu pises, kreiraces objekat tipa StreamWriter (System.IO.StreamWriter), a stream ces dobiti pozivom .GetStream() na TcpClient.

znaci nesto tipa

System.IO.StreamWriter sw = new System.IO.StreamWriter(tcpClient.GetStream());

zatim mozes jednostavno sw.Write("podaci koje saljes");
i obavezno pozovi posle toga sw.Flush(); jer inace ne salje nista dok se ne popuni ceo bafer.

napomena: ako nakon sto zavrsis slanje pozoves sw.Close(); nece se zatvoriti samo taj streamwriter nego i ceo socket ka klijentu, a to definitivno nije ono sto zelis (osim ako nisi zavrsio komunikaciju sa njim)

zato samo pusti sw da ode van scope-a (ili mu dodeli null)

za citanje ista procedura, samo umesto StreamWriter kreiras StreamReader, pozivas .Read() ili .ReadLine(), kako ti odgovara. mozes, ja mislim, i sa .peek da vidis da li ima neceg u baferu bez konzumiranja tog neceg.


i to ti je manje vise cela mudrost.

ne znam kolko se snalazis sa stream-ovima (da li si radio recimo sa fajlovima na hard disku), ovo moze prilicno konfuzno da izgleda ako nemas iskustva, al veruj mi da je krajnje prosto.

ako te nesto konkretno muci - napisi :)

zokocx
21.5.2010, 22:35
E hvala puno, radio sam sa StreamReader i StremWriter na fajlovima tj. napravio sam skoro kompletni WordPad samo fali stampa i neka sitnci ... i posle sve sto mi pada na pamet.

Dosta me interesuje server-client programiranje tj. izrada takvih aplikacije ...a konkretno ocu da uradim FTP server i klijent po spec. u RFC959 koji sam procitao neke delove ,ali ne znam osnovu, to oko konekcija. Otkrio sam da ima vec gotova klasa za koriscenje FTP u .Net ,ali necu to ocu sam i bas mi treba da to uradim. Kasnije kad ovo skontam bacam se na nesto teze (mnogo teze) to negde leti kad bude bilo vremena (Bittorrent implementaciju, moze i da se pridruzis :D , detalje posle).

Za FTP sam nasao primere ,ali svi su nepregledni tj. jedan je dobar ali nemogu da izdovojim taj deo sa konekcijom zato sto lik koristi Event-ove i Delegate a tek sam skontao kako funkcijonisu Event-ovi (i to ne skroz).

Ivan452
21.5.2010, 23:28
Pa posto si jos kako i sam kazes na pocetku ja bih ti preporucio prvo da napravis jednostavan chat sa barem 2 klijenta i serverom. Cisto da bi shvatio kako funkcionise server-klijent. Pa onda tu aplikaciju ces lako unaprediti u FTP.

Sto se tice socketa(ili na srpskom uticnica), jednostavno to ti je kombinacija IP adrese i porta koju koristis pri komunikaciji.

Sto se tice delegata...hmm..mislim da ti to jos uvek nije potrebno ali koristi ti se kada imas neku promenu ali jos uvek nemas objekat na koji ce ona delovati. Malo komplikovano ovako zvuci mozda ga i ja nisam najbolje objasninio ali potrazi primere na netu.

Srecno :)

irreal
22.5.2010, 8:53
Sto se tice delegata...hmm..mislim da ti to jos uvek nije potrebno

au contraire!

delegati ce ti recimo sigurno zatrebati kod rada sa nitima.

glavni, main thread kreira Formu i kontrole na istoj.
nakon toga, samo taj glavni Thread moze istu tu formu i kontrole da menja.

sta ces da uradis kada hoces, recimo, iz drugog thread-a koji komunicira sa klijentom da osvezis textbox na threadu (da prikazes sta je klijent otkucao, recimo) ?

moraces u tom drugom threadu da definises sta treba da se uradi, pa taj posao da delegiras glavnom threadu, da on to odradi, jer su u njegovom vlasnistvu forma i kontrole.

suvise je opsirna i kompleksna teorija da bi sada u ovom postu ulazio u detalje koriscenja delegata (sto za update forme iz drugog threada sto u druge svrhe)

ali trebace ti sigurno.

jedino je pitanje da li ces ih nauciti "napamet" (kopirati i prilagoditi neki kod) ili ces dubinski shvatiti teoriju iza svega toga.

iskreno, ako si jos uvek pocetnik, ni sam nisam siguran sta ti je od ta dva bolje :)

zokocx
22.5.2010, 16:48
Pa posto si jos kako i sam kazes na pocetku
Sto se tice socketa(ili na srpskom uticnica), jednostavno to ti je kombinacija IP adrese i porta koju koristis pri komunikaciji.
Srecno :)

Pa nisam skroz na pocetku ucenja C# (nedaj boze da ste pomisleli ili programiranja, znam sve te stvari oko klasa,objekata, nasledjivanja,enkapsulaciji, polimorfizma, i dosta drugo) , ali recimo do sada nisam napravio aplikaciju koja je distribuirana ,ili neku multithread aplikaciju ... nisam imao potrebe za tim a sto se tice kontrola ... istrazio sam jedno oko 50% kontola neke u sitna crevca neke malo manje. Jedno 6 meseci i vise cackam C#... ali to ne svakodnevno, pocetnik sam ,ali ne totalni.


iskreno, ako si jos uvek pocetnik, ni sam nisam siguran sta ti je od ta dva bolje :)

Pa prvo cu probati da skontam bar povrsno kroz neki primer ... sa citanjem Programming C# 3.0 od O'REILLY-a tj. taj deo. A primer radim iz Head First C# isto O'R. Nema pojma ni da li su to OK knjige za C#, meni je Head 1st pomogao da prevalim pocetke.

holodoc
22.5.2010, 16:56
Imaš online mislim u jednoj staroj MSDN arhivi par odličnih video tutorijala od kojih se neki baš bave socketima samo kad bih se ja setio gde su :( Znam da sam pre jedno godinu-dve studentima skidao i rezao te tutorijale pa ako ih ne budem našao online možda ih okačim na neki server za download.