Home > doc > network 
 en fr de es it nl pl pt pt_BR mk ca hu cs tr ar fa id vi ko ja ru zh zh_TW eo
Previous  Next  Edit  Rename  Undo  Refresh  Search  Administration  
Documentation
History
 
Warning! This page is not up to date.  See english version 
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:

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:

=gb.xml janë veglat për tu lidhur me botën

Shënoni se gb.xml akoma nuk është plotësisht i implementuar.

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:

Tani le të implementojmë dy programe për të luajtur me TCP dhe prizat Lokale:

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:

  1. Krijoni një projekt të ri të thirur "Sock1".
  2. Shkoni tek "project","properties","components", largoni "qt" dhe shtoni "net", pastaj shtipni "OK"
  3. Shtoni një modul të ri të thirur M1.
  4. 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:
  ...
  CLOSE #MySock
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.

  1. Krijoni një projekt të ri të thirur "Sock2".
  2. Shkoni tek "project","properties","components", largo "qt" dhe shto "net", pastaj shtip "OK"
  3. Shtoni një klasë të re të thirur "ClsMain".
  4. 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.

  1. Krijoni projekt të ri të emruar "Srv".
  2. Shkoni në "project","properties","components", largoni "qt" dhe shtoni "net", pastaj shtipni "OK"
  3. Shtoni klasë të re të emruar "ClsServer".
  4. 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