Programimi i Rrjetit
E shkruar nga Daniel Campos.
Disa përmirësime nga Benoît Minisini.
Hyrje
E ardhmja, për së paku për vitet e ardhshme,bazohet në rrjete dhe standarde.
Edhe kompanitë e mëdha që gjithmonë provojnë të fshehin të gjitha formatet e brendshme të skedarëve të tyre, kanë ndryshuar mendjen pjesërisht, dhe duket që tani kanë zbuluar zjarrin, kur flasim për XML, SOAP, RPC, dhe gjëra të tilla, që me siguri sot mund të jenë gjëra të zakonshme nëse do të përpiqeshin pak apo të jepnin të holla për to në të kaluarën.
Mendoni se...
Sot askush nuk mund të imagjinojë pajisje të izoluara : duhet të nxjerrni të dhëna nga ato, dhe të dini se ç'po ndodh edhe nëqoftëse jeni në anën tjetër të botës.
Pajisjet bëhen nga prodhues të ndryshëm, dhe blerësit mendojnë se nuk është çështje e tyre që t'i bëjnë ato të jenë të përputhshme. Prandaj, kompanive ju duhen standarde për të ndarë informacione.
Kompanive ju duhet të kontrrollojnë paratë e tyre, informacioni është fuqi dhe një ndryshim për të bërë dhe për të fituar para tjera. Kompanitë i besojnë mbështetjes nga kompanitë e harduerit dhe softuerit.
Kështu që...
Sisteme të reja back-office të siguruar nga kompanitë kryesore, bazohen në standarde të njohura, kryesisht: bazat e të dhënave (SQL), serverat http si Apache, XML, RPC dhe SOAP. Nëse kompanitë e mëdhaja veprojnë në atë mënyrë, kompani të mesme dhe të vogla do të veprojnë njejtë...ose zhduken.
XML, RPC dhe SOAP
Kur dikush mëson XML, mendimi i parë është "çfarë gjëra të kota". Pra, XML duket që është shenja e vetme dhe të dhënat e rastësishme që vendosni në një skedar. Dhe XML është vërtet kjo. Fuqia e XML është që ajo është një standard ndërkombëtar, dhe të cilën njerëzit dhe kompjuterët lehtë mund ta përdorin. Shumë njerëz mund ta mësojnë atë, jo vetëm programuesit, krijojnë një zbatim, shkruajnë nj dokument XML me një redaktues teksti dhe shumë biblioteka dhe softuer tjerë do të ndihmojnë të ndajnë dokumentet e tyre, apo të përkthejnë atë në
HTML ose raporte të bukura PDF.
Dhe HTTP është vetëm një protokol, ka shumë prej tyre. Protokolet janë sikur gjuha që është për njerëzit, Nëse dy prej më shumë njerëzve dijnë një gjuhë, ato mund të ndajnë informacione. Por lindja e Arpanet dhe zhvillimi i Internetit bënë që ky protokol të jetë mjaft i famshëm: përdoret për të pranuar ueb faqe, imazhe, skedarë, të dhëna komerciale dhe gjith gjërat që imagjinoni nga serverat të cilët janë të vendosur rreth kësaj bote. Pra, pothuaj të gjitha harduerat dhe softuerat e rrjetit (rrugëzuesit, firewall, kompjuterat me përdorues të fundit, serverë...) janë të gatshëm për të menaxhuar këtë protokol. Mendo dy herë: Nëse përdorni HTTP për të dërguar dhe për të pranuar informacionet tuaja, nuk duhet të brengoseni për ubikimin fizik të qëllimit tuaj : të gjitha harduerat në të gjithë botën, një rrjetë e madhe e nënrrjeteve, do të bartin informacionin pa ju bërë asnjë pyetje, vetëm shtyp butnin e djathtë (pra, zakonisht edhe butonin e majtë të miut) , dhe le të punojë makina e madhe.
Këtu e gjejmë XML-RPC dhe SOAP. Ato janë protokole për t'iu mundësuar kopmjuterëve të kontaktojnë mes vete. Duke përdorur këtë protokol, ato mund të bëjnë më shumë se ndarja e disa dokumenteve: një kompjuter mund të dërgojë urdhëra në kompjuterat tjerë për të kryer disa detyra, dhe pastaj kompjuteri i dytë do të kthejë rezultatin e veprimit. Mund të gjeni këtë në kompjuterin tuaj : disa programe thërrasin bibliotekat dhe programe tjera për të kryer punën e tyre. Gjëja e vetme e re në XML-RPC dhe SOAP, është se tani bisedat nuk janë vetëm në kompjuterin tuaj, por mes dy kompjuterave.
Por kjo është një gjë e madhe. Mendimi nuk është aspak i ri, por tani bazohet në standardet e rrjetit dhe formateve të të dhënave: Për të dërguar informacione HTTP, XML për të shkruar urdhëra, pyetje dhe përgjigje. Fundi i kësaj është se sot, është mjaft leht për programuesit dhe edhe për disa përdorues, të shkruhen programe të cilat do të lidhen me programe tjera që ekzekutohen në kompjuterë të tjerë, në pjesë të ndryshme të botës. Dhe pika tjetër me rëndësi është se, nuk duhet të keni një platformë të përcaktuar harduer-softuer, ato janë standarde : mund të bleni harduer dhe softuer nga furnizues të ndryshëm. Mundtë bleni atë që ju duhet : çmim i ulët? efekt i lartë? shkallëzim?, vetëm shiko, krajaso, dhe blej ose edhe përdor lirshëm gjrat më të mira për vete.
Gambas duhet të jetë atje
Gambas duhet të zbatojë standarde, dhe do të thoja më mirë :
Linux i duhet
Gambas.
Gambas është përkthyes i gjuhës BEJZIK. BEJZIK është një gjuhë e lehtë, çdokush mund të mësojë ngapak, dhe të fillojë të bëjë programe dhe skripte të vogla. Shum programues filluan të mësojnë BEJZIK që kur ishin fëmijë, ndoshta në CPU prej 8-bit. Shumë njerëz që punojnë në seksione të ndryshme të kompanive të ndryshme, dijnë së paku ngapak nga gjuha BEJZIK. Ato nuk janë programues, por kanë atë që ju duhet meqë mund të shkruajnë makro për t'i ndihmuar në punën e tyre me baza të vogla ose të esme të të dhënave, fletëllogaritëse dhe dokumente tekstuale. Ata dijnë si të krijojnë një formular, të shkruajnë dhe të lexojnë të dhëna nga tabelat, të nndajnë disa informacione duke dërguar aato me postë... Nga ana tjetër, ka ueb zhvillues me ton, tepër të zënë për të mësuar rreht treguesve dhe menaxhimit të memories, ata duhet të shkruajnë
HTML, të krijojnë pikatura të bukura, të administrojnë serverat, të manovrijnë me gënjeshtrat dhe shumë gjëra tjera. Atyre iu duhet një gjuhë e thjeshtë për të krijuar
CGI. Ka gjëra si PHP ose Perl, por ka një të quajtur ASP i cili nuk është më shumë se BEJZIK i përzier me HTML, pra ata dijnë BEJZIK.
Pra, përfundojmë që shumë njerëz presin që BEJZIK të shpërngulet tek
Linux. Çka mund të bëjmë këtu? Jemi në mes të rrugës : kemi një GUI ë thjeshtë dhe të dizajnuar mirë (jo shumë projekte mund ta thonë këtë), kemi përkthyes dhe kemi shumë biblioteka të shkruara në C ose C++ që presin të na ndihmojnë, mund të jetë API më i madh që ndonjë sistem operativ ka njohur ndonjëherë. Për të kaluar në pjesën tjetër na duhet vetëm të pranojmë ato standarde që do të mundësojnë që programuesit dhe përdoruesit të lidhen me informacionet qi iu duhen.
Rrjeti
Përbërës është një pjesë e atij qëllimi: Le të hapim derën që do të na japë pjesën tjeëtr të botës.
Komponentat e rrjetit
Nuk është në të vërtetë një
Përbërës, do të ekzekutohet në (së paku) tri përbërës:
gb.net,
gb.net.curl dhe
gb.xml.
gb.net është ma e mira e të gjithave:
Aktualisht ueb bazohet në protokolet TCP/IP. Mund të themi që pjesa e IP e këtij protokoli është çështje e sistemit operativ, duhet të kujdesemi për pjesën TCP. Për të ekzekutuar të gjitha gjërat kemi klasat në vijim:
- DnsClient: është një Klasë përtë konvertuar emra pritës (si "Gambas.sourceforge.net"), të cilët kuptohen nga njerëzit në IP adresa (si 192.168.0.1) që janë emrat e vërtetë për kompjuterë. Mund të kryej funksionin e tij duke përdorur burime nga sistemi operativ: DNS, NIS, skedar pritës,NMB të rregulluar, LDAP, etj...
- Socket : për të ndarë informacione me serverë, duhet të vendosim një lidhje TCP. Kjo klasë mund ta bëj atë, dhe mund të dërgojë dhe të pranojë të dhëna në formatin "e papërpunuar".
- ServerSocket: ndonjëherë ne do të jemi serverë dhe duhet t'i lejmë klientët të lidhen me ne. Kjo është klasa për ta bërë atë duke përdorur TCP/IP.
- UdpSocket: disa detyra të internetit, si transferim i të dhënave rrjedhëse multimedia, nuk funksionojnë nëse nuk përdorin lidhje, pra to zakonisht ërdorin UDP, një mënyrë më "primitive" të transferimit të të dënave, pa kontrrollim të rrjedhjes. Klasa datagram ka për qëllim të krijojë UDP klientë dhe server.
- Prizat Lokale apo Unix: ndonjëherë nuk kemi nevojë të lidhemi me kompjuterë tjerë, por me prograe tjera në të njejtin kompjuter. Përdorimi i TCP për këtë nuk ka efekt, dhe humbni burim të kufizuar siç janë portat TCP. Prizat Unix janë priza lokale të implementuara nga sistemi operativ për të "matur" prizat TCP në kompjuter ( ah mirë, kjo nuk është një konsultim teknik, thjesht provoj të jap një mendim, e dini?), dhe ndarja e të dhënave duke përdorur këtë Metoda është shumë e shpejtë dhe e shtrejtë. Të dyja prizat e klientëve? dhe Priza e Serverit? mund gjithashtu të vendosin lidhje me unix-prizë.
- SerialPort: tani le të flasim për pjesën tjetër të botës informatike. Jo të gjitha pajisjet, veçanërisht të dizajnuara për detyra industriale ose tregtare kanë një lidhje rrjet në ajër. Mund të jetë që 70% e tyre kanë porta seriale RS-232, RS-485, ose RS-422. Dhe programuesit shpesh duhet të shkëpusin apo të dërgojnë informacione tek ato, dhe mandej të logarisin informacionet dhe ta konvertojnë atë në të dhëna që do të vendoset në një bazë të të dhënave, ueb faqe dhe kështu merradhë. Pra, ka gjithashtu një klasë të quajtur "Portë seriale" për të mundësuar dërgimin dhe pranimin e të dhënave duke përdorur një port serial.
Klasat Port Serial
Socket dhe UdpPriza trashëgojnë nga klasa e përgjithshme
Stream. Kjo do të thotë që mund të përdorni ato si përshkrues të skedarëve, duke përdorur metoda standarde
Gambas si "lexo", "shkruaj", apo "mbyll", ashtu që do ta keni të lehtë të mësoni t'i përdorni ato.
gb.net.curl
'libcurl' është një bibliotekë falas portative e shkruar nga disa njerëz në
http://curl.haxx.se. Siguron të gjitha pjesët e nevojshme për të drejtuar protokollet e rrjetit me nivel të lartë, si HTTP, FTP dhe TELNET. Kjo bibliotekë do të jetë e dobishme për të shkruar një
Përbërës me klasat vijuese:
- HttpClient : me përdorimin e ClientSocket? dhe ServerSocket? ju do të pranoni vetëm të dhëna të papunuara, të cilat do të duhet të drejtoni dhe të verefikoni. Ky klient ju mundëson që të lidheni me HTTP serveret (si Apache, po), duke i drejtuar të gjitha HTTP protokollet, duhet vetëm të keni kujdes për dokumentet (apo Objekti, si DOM njërzit do të thonin ) ju keni pranuar. (kjo Klasë është një deklaratë ALPHA )
- FtpClient : FTP protokolli është njëra nga veglat themelore për secilën kompani: ato mund të dërgojnë dhe pranojnë të dhënat, për shembull në ASCII format, dhe pastaj procesoni atë për të konsiliduar të dhënat në bazën e të dhënave. (akoma nuk është implementuar)
- TelnetClient? : Ju mundëson Gambas programeve të kontrollojnë nga largë tjera vegla. (akoma nuk është implementuar )
=gb.xml janë veglat për tu lidhur me botën
Shënoni se gb.xml akoma nuk është plotësisht i implementuar.
- Do të ketë së paku dy klasa të pastra XML:
- E bazuar në pemën Klasë : ruan të gjitha informacionet XML në memorie, e cila e bën shumë të lehtë punën me XML, mund të lëvizni në çdo pjesë të dokumentit, dhe ta modifikoni atë leht, dhe duke harxhuar shum pak kohë.
- Një klasë XMLReader, më konvencionale : lexon vetëm pjesë nga dokumenti XML nga një skedar, pa mbajtur atë ne memorie. Mund të jetë më e ngadalsur, por kur keni dokumenttë madh, modeli i bazuar në pemë mund të përdor të gjitha burimet nga memoria juaj, edhe të harxhojë kohë me kompjuterin.
- Mund të jetë një klasë SAX e bazuar XML : është e dobishme të analizoni dokumente përderisa jeni duke e pranuar atë nga një Transmetim i vazhdueshëm. (gjithashtu është e dobishmeedhe për gjëra të tjera)
- Atje do të ketë klasa XML-RPC të klientit : do të ju lejon juve të thirni RPC-serverët e larget dhe të pranonit të dhëna ashtu sikur të thirnit metodat nga programi juaj, apo së paku në një mënyrë shum të ngjajshme. Asgjë për TCP/IP apo XML, vetëm Integer, Vargjet, Koleksionet...
- Duhet të jetë gjithashtu XML-RPC serveri, për dy arsye : e para , të "decrypt" informacionet hyrëse nga klientët në XML format në tipet e të dhënave, dhe e dyta, të lejoj të krijojnë servere të vetë qëndrueshëm pa nevojën e "monsters" si Apache.
Në të ardhmen do të ketë punë në SOAP sferën. Idea e SOAP është shum e ngjajshme me XML-RPC, është gjithashtu e bazuar në XML dhe HTTP, por me SOAP ju mund të kryeni detyra shum më të ndërlikuara, është i fuqishëm , por nga ana tjetër është shum i ndërlikuar.
Programimi me gb.net komponentat
Prizat e Lidhjeve: Klientët dhe Serverët
Priza është vetëm një vend prej ku ju mund të lexoni dhe të shkruani të dhëna. Megjithatë, përcaktimi i prizave nuk bisedon për serverët, klientët, lidhjet, etj, kjo është një përmbajtje e vendosur në shtresën tjetër. TCP dhe priza Lokale janë implementime të veçanta të prizave në të cilën janë kontrollet rrjedhëse dhe hodhësitë për rolet e programit: klinetit dhe serverit.
Ka dy mënyra për të punuar me plza të lidhura:
- TCP prizat: mund ti përdorni ato për të komunikuar me programet lokale dhe të largëta.
- Prizat Lokale apo Uniks: vetëm për të komunikuar me programet në veglën tuaj.
Tani le të implementojmë dy programe për të luajtur me TCP dhe prizat Lokale:
- Klienti do të lidhet me serverin dhe do të dërogon një varg 'tungatjeta' në server.
- Serveri do të kthen 'mirupafshim'.
- Klienti do të mbyll lidhjen pasi të lexon mesazhin mirupafshim.
Fusha e Klientit : Që sillet si TCP apo Klient (Uniks) Lokal
Për të krijuar një program me të cilin ju do të lidheni me serverin e largët apo lokal duke përdorur TCP prizat apo prizat Lokale, ju duhet të përdorni "
Socket"
Klasë. Ne këtu do të përdorim dy mënyra për të implementuar atë, implementimi i parë nuk përdor asnjë
Ngjarje:
- Krijoni një projekt të ri të thirur "Sock1".
- Shkoni tek "project","properties","components", largoni "qt" dhe shtoni "net", pastaj shtipni "OK"
- Shtoni një modul të ri të thirur M1.
- Redaktoni kodin vijues...
Përpara
Main() Metoda, le të përcaktojmë një
Objekti nga '
Socket' klasa:
' Gambas module file
PUBLIC MySock AS Socket
...
Tani, gjëra e parë çka bëjmë është inicializimi i objektit:
...
PUBLIC SUB Main()
MySock=NEW Socket
...
Atëherë, ne duhet të lidhemi me serverin lokal apo të largët, ne duhet të përdorim metodën e Lidhu(). Nëse dëshirojmë të lidhemi duke përdorur protokollin TCP , ne duhet të saktësojmë emrin e pritësit të largët apo ip, dhe portet për tu lidhur në:
...
MySock.Connect ( "name_of_host",3450 )
...
Nëse kemi nevoj për tu lidhur në serverin Lokal (UNIX sockets), duhet të saktësojmë shtegun nga ajo socket:
...
MySock.Connect ("/path/to/socket")
...
Procesi i lidhjes kërkon kohë, kështu që ne num mundemi të fillojmë të dërgojmë apo të pranojmë të dhëna në vijën vijuse të kodit, në vend të, duhet të presim derisa lidhja është e përfunduar apo të mos ketë ndonjë gabim gjat mundimit për tu lidhur. Nëse lidhemi, "Statusi"
Vetia nga
Socket do të ndryshoj në vlerë
Socket.I lidhur (vlera 7), por nëse procesi i lidhjes dështon, Vetitë e Statusit do të ndryshojnë në vlerë më pak se zero. Kështu që, ne do të presim në lak...
...
DO WHILE (MySock.Status <> 7) And (MySock.Status >0 )
WAIT 0.1
LOOP
...
Shënoni se ju duhet të përdorni metodën "Prit", për të lënë
Cikli i ngjarjes të përditësoj
Socket Statusin.
Pas kësaj, le të tregojmë një gabim të kodit, diçka ka dështuar, apo, nëse lidhja është stabilizuar, le të dërgojmë disa të dhëna:
...
IF MySock.Status <> 7 THEN
PRINT "Error"
QUIT
END IF
WRITE #MySock, "hello",5
...
Tani, le të lexojmë zhvillo përsëri nga serveri . Së pari, presin deri sa ka të dhëna për tu lexuar, e kontrollojmë me metodën
Lof . Atëherë, do të lexojmë të dhënat:
...
DO WHILE Lof(MySock)=0
WAIT 0.1
LOOP
READ #MySock, sBuf, Lof(MySock)
PRINT sBuf
...
Përfundimisht, e mbyllim prizën:
Kjo është e gjitha.
Kodi i plotë është :
PUBLIC MySock AS Socket
PUBLIC SUB Main()
DIM sBuf AS String
MySock = NEW Socket
MySock.Connect("name_of_host", 3450)
DO WHILE (MySock.Status <> 7) AND (MySock.Status > 0)
WAIT 0.1
LOOP
IF MySock.Status<>7 THEN
PRINT "Error"
QUIT
END IF
WRITE #MySock, "hello",5
DO WHILE Lof(MySock)=0
WAIT 0.1
LOOP
READ #MySock, sBuf, Lof(MySock)
PRINT sBuf
CLOSE #MySock
END
Tani, le të implementojmë një version tjetër, duke përdorur ngjarjet e jo pritjet aktive.
- Krijoni një projekt të ri të thirur "Sock2".
- Shkoni tek "project","properties","components", largo "qt" dhe shto "net", pastaj shtip "OK"
- Shtoni një klasë të re të thirur "ClsMain".
- Braktis atë kodë:
Ne kemi nevojë për një shembull të klasës sonë, dhe
Socket:
' Gambas class file
STATIC App AS ClsMain
PUBLIC MySock AS Socket
...
Në _Metodën e Re nga klasa jonë, ne do të fillojmë lidhjen e prizës:
...
PUBLIC SUB _New()
MySock=NEW Socket AS "MySock"
MySock.Connect("name_of_host",3450)
END
...
Në metodën kryesore, ne krijojmë një shembull të ri të klasës sonë, dhe fillojmë të lidhemi, si _Metodë e re është e thirur kur krijohet një objekt :
...
STATIC PUBLIC SUB Main()
App=NEW ClsMain
END
...
Kur lidhja është zhvilluar me sukses, "Ready" ngjarja nga socket ngritet, dhe ne kemi nevoj për vargun tonë në server:
...
PUBLIC SUB MySock_Ready()
WRITE #MySock,"Hello",5
END
...
Por, nëse do të kishte ndonjë gabim, ngjarja e
Gabimit ngritet :
...
PUBLIC SUB MySock_Error()
PRINT "Unable to connect"
END
...
Kur të dhënat e reja arijnë, ngjarja e
Lexo ngritet, kështu që ne i lexojmë ato të dhëna, vendosim në ekran, and close the socket :
...
PUBLIC SUB MySock_Read()
DIM sCad AS String
READ #MySock,sCad,Lof(MySock)
PRINT sCad
CLOSE #MySock
END
....
Këtu është kodi i plotë:
' Gambas class file
STATIC App AS ClsMain
PUBLIC MySock AS Socket
PUBLIC SUB MySock_Ready()
WRITE #MySock,"Hello",5
END
PUBLIC SUB MySock_Read()
DIM sCad AS String
READ #MySock,sCad,Lof(MySock)
PRINT sCad
CLOSE #MySock
END
PUBLIC SUB _New()
MySock=NEW Socket AS "MySock"
MySock.Connect("name_of_host",3450)
END
PUBLIC SUB MySock_Error()
PRINT "Unable to connect"
END
STATIC PUBLIC SUB Main()
App=NEW ClsMain
END
Fusha e Serverit : Vepron si TCP apo Server (Unix) Lokal
Për të punuar me a a serverin, ne kemi nevojë për '
ServerSocket'
Klasë. Ndëgjon lidhjet, dhe kthen
Socket Objektitë ri për çdo lidhje të klientit, kështu që ne mund të drejtojmë klientë të llojllojshëm.
- Krijoni projekt të ri të emruar "Srv".
- Shkoni në "project","properties","components", largoni "qt" dhe shtoni "net", pastaj shtipni "OK"
- Shtoni klasë të re të emruar "ClsServer".
- Redaktoni atë kod:
Ashtu siç vepruam me shembullin e klientit të dytë, kemi nevojë për një shembull të klasës tonë. Gjithashtu kemi nevojë edhe për ServerSocket? objekt, dhe një koleksion të objekteve për të vendosur
Socket objektet të cilat ne duhet të komunikojmë me klientët tanë.
STATIC Server AS ClsServer
PUBLIC Clients AS Object[]
PUBLIC Srv AS ServerSocket
...
Në fillim të programit, ne krijuam shembullin e klasës tonë.
...
STATIC PUBLIC SUB Main()
Server=NEW ClsServer
END
...
Kur klasa është e ngarkuar nga përkthyesi, thëret në _të Ri
Metoda. Ne inicializojmë këtu koleksionin e objekteve, dhe fillojmë serverin. Për të bërë atë, ne duhet të saktësojmë TCP portin për të ndëgjuar , tipet e prizës, dhe thirrim për të 'Ndëgjuar'
...
PUBLIC SUB _New()
Clients =NEW Object[]
Srv=NEW ServerSocket AS "Srv"
Srv.Port=3450
Srv.Type=ServerSocket.Internet
Srv.Listen()
END
...
Nëse do të kishim dashtë të përdorim priza Lokale apo Uniks , në vend të TCP prizave, ne duhet të saktësojmë tipin lokal të prizës, dhe shtegun në vend të portit
...
PUBLIC SUB _New()
Clients =NEW Object[]
Srv=NEW ServerSocket AS "Srv"
Srv.Path="/path/to/my/socket"
Srv.Type=ServerSocket.Local
Srv.Listen()
END
...
Kur serveri është duke ndëgjuar, çdo herë kur klienti dëshiron të lidhet me shërbimet tona , '
Connection'
Ngjarje nga ngritjet e serverit. Këtu ne duhet të pranojmë atë lidhje duke thirur metodën 'Prano' . Kthen tek ne '
Socket' objekt për të drejtuar atë lidhje, kështu që atje do të ketë '
Socket' objekt për çdo klient të lidhur, të cilat ne i ruajmë në kujtesë të koleksionit të objektit tonë
...
PUBLIC SUB Srv_Connection(Host AS String)
DIM MySock AS Socket
PRINT "Accepting connection from --> " & Host
MySock=Srv.Accept()
Clients.Add(MySock)
END
...
Kiletët tonë do të na dërgojnë 'tungjatjeta' mesazhe, dhe atëherë ngjarja 'Lexo' nga '
Socket' do të ngritet. Shënoni se ne përdorim këtu '
LAST' fjalën kyçe për të ditur se cili prej klientëve tanë e ka dërguar mesazhin. Këtu e lexojmë atë varg , dhe dërgojmë vargun tonë 'mirupafshim'
...
PUBLIC SUB Socket_Read()
DIM sCad AS String
READ #LAST,sCad,Lof(LAST)
PRINT "Received data -->" & sCad
WRITE #LAST,"bye",3
END
...
Përfundimisht, pasi që klienti të kishte mbyllur lidhjen, ne pranojmë ngjarjen 'Mbyllur' , dhe e pastrojmë atë '
Socket' objekt nga koleksioni ymë, ashtu që ajo lidhje të mos ishte gjallë më
...
PUBLIC SUB Socket_Closed()
PRINT "Connection closed"
Clients.Remove(Clients.Find(LAST))
END
...
Kodi i plotë është :
' Gambas class file
STATIC Server AS ClsServer
PUBLIC Clients AS Object[]
PUBLIC Srv AS ServerSocket
PUBLIC SUB Socket_Read()
DIM sCad AS String
READ #LAST,sCad,Lof(LAST)
PRINT "Received data -->" & sCad
WRITE #LAST,"bye",3
END
PUBLIC SUB Socket_Closed()
PRINT "Connection closed"
Clients.Remove(Clients.Find(LAST))
END
PUBLIC SUB Srv_Connection(Host AS String)
DIM MySock AS Socket
PRINT "Accepting connection from --> " & Host
MySock=Srv.Accept()
Clients.Add(MySock)
END
PUBLIC SUB _New()
Clients =NEW Object[]
Srv=NEW ServerSocket AS "Srv"
Srv.Port=3450
Srv.Type=ServerSocket.Internet
Srv.Listen()
END
STATIC PUBLIC SUB Main()
Server=NEW ClsServer
END