1. M hnh client/server M hnh c ph bin nht v c chp nhn rng ri trong cc h thng phn tn l m hnh client/server. Trong m hnh ny s c mt tp cc tin trnh m mi tin trnh ng vai tr nh l mt trnh qun l ti nguyn cho mt tp hp cc ti nguyn cho trc v mt tp hp cc tin trnh client trong mi tin trnh thuc hin mt tc vu no cn truy xut ti ti nguyn phn cng hoc phn mm dng chung. Bn thn cc trnh qun l ti nguyn cn phi truy xut ti cc ti nguyn dng chung c qun l bi mt tin trnh khc, v vy mt s tin trnh va l tin trnh client va l tin trnh server. Cc tin trnh pht ra cc yu cu ti cc server bt ky khi no chng cn truy xut ti mt trong cc ti nguyn ca cc server. Nu yu cu l ng n th server s thuc hin hnh ng c yu cu v gi mt p ng tr li ti tin trnh client. M hnh client/server cung cp mt cch tip cn tng qut chia s ti nguyn trong cc h thng phn tn. M hnh ny c th c ci t bng rt nhiu mi trng phn cng v phn mm khc nhau. Cc my tnh c s dung chay cc tin trnh client/server c nhiu kiu khc nhau v khng cn thit phi phn bit gia chng; c tin trnh client v tin trnh server u c th chay trn cng mt my tnh. Mt tin trnh server c th s dung djch vu ca mt server khc. M hnh truyn tin client/server hng ti vic cung cp djch vu. Qu trnh trao i d liu bao gm: 1. Truyn mt yu cu t tin trnh client ti tin trnh server 2. Yu cu c server x l 3. Truyn p ng cho client M hnh truyn tin ny lin quan n vic truyn hai thng ip v mt dang ng b ha cu th gia client v server. Tin trnh server phi nhn thc c thng ip c yu cu bc mt ngay khi n n v hnh ng pht ra yu cu trong client phi c tam dng (bj phong ta) v buc tin trnh client trang thi ch cho t khi n nhn c p ng do server gi v bc ba. M hnh client/server thng c ci t dua trn cc thao tc co bn l gi (send) v nhn (receive). 119 Hnh 4.1 Qu trnh giao tip client v server c th din ra theo mt t rong hai ch : bj phong ta (blocked) v khng bj phong ta (non-blocked). Ch bj phong ta (blocked): Trong ch bj phong ta, khi tin trnh client hoc server pht ra lnh gi d liu (send), vic thuc thi ca tin trnh s bj tam ngng cho ti khi tin trnh nhn pht ra lnh nhn d liu (receive). Tong tu i vi tin trnh nhn d liu, nu tin trnh no (client hoc server) pht ra lnh nhn d liu, m tai thi im cha c d liu gi ti th vic thuc thi ca tin trnh cng s bj tam ngng cho ti khi c d liu gi ti. Ch khng bj phong ta (non-blocked) Trong ch ny, khi tin trnh client hay server pht ra lnh gi d liu thuc su, vic thuc thi ca tin trnh vn c tin hnh m khng quan tm n vic c tin trnh no pht ra lnh nhn d liu hay khng. Tong tu cho trng hp nhn d liu, khi tin trnh pht ra lnh nhn d liu, n s nhn d liu hin c, vic thuc thi ca tin trnh vn c tin hnh m khng quan tm n vic c tin trnh no pht ra lnh gi d liu tip theo hay khng. 2. Cc kin tr!c Client/Server 2.1. Client/Server hai tng (two-tier client/server) Kin trc client/server on gin nht l kin trc hai tng. Trong thuc t hu ht cc kin trc client/server l kin trc hai tng. Mt ng dung hai tng cung cp nhiu tram lm vic vi mt tng trnh din thng nht, tng ny truyn tin vi tng lu tr d liu tp trung. Tng trnh din thng thng l client, v tng lu tr d liu l server. Hu ht cc ng dung nternet nh l email, telnet, ftp thm ch l c Web l cc ng dung hai tng. Phn ln cc lp trnh vin trnh ng dung vit cc ng dung client/server c xu th s dung kin trc ny. 120 Tin trnh ang phong ta Tin trnh ang x l Request message Request message Reply Exeution !ait "er#er $lient Trong ng dung hai tng truyn thng, khi lng cng vic x l c dnh cho pha client trong khi server chi on gin ng vai tr nh l chong trnh kim sot lung vo ra gia ng dung v d liu. Kt qu l khng chi hiu nng ca ng dung bj gim i do ti nguyn han ch ca PC, m khi lng d liu truyn i trn mang cng tng theo. Khi ton b ng dung c x l trn mt PC, ng dung bt buc phi yu cu nhiu d liu trc khi a ra bt ky kt qu x l no cho ngi dng. Nhiu yu cu d liu cng lm gim hiu nng ca mang. Mt vn thng gp khc i vi ng dung hai tng l vn bo tr. Chi cn mt thay i nh i vi ng dung cng cn phi thay i lai ton b ng dung client v server. Hnh 4.2 2.2. Client/Server ba tng Ta c th trnh c cc vn ca kin trc client/server hai tng bng cch m rng kin trc thnh ba tng. Mt kin trc ba tng c thm mt tng mi tc bit vic x l d liu vj tr trung tm. Hnh 4.3 121 Theo kin trc ba tng, mt ng dung c chia thnh ba tng tch bit nhau v mt logic. Tng u tin l tng trnh din thng bao gm cc giao din hoa. Tng th hai, cn c goi l tng trung gian hay tng tc nghip. Tng th ba cha d liu cn cho ng dung. Tng th ba v co bn l chong trnh thuc hin cc li goi hm tm kim d liu cn thit. Tng trnh din nhn d liu v jnh dang n hin thj. Su tch bit gia chc nng x l vi giao din tao nn su linh hoat cho vic thit k ng dung. Nhiu giao din ngi dng c xy dung v trin khai m khng lm thay i logic ng dung. Tng th ba cha d liu cn thit cho ng dung. D liu ny c th bao gm bt ky ngun thng tin no, bao gm co s d liu nh Oracale, SQL Server hoc ti liu XML. 2.3. Kin tr!c n-tng Kin trc n-tng c chia thnh cc tng nh sau: Tng giao din ngi dng: qun l tong tc ca ngi dng vi ng dung Tng logic trnh din: Xc jnh cch thc hin thj giao din ngi dng v cc yu cu ca ngi dng c qun l nh th no. Tng logic tc nghip: M hnh ha cc quy tc tc nghip, Tng cc djch vu ha tng: Cung cp mt chc nng b tr cn thit cho ng dung nh cc thnh phn (truyn thng ip, h tr giao tc). ". M hnh tr#$%n tin socket Hnh 4.4 122 % "o&et'( )in*'( +isten'( ,ept'( $- h. n/ng gi #0 nh1n $lose'( "o&et'( )in*'( $onnet'( $- h. n/ng gi #0 nh1n $lose'( 1 2 3 4 5 2 Server Client Khi lp trnh, ta cn quan tm n ch bj phong ta, v n c th dn n tnh hung mt tin trnh no s roi vo vng lp v han ca qu trnh gi hoc nhn. Trong chong 1 chng ta bit hai giao thc TCP v UDP l cc giao thc tng giao vn truyn d liu. Mi giao thc c nhng u v nhc im ring. Chng han, giao thc TCP c tin cy truyn tin cao, nhng tc truyn tin bj han ch do phi c giai oan thit lp v gii phng lin kt khi truyn tin, khi gi tin c li hay bj tht lac th giao thc TCP phi c trch nhim truyn lai,.Ngc lai, giao thc UDP c tc truyn tin rt nhanh v n chi c mt co ch truyn tin rt on gin: khng cn phi thit lp v gii phng lin kt. Khi lp trnh cho TCP ta s dung cc socket lung, cn i vi giao thc UDP ta s s dung lp DatagramSocket v DatagramPacket. Truyn tin hng lin kt ngha l cn c giai oan thit lp lin kt v gii phng lin kt trc khi truyn tin. D liu c truyn trn mang nternet di dang cc gi (packet) c kch thc hu han c goi l datagram. Mi datagram cha mt header v mt payload. Header cha ja chi v cng cn truyn gi tin n, cng nh ja chi v cng xut pht ca gi tin, v cc thng tin khc c s dung m bo tin cy truyn tin, payload cha d liu. Tuy nhin do cc datagram c chiu di hu han nn thng phi phn chia d liu thnh nhiu gi v khi phuc lai d liu ban u t cc gi noi nhn. Trong qu trnh truyn tin c th c th c mt hay nhiu gi bj mt hay bj hng v cn phi truyn lai hoc cc gi tin n khng theo ng trnh tu. trnh nhng iu ny, vic phn chia d liu thnh cc gi, tao cc header, phn tch header ca cc gi n, qun l danh sch cc gi nhn c v cc gi cha nhn c, ... rt nhiu cng vic cn phi thuc hin, v i hi rt nhiu phn mm phc tap. Tht may mn, ta khng cn phi tu thuc hin cng vic ny. Socket l mt cuc cch mang ca Berkeley UNX. Chng cho php ngi lp trnh xem mt lin kt mang nh l mt lung m c th oc d liu ra hay ghi d liu vo t lung ny. V mt ljch s Socket l mt su m rng ca mt trong nhng tng quan trong nht ca UNX: tt c cc thao tc vo/ra ging nh vo ra tp tin i vi ngi lp trnh, cho d ta ang lm vic vi bn phm, mn hnh hoa, mt file thng thng, hay mt lin kt mang. Cc Socket che du ngi lp trnh khi cc chi tit mc thp ca mang nh mi kiu ng truyn, cc kch thc gi, yu cu truyn lai gi, cc ja chi mang... Mt socket c th thuc hin by thao tc co bn: Kt ni vi mt my xa (v du, chun bj gi v nhn d liu) Gi d liu Nhn d liu Ngt lin kt Gn cng Nghe d liu n Chp nhn lin kt t cc my xa trn cng c gn Lp Socket ca Java c s dung bi c client v server, c cc phong thc tong ng vi bn thao tc u tin. Ba thao tc cui chi cn cho server ch cc client lin kt vi chng. Cc thao tc ny c ci t bi lp ServerSocket. Cc socket cho client thng c s dung theo m hnh sau: Mt socket mi c tao ra bng cch s dung hm Socket(). Socket c gng lin kt vi mt host xa. 122 Mi khi lin kt c thit lp, cc host xa nhn cc lung vo v lung ra t socket, v s dung cc lung ny gi d liu cho nhau. Kiu lin kt ny c goi l song cng (full-duplex)-cc host c th nhn v gi d liu ng thi. ngha ca d liu phu thuc vo giao thc. Khi vic truyn d liu hon thnh, mt hoc c hai pha ngt lin kt. Mt s giao thc, nh HTTP, i hi mi lin kt phi bj ng sau mi khi yu cu c phuc vu. Cc giao thc khc, chng han FTP, cho php nhiu yu cu c x l trong mt lin kt on. &. Socket cho Client ".1. C#c constr$ctor public Socket(String host, int port) throws UnknownHostException, IOException Hm ny tao mt socket TCP vi host v cng xc jnh, v thuc hin lin kt vi host xa. V du: try{ Socket s = new Socket( www!nn!n",#$)% & c'tch(UnknownHostException e){ Syste(errprintln(e)% & c'tch(IOException e){ Syste(errprintln(e)% & Trong hm ny tham s host l hostname kiu String, nu host khng xc jnh hoc my ch tn min khng hoat ng th constructor a ra ngoai l UnknownHostException. V mt l do no m khng th m c socket th constructor s a ra ngoai l OException. C nhiu nguyn nhn khin cho mt lin kt tht bai: host m ta ang c gng kt ni ti khng chp nhn lin kt, kt ni nternet c th bj ngt, hoc vn jnh tuyn c th ngn nga cc gi tin ca ta ti ch. V du: Vit chong trnh kim tra trn 1024 cng u tin nhng cng no ang c server hoat ng i(port )'!'net*% i(port )'!'io*% cl'ss +ortSc'nner { public st'tic !oi, ('in(String-. 'rgs) { String host=/loc'lhost/% i0('rgslength1$){ host='rgs-$.% & 0or(int i=$%i23$45%i66){ try{ 123 Socket s=new Socket(host,i)% Syste(outprintln(/7o (ot ser!er ,'ng ho't ,ong tren cong8/6i)% & c'tch(UnknownHostException e){ Syste(errprintln(e)% & c'tch(IOException e){ Syste(errprintln(e)% & & & & public Socket(Inet9,,ress host, int port)throws IOException Tong tu nh constructor trc, constructor ny tao mt socket TCP vi thng tin l ja chi ca mt host c xc jnh bi mt i tng netAddres v s hiu cng port, sau n thuc hin kt ni ti host. N a ra ngoai l OException nhng khng a ra ngoai l UnknownHostException. Constructor a ra ngoai l trong trng hp khng kt ni c ti host. public Socket (String host, int port, Inet9,,ress inter0'ce, int loc'l+ort) throws IOException, UnknownHostException Constructor ny tao ra mt socket vi thng tin l ja chi P c biu din bi mt i tng String v mt s hiu cng v thuc hin kt ni ti host . Socket kt ni ti host xa thng qua mt giao tip mang v s hiu cng cuc b c xc jnh bi hai tham s sau. Nu localPort bng 0 th Java s lua chon mt cng ngu nhin c sn nm trong khong t 1024 n 63. public Socket (Inet9,,ress host, int port, Inet9,,ress inter0'ce, int loc'l+ort) throws IOException, UnknownHostException Constructor chi khc constructor trn ch ja chi ca host lc ny c biu din bi mt i tng netAddress. ".2. %h&n c#c th'ng tin v( Soc)et i tng Socket c mt s trng thng tin ring m ta c th truy nhp ti chng thng qua cc phong thc tr v cc thng tin ny. public Inet9,,ress getInet9,,ress() Cho trc mt i tng Socket, phong thc getnetAddress() cho ta bit host xa m Socket kt ni ti, hoc lin kt bj ngt th n cho bit host xa m Socket kt ni ti public int get+ort() Phong thc ny cho bit s hiu cng m Socket kt ni ti trn host xa. public int get:oc'l+ort() Thng thng mt lin kt thng c hai u: host xa v host cuc b. tm ra s hiu cng pha host cuc b ta goi phong thc getLocalPort(). public Inet9,,ress get:oc'l9,,ress() 124 Phong thc ny cho ta bit giao tip mang no m mt socket gn kt vi n. public InputStre'( getInputStre'(() throws IOException Phong thc genputStream() tr v mt lung nhp oc d liu t mt socket vo chong trnh. Thng thng ta c th gn kt lung nhp th nputStream ti mt lung loc hoc mt lung k tu nhm a cc chc nng tin ch (chng han nh cc lung nputStream, hoc nputStreameader). tng cao hiu nng, ta c th m d liu bng cch gn kt n vi lung loc BufferednputStream hoc Bufferedeader. public OutputStre'( getOutputStre'(() throws IOException Phong thc getOutputStream() tr v mt lung xut th ghi d liu t ng dung ra u cui ca mt socket. Thng thng, ta s gn kt lung ny vi mt lung tin li hon nh lp DataOuputStream hoc OutputStreamWriter trc khi s dung n. tng hiu qu ghi. Hai phong thc getnputStream() v getOutputStream() l cc phong thc cho php ta ly v cc lung d liu nhp v xut. Nh cp chong 3 vo ra trong Java c tin hnh thng qua cc lung, vic lm vic vi cc socket cng khng phi l mt ngoai l. nhn d liu t mt my xa ta nhn v mt lung nhp t socket v oc d liu t lung . ghi d liu ln mt my xa ta nhn v mt lung xut t socket v ghi d liu ln lung. Di y l hnh v ta hnh dung truc quan hon. Hnh 4. ".3. *+ng Soc)et n thi im ta c y cc thng tin cn thit trin khai mt ng dung pha client. Khi vit mt chong trnh ng dung pha client tt c moi cng vic u chuyn v vic qun l lung v chuyn i d liu t lung thnh dang thc m ngi s dung c th hiu c. Bn thn cc socket rt on gin bi v cc phn vic phc tap c che du i. y chnh l l do socket tr thnh mt lua chon c tnh chin lc cho lp trnh mang. public !oi, close() throws IOException Cc socket c ng mt cch tu ng khi mt trong hai lung ng lai, hoc khi chong trnh kt thc, hoc khi socket c thu hi bi gabbage collector. Tuy nhin, thuc t cho thy vic cho rng h thng s tu ng socket l khng tt, c bit l khi cc chong trnh chay trong khong thi gian v han. ng mt socket ta c th dng phong thc close(). Mi khi mt Socket bj ng lai, ta vn c th truy xut ti cc trng thng tin netAddress, ja chi cuc b, v s hiu cng cuc b thng qua cc phong thc getnetAddress(), getPort(), getLocalHost(), v getLocalPort(). Tuy nhin khi ta goi cc phong thc getnputStream() hoc getOutputStream() oc d liu t lung oc nputStream hoc ghi d liu OuputStream th ngoai l OException c a ra. 12% 6nput"tream 7utput"tream Socket Chong trnh Cc socket ng mt na (Half-closed socket) Phong thc close() ng c cc lung nhp v lung xut t socket. Trong mt s trng hp ta chi mun ng mt na kt ni, hoc l lung nhp hoc l lung xut. Bt u t Java 1.3, cc phong thc shutdownnput() v shutdownOutput() cho php ta thuc hin iu ny. public !oi, shut,ownInput() throws IOException public !oi, shut,ownOutput() throws IOException Cc phong thc ny khng thuc su ngt lin kt. Tuy nhin, n chi iu chinh lung kt ni ti n sao cho. Trong Java 1.4 a thm vo hai phong thc cc lung nhp v lung xut m hay ng public boole'n isInputShut,own() public boole'n isOutputShut,own() ".". ,hit l&- c#c t./ ch0n cho Soc)et ".".1. ,C12%345678 public !oi, set;cp<o=el'y(boole'n on) throws SocketException public boole'n get;cp<o=el'y() throws SocketException Thit lp gi trj TCPNODELAY l true m bo rng cc gi tin c gi i nhanh nht c th m khng quan tm n kch thc ca chng. Thng thng, cc gi tin nh c kt hp lai thnh cc gi tin ln hon trc khi c gi i. Trc khi gi i mt gi tin khc, host cuc b i nhn cc xc thuc ca gi tin trc t h thng xa. ".".2. S3269%:5; public !oi, setSo:inger(boole'n on, int secon,s) throws SocketException public int getSo:inger() throws SocketException Ty chon SOLNGE xc jnh phi thuc hin cng vic g vi datagram vn cha c gi i khi mt socket bj ng lai. ch mc jnh, phong thc close() s c hiu luc ngay lp tc; nhng h thng vn c gng gi phn d liu cn lai. Nu SOLNGE c thit lp bng 0, cc gi tin cha c gi i bj ph hy khi socket bj ng lai. Nu SOLNGE ln hon 0, th phong thc close() phong ta ch cho d liu c gi i v nhn c xc thuc t pha nhn. Khi ht thi gian qui jnh, socket s bj ng lai v bt ky phn d liu cn lai s khng c gi i. ".".3. S32,9<53=, public !oi, setSo;i(eout(int (illisecon,s) throws SocketException public int getSo;i(eout() throws SocketException Thng thng khi ta oc d liu t m socket, li goi phong thc phong ta cho ti khi nhn s byte. Bng cch thit lp phong thc SOTMEOUT, ta s m bo rng li goi phong thc s khng phong ta trong khong thi gian qu s giy quy jnh. ".>. C#c -hng th?c c@a lA- 3bBect Lp Socket nap chng phong thc chun ca lp ava.lang.Obect, toString(). V cc socket l cc i tng tam thi v thng chi tn tai khi lin kt tn tai. public String toString() Phong thc toString() tao ra mt xu k tu nh sau: Socket-',,r=wwworeillyco(>3?#3444$#33,port=#$,loc'lport=@$$@@. 125 Phong thc ny thng hu ch cho vic g ri. ".6. C#c ngoCi lD Soc)et Hu ht cc phong thc ca lp Socket c khai bo a ra ngoai l OException, hoc lp con ca lp OExcepton l lp SocketException. ".E. C#c lA- Soc)et7FFress Lp SocketAddress bt u c t phin bn Java 1.4, biu din mt u cui ca lin kt. Lp SocketAddress l mt lp tru tng m khng c phong thc no ngoi construtor mc jnh. Lp ny c th c s dung cho c cc socket TCP v socket khng phi l TCP. Cc lp con ca lp SocketAddress cung cp thng tin chi tit hon thch hp cho kiu socket. Trong thuc t, chi h tr TCP/P. Muc ch chnh ca lp SocketAddress l cung cp mt noi lu tr cc thng tin lin kt socket tam thi (nh ja chi P v s hiu cng) c th c s dung lai tao ra socket mi. public Socket9,,ress getAe(oteSocket9,,ress() public Socket9,,ress get:oc'lSocket9,,ress() C hai phong thc ny tr v gi trj null nu socket vn cha kt ni ti. '. L(p ServerSocket Lp ServerSocket c moi th ta cn vit cc server bng Java. N c cc constructor tao cc i tng ServerSocket mi, cc phong thc lng nghe cc lin kt trn mt cng xc jnh, v cc phong thc tr v mt Socket khi lin kt c thit lp, v vy ta c th gi v nhn d liu. Vng i ca mt server 1. Mt ServerSocket mi c tao ra trn mt cng xc jnh bng cch s dung mt constructor ServerSocket. 2. ServerSocket lng nghe lin kt n trn cng bng cch s dung phong thc accept(). Phong thc accept() phong ta cho ti khi mt client thuc hin mt lin kt, phong thc accept() tr v mt i tng Socket m lin kt gia client v server. 3. Ty thuc vo kiu server, hoc phong thc getnputStream(), getOutputStream() hoc c hai c goi nhn cc lung vo ra truyn tin vi client. 4. server v client tong tc theo mt giao thc tha thun sn cho ti khi ngt lin kt. . Server, client hoc c hai ngt lin kt 6. Server tr v bc hai v i lin kt tip theo. >.1. C#c constr$ctor public Ser!erSocket(int port) throws IOException, Bin,Exception Constructor ny tao mt socket cho server trn cng xc jnh. Nu port bng 0, h thng chon mt cng ngu nhin cho ta. Cng do h thng chon i khi c goi l cng v danh v ta khng bit s hiu cng. Vi cc server, cc cng v danh khng hu ch lm v cc client cn phi bit trc cng no m n ni ti (ging nh ngi goi in thoai ngoi vic xc jnh cn goi cho ai cn phi bit s in thoai lin lac vi ngi ). 128 V du: tao mt server socket cho cng 0 try{ Ser!erSocket http, = new Ser!erSocket(#$)% & c'tch(IOException e) { Syste( errprintln(e)% & Constructor a ra ngoai l OException nu ta khng th tao v gn Socket cho cng c yu cu. Ngoai l OException pht sinh khi: Cng c s dung Khng c quyn hoc c lin kt vi mt cng nm gia 0 v 1023. V du; i(port )'!'net*% i(port )'!'io*% public cl'ss cong:oc'lHost { public st'tic !oi, ('in(String-. 'rgs) { Ser!erSocket ss% 0or(int i=$%i2=3$45%i66) { try{ ss= new Ser!erSocket(i)% ssclose()% & c'tch(IOException e) { Syste(outprintln(/7o (ot ser!er tren cong /6i)% & & & & public Ser!erSocket(int port, int Cueuelength, Inet9,,ress bin,9,,ress)throws IOException 129 Constructor ny tao mt i tng ServerSocket trn cng xc jnh vi chiu di hng i xc jnh. ServerSocket chi gn cho ja chi P cuc b xc jnh. Constructor ny hu ch cho cc server chay trn cc h thng c nhiu ja chi P. >.2. ChG- nh&n vH ngIt liJn )t Mt i tng ServerSocket hoat ng trong mt vng lp chp nhn cc lin kt. Mi ln lp n goi phong thc accept(). Phong thc ny tr v mt i tng Socket biu din lin kt gia client v server. Tong tc gi client v server c tin hnh thng qua socket ny. Khi giao tc hon thnh, server goi phong thc close() ca i tng socket. Nu client ngt lin kt trong khi server vn ang hoat ng, cc lung vo ra kt ni server vi client s a ra ngoai l nterruptedException trong ln lp tip theo public Socket accept() throws OException Khi bc thit lp lin kt hon thnh, v ta sn sng chp nhn lin kt, cn goi phong thc accept() ca lp ServerSocket. Phong thc ny phong ta; n dng qu trnh x l v i cho ti khi client c kt ni. Khi client thuc su kt ni, phong thc accept() tr v i tng Socket. Ta s dung cc phong thc getnputStream() v getOutputStream() truyn tin vi client. V du: try{ Ser!erSocket theSer!er = new Ser!erSocket(@DDE)% while(true) { Socket con = theSer!er'ccept()% +rintStre'( p = new +rintStre'((congetOutputStre'(())% pprintln(B'n ,' ket noi toi ser!er n'y ByeFbye now")% conclose()% & & c'tch(IOException e) { Syste(errprintln(e)% & public !oi, close() throws IOException Nu ta kt thc lm vic vi mt i tng server socket th cn phi ng lai i tng ny. V du: Ci t mt server daytime i(port )'!'net*% i(port )'!'io*% i(port )'!'util='te% public cl'ss ,'yti(eSer!er{ public 0in'l st'tic int ,'yti(e+ort =3G% 120 public st'tic !oi, ('in(String-.'rgs) { Ser!erSocket theSer!er% Socket con% +rintStre'( p% try{ theSer!er = new Ser!erSocket(,'yti(e+ort)% try{ p= new +rintStre'((congetOutputStre'(())% pprintln(new ='te())% conclose()% & c'tch(IOException e) { theSer!erclose()% Syste( errprintln(e)% & & c'tch(IOException e) { Syste( errprintln(e)% & & & public !oi, close() throws IOException Nu hon thnh cng vic vi mt ServerSocket, ta cn phi ng n lai, c bit nu chong trnh ca ta tip tuc chay. iu ny nhm tao iu kin cho cc chong trnh khc mun s dung n. ng mt ServerSocket khng ng nht vi vic ng mt Socket. Lp ServerSocket cung cp mt s phong thc cho ta bit ja chi cuc b v cng m trn i tng server ang hoat ng. Cc phong thc ny hu ch khi ta m mt i tng server socket trn mt cng v danh v trn mt giao tip mang khng public Inet9,,ress getInet9,,ress() Phong thc ny tr v ja chi c s dung bi server (localhost). Nu localhost c ja chi P, ja chi ny c tr v bi phong thc netAddress.getLocalHost() V du: try{ Ser!erSocket http, = new Ser!erSocket(#$)% Inet9,,ress i' = http,getInet9,,ress()% & 121 c'tch(IOException e) { & public int get:oc'lHost() Cc contructor ServerSocket cho php ta nghe d liu trn cng khng jnh trc bng cch gn s 0 cho cng. Phong thc ny cho php ta tm ra cng m server ang nghe. ). Cc *+(c c,i -.t ch+/ng trnh ph0a Client *1ng 2ava Sau khi tm hiu cc lp v cc phong thc cn thit ci t chong trnh Socket. muc 6 v muc chng ta s i vo cc bc cu th ci t cc chong trnh Client v Server. Cc bc ci t Client Bc 1:Tao mt i tng Socket Socket client new Socket(hostname,portName); Bc 2:Tao mt lung xut c th s dung gi thng tin ti Socket +rintHriter out=new +rintHriter(clientgetOutputStre'((),true)% Bc 3:Tao mt lung nhp oc thng tin p ng t server Bu00ere,Ae',er in=new Bu00ere,Ae',er(new InputStre'(Ae',er(clientgetInputStre'(()))% Bc 4:Thuc hin cc thao tc vo/ra vi cc lung nhp v lung xut i vi cc lung xut, PrintWriter, ta s dung cc phong thc print v println, tong tu nh System.out.println. i vi lung nhp, Bufferedeader, ta c th s dung phong thc read() oc mt k tu, hoc mt mng cc k tu, hoc goi phong thc readLine() oc vo mt dng k tu. Cn ch rng phong thc readLine() tr v null nu kt thc lung. Bc : ng socket khi hon thnh qu trnh truyn tin V du: Vit chong trnh client lin kt vi mt server. Ngi s dung nhp vo mt dng k tu t bn phm v gi d liu cho server. i(port )'!'net*% i(port )'!'io*% public cl'ss Echo7lient3 { public st'tic !oi, ('in(String-. 'rgs) { String hostn'(e=/loc'lhost/% i0('rgslength1$) { hostn'(e='rgs-$.% & +rintHriter pw=null% Bu00ere,Ae',er br=null% 122 try{ Socket s=new Socket(hostn'(e,4$$D)% br=new Bu00ere,Ae',er(new InputStre'(Ae',er(sgetInputStre'(()))% Bu00ere,Ae',er user=new Bu00ere,Ae',er(new InputStre'(Ae',er(Syste(in))% pw=new +rintHriter(sgetOutputStre'(())% Syste(outprintln(/=' ket noi ,uoc !oi ser!er/)% while(true) { String st=userre',:ine()% i0(steCu'ls(/exit/)) { bre'k% & pwprintln(st)% pw0lush()% Syste(outprintln(brre',:ine())% & & c'tch(IOException e) { Syste(errprintln(e)% & 0in'lly{ try{ i0(brI=null)brclose()% i0(pwI=null)pwclose()% & c'tch(IOException e) { Syste(errprintln(e)% & & & & Chong trnh EchoClient oc vo hostname t i dng lnh. Tip theo ta tao mt socket vi hostname xc jnh trn cng s 200. Tt nhin cng ny hon ton do ta lua chon sao cho n khng trng vi cng c djch vu hoat ng. Vic tao socket thnh cng 122 c ngha l ta lin kt c vi server. Ta nhn lung nhp t socket thng qua phong thc getnputStream() v gn kt n vi cc lung k tu v lung m nh lnh: br=new Bu00ere,Ae',er(new InputStre'(Ae',er(sgetInputStre'(())% Tong tu ta ly v lung xut thng qua phong thc getOuputStream() ca socket. Sau gn kt lung ny vi lung PrintWriter gi d liu ti server pw=new +rintHriter(sgetOutputStre'(())% oc d liu t bn phm ta gn bn phm vi cc lung nhp nh cu lnh: Bu00ere,Ae',er user=new Bu00ere,Ae',er(new InputStre'(Ae',er(Syste(in))% Sau i tao c cc lung th vn nhn v gi d liu tr thnh vn on gin l oc d liu t cc lung nhp br, user v ghi d liu ln lung xut pw. 3. Cc *+(c -4 c,i -.t ch+/ng trnh Server *1ng 2ava ci t chong trnh Server bng ServerSocket ta thuc hin cc bc sau: Bc 1 Tao mt i tng ServerSocket Ser!erSocket ss=new Ser!erSocket(port) Bc 2: Tao mt i tng Socket bng cch chp nhn lin kt t yu cu lin kt ca client. Sau khi chp nhn lin kt, phong thc accept() tr v i tng Socket th hin lin kt gia Client v Server. while(con,ion) { Socket s=ss'ccept()% ,oSo(ething(s)% & Ngi ta khuyn co rng chng ta nn giao cng vic x l i tng s cho mt tuyn oan no . Bc 3: Tao mt lung nhp oc d liu t client Bu00ere,Ae',er in=new Bu00ere,Ae',er(new InputStre'(Ae',er(sgetInputStre'(()))% Bc 4: Tao mt lung xut gi d liu tr lai cho server +rintHriter pw=new +rintHriter(sgetOutputStre'((),true)% Trong tham s true c s dung xc jnh rng lung s c tu ng y ra. Bc : Thuc hin cc thao tc vo ra vi cc lung nhp v lung xut Bc 6: ng socket s khi truyn tin xong. Vic ng socket cng ng ngha vi vic ng cc lung. V du: Vit chong trnh server EchoServer phuc vu chong trnh EchoClient1 vit bc i(port )'!'net*% i(port )'!'io*% public cl'ss EchoSer!er3 { 123 public 0in'l st'tic int =EJ9U:;K+OA;=4$$D% public st'tic !oi, ('in(String-. 'rgs) { int port==EJ9U:;K+OA;% try{ Ser!erSocket ss=new Ser!erSocket(port)% Socket s=null% while(true) { try{ s=ss'ccept()% +rintHriter pw=new +rintHriter(new OutputStre'(Hriter(sgetOutputStre'(()))% Bu00ere,Ae',er br=new Bu00ere,Ae',er(new InputStre'(Ae',er(sgetInputStre'(()))% while(true){ String line=brre',:ine()% i0(lineeCu'ls(/exit/))bre'k% String upper=linetoUpper7'se()% pwprintln(upper)% pw0lush()% & & c'tch(IOException e) { & 0in'lly{ try{ i0(sI=null){ sclose()% & & c'tch(IOException e){& & & & c'tch(IOException e) 124 { & & & Chong trnh bt u bng vic tao ra mt i tng ServerSocket trn cng xc jnh. Server lng nghe cc lin kt trong mt vng lp v han. N chp nhn lin kt bng cch goi phong thc accept(). Phong thc accept() tr v mt i tng Socket th hin mi lin kt gia client v server. Ta cng nhn v cc lung nhp v lung xut t i tng Socket nh cc phong thc getnputStream() v getOuputStream(). Vic nhn yu cu t client s thng qua cc lung nhp v vic gi p ng ti server s thng qua lung xut. Khi ng chong trnh server start ava EchoServer1 Hnh 4.6 Khi ng client C:MyJavastart ava EchoClient1 Hnh 4. 5. 6ng 78ng -a t#$n -o9n trong lp trnh 2ava Cc server nh vit trn rt on gin nhng nhc im ca n l bj han ch v mt hiu nng v n chi qun l c mt client tai mt thi im. Khi khi lng cng vic m server cn x l mt yu cu ca client l qu ln v khng bit trc c thi im hon thnh cng vic x l th cc server ny l khng th chp nhn c. khc phuc iu ny, ngi ta qun l mi phin ca client bng mt tuyn oan ring, cho php cc server lm vic vi nhiu client ng thi. Server ny c goi l server tong tranh (concurrent server)-server tao ra mt tuyn oan qun l tng yu cu, sau tip tuc lng nghe cc client khc. Chong trnh client/server chng ta xt m muc 6 v muc l chong trnh client/server on tuyn oan. Cc server on tuyn oan chi qun l c mt lin kt tai mt thi im. Trong thuc t mt server c th phi qun l nhiu lin kt cng mt lc. thuc hin iu ny server chp nhn cc lin kt v chuyn cc lin kt ny cho tng tuyn oan x l. Trong phn di y chng ta s xem xt cch tin hnh ci t mt chong trnh client/server a tuyn oan. 12% Chong trnh pha server i(port )'!'io*% i(port )'!'net*% cl'ss EchoSer!e exten,s ;hre', { pri!'te Socket socket% pri!'te Bu00ere,Ae',er in% pri!'te +rintHriter out% public EchoSer!e (Socket s) throws IOException { socket = s% Syste(outprintln(/Ser!ing8 /6socket)% in = new Bu00ere,Ae',er(new InputStre'(Ae',er(socketgetInputStre'(()))% >> 7ho phLp 'utoF0lush8 out = new +rintHriter(new Bu00ere,Hriter(new OutputStre'(Hriter( socketgetOutputStre'(())), true)% >> <Mu bNt kO lPi gQi nRo S trTn UV' r' ngoWi lX >> thY chVZng trYnh gQi c[ tr\ch nhiX( U[ng socket <gV]c lWi tuyMn UoWn s^ >> s^ U[ng socket st'rt()% & public !oi, run() { try { while (true) { Syste(outprintln(/Ser!er is w'iting/)% String str = inre',:ine()% i0 (streCu'ls(exit") ) bre'k% Syste(outprintln(/Aecei!e,8 / 6 str)% Syste(outprintln(/Jro(8 /6 socket)% String upper=strtoUpper7'se()% >> g_i lWi cho client outprintln(upper)% & Syste(outprintln(/=isconnecte, with/6socket)% & 125 c'tch (IOException e) {& 0in'lly { try { socketclose()% & c'tch(IOException e) {& & & & public cl'ss ;7+Ser!er3 { st'tic int +OA;=$% public st'tic !oi, ('in(String-. 'rgs) throws IOException { i0 ('rgslength == 3) { +OA;=Integerp'rseInt('rgs-$.)% >> <h`p sa hiXu cbng tc Uai ,dng lXnh & >> ;Wo (et Uai tV]ng Ser!er Socket Ser!erSocket s = new Ser!erSocket(+OA;)% Inet9,,ress ',,rs= Inet9,,ressget:oc'lHost()%
Syste(outprintln(/;7+>Ser!er running on 8 /6 ',,rs 6/ ,+ort /6sget:oc'l+ort())%
try { Syste(outprintln(/socket = / 6 socket)% Bu00ere,Ae',er in = new Bu00ere,Ae',er(new InputStre'(Ae',er( socketgetInputStre'(()))%
>> Output is 'uto('tic'lly 0lushe, by +rintHriter8
+rintHriter out =new +rintHriter(new Bu00ere,Hriter( new OutputStre'(Hriter(socketgetOutputStre'(())),true)%
>> lQc ,dng ki tm tc bRn phn( 129
='t'InputStre'( (yinput = new ='t'InputStre'((new Bu00ere,InputStre'((Syste(in))% try { 0or(%%) { Syste(outprintln(/;ype 'nything 0ollowe, by AE;UA<, or Exit to ter(in'te the progr'(/)% String strin=(yinputre',:ine()%
>> ouit i0 the user type, ctrl6= i0 (strineCu'ls(/exit/)) bre'k% else outprintln(strin)% >> Sen, the (ess'ge String strout = inre',:ine()% >> Aeci!e it b'ck i0 ( strinlength()==stroutlength()) { >> 7o(p're Both Strings
& c'tch (IOException e) { eprintSt'ck;r'ce()% & >> User is exiting & 0in'lly { Syste(outprintln(/EOJexit/)% socketclose()% & & c'tch(UnknownHostException e) { 130 Syste(errprintln(/7'npt 0in, host/)% Syste(exit(3)% & c'tch (SocketException e) { Syste(errprintln(/7'npt open socket/)% eprintSt'ck;r'ce()% Syste(exit(3)% & & & :. ;t l#n Chng ta tm hiu cch lp trnh mang cho giao thc TCP. Cc Socket cn c goi l socket lung v gi v nhn d liu u c tin hnh thng qua vic oc ghi cc lung. Ta oc cng tm hiu co ch hoat ng ca socket v cch thc lp cc chong trnh server v client. Ngoi ra, chong ny cng gii thch tao sao cn c ci t server a tuyn oan v tm hiu cch thc lp cc chong trnh client/server a tuyn oan. Trong chong tip theo chng ta s hoc cch xy dung mt chong trnh client/server cho giao thc UDP, mt giao thc gn vi giao thc TCP. 131