You are on page 1of 23

Chng 6

Lp trnh Socket cho giao thc TCP


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
{
while(true)
{
>> +hong tf' cho tgi khi c[ (et liTn kMt UMn
Socket socket = s'ccept()%
try
{
new EchoSer!e(socket)% >> ;Wo (et tuyMn UoWn Cuhn li riTng tcng liTn kMt
& c'tch(IOException e) {
socketclose()%
128
&
&
&
0in'lly {
sclose()%
&
&
&
Chong trnh pha client
i(port )'!'net*%
i(port )'!'io*%
public cl'ss ;7+7lient3
{
public st'tic !oi, ('in(String-. 'rgs) throws IOException
{
i0 ('rgslength I= 4)
{
Syste(outprintln(/S_ ,jng8 )'!' ;7+7lient hosti, portk/)%
Syste(exit($)%
&

try
{
Inet9,,ress ',,r = Inet9,,ressgetBy<'(e('rgs-$.)%
Socket socket = new Socket(',,r, Integerp'rseInt('rgs-3.))%

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

Syste(outprintln(/Aecei!e,8 /6strout)%
&
else
Syste(outprintln(/Echo b', FF string uneCu'l/6 strout)%
& >> o0 0or %%

&
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

You might also like