You are on page 1of 206

HC VIN CNG NGH BU CHNH VIN THNG (PTIT)

GIO TRNH

IT

LP TRNH MNG

PT

(PHN LP TRNH MNG C S)

H MNH O

H NI, 07/2010

M U
Ngy nay do nhu cu thc t v do s pht trin mnh m ca nhiu cng ngh tch hp,
dn n cc chng trnh ng dng hin ny hu ht u c kh nng thc hin trn mi
trng mng my tnh ni ring v mng tch hp ni chung. Chnh v vy gio trnh ny
nhm cung cp cho sinh vin nhng kin thc v k thut c bn nht pht trin cc
chng trnh ng dng mng. Gio trnh ny bao gm 4 phn ln v 7 chng: Phn th
nht trnh by cc kin thc c s cho lp trnh mng, ch yu l kin thc mng my
tnh, ngn ng lp trnh v m hnh lp trnh mng. Phn 2 v 3 cung cp cho sinh vin 2

IT

k thut lp trnh c bn nht v ph bin nht hin ny l lp trnh mng vi socket v


lp trnh phn tn thng qua ngn ng Java. ng thi cng rn sinh vin cch lp trnh
vi giao thc truyn thng c sn v kh nng tch hp trong cc ng dng khc nhau,
nht l cc giao thc truyn thng thi gian thc(RTP). Phn 4 s cp n lp trnh
truyn thng qua mng in thoi cng cng, sinh vin bc u lm quen vi k thut
lp trnh c bn truyn thng qua h thng mng ny. T sinh vin d dng tip cn

PT

pht trin cc ng dng trn c s mng ny nh hi thoi video, cc dch v truy cp t


xa, VPN, IPTV.. v ni chung l cng ngh IP. Phn 5 cung cp cho sinh vin lm quen
kin thc lp trnh mng an ton bo mt m ch yu l giao thc SSL. Cch b tr ca
chng ti thnh tng phn r rng, mi phn c th c mt hoc nhiu chng vi mc
ch hng m cho tng phn trong tng lai.
nm c kin thc lp trnh mng, sinh vin phi hc qua kin thc cc mn: Mng
my tnh, lp trnh OOP, phn tch v thit k h thng, ngn ng lp trnh java c bn.
Gio trnh bin son phin bn u, chc khng trnh khi li, rt mong nhn c kin
ng gp ca ng nghip v nhng c gi quan tm.
Xin chn thnh cm n!
H Ni, thng 07 nm 2010
Tc gi

MC LC

PT

IT

PHN I. KIN THC C S CHO LP TRNH MNG


CHNG I..MT S KIN THC C S CHO LP TRNH MNG
I. GII THIU V LP TRNH MNG
II. MT S KIN THC MNG C S LP TRNH MANG
1. M hnh OSI./ISO v h giao thc TCP/IP
1.2. Giao thc truyn thng v phn loi
1.3. a ch IP, mt n
1.4. a ch cng
1.5. Giao din socket, a ch socket
II. CC M HNH LP TRNH MNG
1. M hnh client/server
1.1. Chng trnh client
1.2. Chng trnh server
2. M hnh peer-to-peer
3. M hnh a tng
III. NGN NG LP TRNH MNG
1. Gii thiu chung
2. Lp trnh bng ngn ng JAVA
IV. K THUT LP TRNH MNG
PHN II. K THUT LP TRNH MNG VI SOCKET
CHNG II. LP TRNH NG DNG MNG VI SOCKET
I. GII THIU CHUNG
II. LP TRNH THAO TC VI A CH MY TRM
1. Lp trnh thao tc vi a ch IP
1.1. Lp Address
1.2. V d s dng cc phng thc lp InetAddress
III. LP TRNH NG DNG MNG VI TCPSOCKET
1. Giao thc TCP v c ch truyn thng TCP
2. Mt s lp Java h tr lp trnh TCPSocket
2.1. Lp Socket
2.2. Lp ServerSocket
3. K thut lp trnh truyn thng vi giao thc TCP
3.1. Chng trnh pha server
3.2. Chng trnh pha client
3.3. Lung I/O mng v c/ghi d liu qua lung I/O

1
1
1
1
2
2
2
4
5
6
6
6
6
6
6
7
7
8
8
10
10
10
10
10
10
15
17
17
17
17
19
20
20
20
22

4. Mt s chng trnh v d
4.1. Chng trnh qut cng s dng Socket
4.2. Chng trnh qut cng cc b dng lp ServerSocket
4.3. Chng trnh finger client
4.4. Chng trnh cho php ly thi gian server v client
IV. LP TRNH NG DNG MNG VI UDPSOCKET
1. Giao thc UDP v c ch truyn thng UDP
2. Mt s lp Java h tr lp trnh vi UDPSocket
2.1. Lp DatagramPacket
2.2. Lp DatagramSocket
3. K thut lp trnh truyn thng vi giao thc UDP
3.1. Pha server

PT

IT

3.2. Pha client


3.3. Lu
4. Mt s chng trnh v d
V. LP TRNH VI TH GIAO TIP MNG(NIC)
1. Gii thiu v th giao tip mng
2. Lp NetworkInterface
3. Lp trnh vi giao tip mng
4. Mt s chng trnh v d
VI. LP TRNH TRUYN THNG MULTICAST
1. Gii thiu truyn thng multicast v lp MulticastSocket
2. Mt s v d gi/nhn d liu multicast
VII. KT LUN
CHNG III. K THUT XY DNG NG DNG MNG PHA SERVER
I. GII THIU CC KU SERVER
1. Server chy ch ng thi hng kt ni
2. Server chy ch lp hng khng kt ni
II. XY DNG SERVER PHC V NHIU CLIENT HNG KT NI
1. Gii thiu
2. K thut lp trnh a lung trong Java
3. Xy dng chng trnh server phc v nhiu client ng thi ...
III. KT LUN
CHNG IV. LP TRNH GIAO THC DCH V MNG PHA CLIENT
I. GII THIU
II. LP TRNH GIAO THC DCH V TELNET
1. Mt s khi nim v c im dch v Telnet
2. Mt s kin thc giao thc Telnet c bn

23
23
24
24
25
28
28
28
28
30
33
33
33
33
34
35
35
35
38
41
43
43
45
47
48
48
48
49
49
49
50
53
57
58
58
58
58
60

3. Ci t dch v Telnet Client vi Java


4. Chy th chng trnh
III. LP TRNH DCH V TRUYN TP VI GIAO THC FTP
1. Dch v truyn tp FTP
2. K thut ci t giao thc FTP vi Java
IV. LP TRNH GI/NHN TH VI GIAO THC SMTP/POP3
1. Giao thc SMTP
2. Giao thc POP3
V. KT LUN
PHN III. LP TRNH PHN TN
CHNG V. K THUT LP TRNH PHN TN I TNG RMI
I. GII THIU LP TRNH PHN TN V RMI

PT

IT

1. Gii thiu k thut lp trnh phn tn


2. Gii thiu k thut lp trnh RMI
3. Cc lp h tr lp trnh vi RMI
II. XY DNG CHNG TRNH PHN TN RMI
1. K thut lp trnh RMI
2. Bin dch chng trnh
3. Thc thi chng trnh
III. C CH TRUYN THNG RMI
IV. VN TRUYN THAM S CHO PHNG THC GI T XA
1. Gii thiu truyn tham s tham tr v tham chiu....
2. Truyn i tng theo kiu tham tr
3. Truyn i tng theo kiu tham chiu
V. K THUT S DNG MT I TNG SN SINH NHIU...
1. Gii thiu
2. K thut ng dng Factory
VI. KT LUN
II. XY DNG CHNG TRNH PHN TN RMI
1. K thut lp trnh RMI
2. Bin dch chng trnh
3. Thc thi chng trnh ng dng
III. KT LUN
PHN IV. LP TRNH TRUYN THNG QUA MNG PSTN
CHNG V. LP TRNH NG DNG TRUYN THNG ..MNG TCC
I. K THUT LP TRNH VI JTAPI
1. Gii thiu th vin JTAPI
2. C s ca JTAPI

63
68
68
68
73
76
76
84
87
88
88
88
88
88
91
92
92
95
95
96
97
97
97
99
102
102
103
107
98
98
101
102
102
108
108
108
108
110

111
113
118
118
118
118
118
119
120
122
130
131

CHNG VII. LP TRNH MNG AN TON BO MT VI SSL


I. GII THIU SSL V MT S KHAI NIM
1. Gii thiu v SSL
2. Kho(key)
3. Thut ton m ho
4. C ch lm vic ca SSL
5. Bo mt ca giao thc SSL
II. LP TRNH MNG AN TON BO MT VI SSL
1. Th vin Java h tr lp trnh vi SSL
2. V d s dng cc lp SSL
III. KT LUN
TI LIU THAM KHO

131
131
131
131
132
134
135
136
136
137
141
142

PT

IT

3. Cc cu hnh cuc gi tiu biu


4. M hnh cuc gi Java
II. CU HNH H THNG
1. Cu hnh my tnh mng
2. Cu hnh desktop
III. MT S CHNG TRNH V D LP TRNH VI JTAPI
1. V d thit lp mt cuc gi in thoi
2. Thc hin gi mt cuc in thoi t mt s
3. Mt ng dng tr li cuc in thoi
4. V dng xy dng dch v RAS vi JTAPI
IV. KT LUN
PHN IV. LP TRNH MNG AN TON BO MT

PHN I. KIN THC C S CHO LP TRNH


CHNG I
MT S KIN THC C S CHO LP TRNH
I. GII THIU V LP TRNH MNG(LTM)
Ngy ny khi ni n pht trin cc ng dng phn mm, a s l ngi ta mun ni n
chng trnh c kh nng lm vic trong mi trng mng tch hp ni chung v mng my
tnh ni ring. T cc chng trnh k ton doanh nghip, qun l, tr chi, iu khin... u
l cc chng trnh ng dng mng.

PT

IT

Vn lp trnh mng lin quan nhiu lnh vc kin thc khc nhau. T kin thc s dng
ngn ng lp trnh, phn tch thit k h thng, kin thc h thng mng, m hnh xy dng
chng trnh ng dng mng, kin thc v c s d liu... cho n kin thc truyn thng,
cc kin thc cc lnh vc lin quan khc nh mng in thoi di ng, PSTN, h thng
GPS, cc mng nh BlueTooth, WUSB, mng sensor.... Nhng c th ni vn lp trnh
mng c 3 vn chnh ct li tch hp trong lp trnh ng dng mng v c th hin nh
hnh 1.

Hnh 1.1. Cc kin thc c s cho lp trnh mng


Hay ni cch khc, vn lp trnh mng c th c nh ngha vi cng thc sau:
LTM=KTM+MH+NN
Trong :

LTM: Lp trnh mng

KTM: Kin thc mng truyn thng( mng my tnh, PSTN....)

MH: M hnh lp trnh mng

NN: Ngn ng lp trnh mng

Trong giao trnh ny, chng ti tp trung ch yu vo cc k thut pht trin chng trnh ng
dng mng. Cn cc vn khc can thip su xung pha thp hn trong h thng mng nh cc
trnh tin ch mng, thu thp bt v phn tch gi tin...cc bn c th tham kho cc ti liu khc,
nht l cc ti liu lin quan n lp trnh vi Raw socket.
II. MT S KIN THC MNG C S LP TRNH MNG

PT

IT

1. M hnh OSI/ISO v h giao thc TCP/IP

Hnh 1.2. M hnh OSI/ISO v h giao thc TCP/IP

1.2. Giao thc truyn thng v phn loi(protocol)


Giao thc truyn thng l tp cc qui tc, qui c m mi thc th tham ra truyn thng phi tun
theo mng c th hot ng tt. Hai my tnh ni mng mun truyn thng vi nhau phi ci
t v s dng cng mt giao thc th mi "hiu" nhau c.
Da vo phng thc hot ng, ngi ta c th chia giao thc truyn thng thnh 2 loi: Giao
thc hng kt ni v giao thc hng khng kt ni.
1.2.1. Giao thc hot ng theo hng c kt ni
Loi giao thc truyn thng ny s dng kt ni(o) truyn thng. c im ca loi giao thc
ny l:

Truyn thng theo kiu im-im

D liu truyn qua mng l mt dng cc byte lin tc truyn t ni gi ti ni nhn, mi


byte c mt ch s xc nh.

Qu trnh truyn thng c thc hin thng qua 3 giai on:


Thit lp kt ni
Truyn d liu km theo c ch kim sot cht ch
Hu b kt ni

Giao thc tiu biu l giao thc TCP

1.2.2. Giao thc hot ng hng khng kt ni


Kiu giao thc ny khi thc hin truyn thng khng cn kt ni (o) truyn d liu. Giao
thc kiu ny c c im sau:
Truyn thng theo kiu im-a im

Qu trnh truyn thng ch c mt giai on duy nht l truyn d liu, khng c giai
on thit lp kt ni cng nh hu b kt ni.

D liu truyn c t chc thnh cc tin gi tin c lp, trong mi gi d liu c cha
a ch ni nhn.

Giao thc tiu biu loi ny l giao thc UDP

IT

1.2.3. Mt s giao thc truyn thng Internet ph bin

Giao thc tng Internet: IP, ARP, RARP, ICMP, IGMP

Giao thc tng giao vn: TCP, UDP

Giao thc dch v: Telnet, FTP, TFTP, SMTP, POP3, IMAP4, DNS, HTTP...

PT

1.3. a ch IP, mt n(mask)


1.3.1. a ch IP

Hai phin bn a ch IP thng dng: IPv4 v IPv6. Hin th gii cng nh Vit Nam ang
chuyn dn sang s dng IPv6.
1.3.2. Mt n(mask)

Mt n l mt gi tr hng( mt s nh phn 32 bt) cho php phn tch a ch mng t a ch


IP(a ch u khi a ch IP). C th khi cho bt k mt a ch IP no trong khi a ch, bng
cch thc hin php ton AND mc bt, mt n s gi nguyn phn netid v xo ton b cc bt
phn hostid v gi tr 0, tc l tr v a ch u khi a ch . Mt n ca mt mng con c th
l mt n c chiu di c nh hoc bin i. Cc mt n mc nh ca cc lp a ch A, B, C
tng ng l: 255.0.0.0, 255.255.0.0, 255.255.255.0. Trong k thut chia mt mng thnh nhiu
mng con(subnet), hoc to thnh siu mng(supernet) i vi lp C, ngi ta phi tm c
mt n mng v nh danh cho cc mng bng cch mn mt s bt phn hostid(subnet) hoc
phn netid(supernet). Mt n c vai tr quan trng trong vic nh tuyn cho mt gi tin i n
ng mng ch
1.3.3. Mt s a ch IP c bit

a ch mng: nettid l nh danh ca mng, cc bt hostid u bng 0.

a ch Broadcast trc tip: L a ch ch, c phn netid ca mng, cc bt phn hostid


u c gi tr 1.

i ch Broadcast hn ch: L a ch ch v c tt c cc bt phn netid v hostid u c


gi tr 1. Gi tin c a ch ny s b chn bi cc router.

a ch this host on this network: c tt c cc bt netid v hostid u bng 0. a ch ny l a


ch ngun c my trm s dng ti thi im Bootstrap truyn thng khi n bit a ch IP
ca n.
a ch my trm c th trong mt mng: c tt c cc bt netid bng 0 v phn hostid l
a ch host c th trong mng.

a ch Loopback: a ch ny c byte u tin l 127, cn cc byte cn li c th c gi


tr bt k: 127.X.Y.Z. a ch ny c dng chy th cc chng trnh ng dng
mng trn cng mt my, nht l khi khng c mng. a ch loopback l a ch ch, khi
a ch ny c s dng, gi tin s khng bao gi truyn ra khi my. a ch loopback
tiu biu l 127.0.0.1 hoc c th dng chui localhost thay th.

a ch ring: Mt s khi a ch trong cc lp c qui nh ch s dng cho mng


ring(mng cc b) m khng c php s dng trn mng Internet. Khi cc gi tin
truyn thng trn mng Internet, cc router v switch trn mng xng sng Internetc
cu hnh loi b gi tin s dng cc a ch trong cc khi a ch ring ny. Cc di a
ch ring:
Lp A: 10.0.0.0

-> 10.255.255.255

PT

IT

Lp B: 172.16.0.0 -> 172.31.255.255

Lp C: 192.168.0.0 -> 192.168.255.255

Ngoi ra ngi ta cn s dng cc a ch khng theo lp m cho cc khi a ch c chiu di


bin i, cc a ch ny c dng CIDR: a.b.c.d/n.
1.4. a ch cng(port)

a s cc h iu hnh mng hin nay u a nhim nn cho php nhiu tin trnh truyn thng
chy ng thi trn cng mt my tnh v u chung mt a ch IP. Chnh v nh vy, 2 tin
trnh trn 2 my tnh mun truyn thng vi nhau m ch s dng a ch IP l cha th thc hin
c. phn bit cc tin trnh chy trn cng mt my tnh ng thi, ngi ta gn cho mi
tin trnh mt nhn duy nht phn bit cc tin trnh vi nhau. Trong k thut mng my tnh,
ngi ta s dng mt s nguyn 16 bt lm nhn v n c gi l s hiu cng hoc a ch
cng(port). a ch cng ny c s dng v c qun l bi tng giao vn v n c gi tr t 0
n 65535, c chia lm 3 gii:

Hnh 1.3. Cc di a ch cng


Gii a ch t 0 n 1023: Gi ny dng cho h thng, ngi s dng khng nn dng.
Cc a ch cng trong di ny thng c gn mc nh cho cc giao thc truyn thng
ph bin nh bng sau:
Giao thc

M t

Echo

Phn hi Datagram nhn c tr li ni


gi

Discard

Loi b mi Datagram nhn c

13

Daytime

19

Chargen

20

FTP,Data

21

FTP,Control

23

Telnet

Mng u cui

25

SMTP

Giao thc gi th Internet

53

DNS

Giao thc DNS

67

BOOTP

Giao thc Bootrap

79

Finger

Finger

80

HTTP

Giao thc truyn siu vn bn

111

RPC

Giao thc gi th tc t xa

110

POP3

Giao thc truy cp Email

143

IMAP4

Giao thc truy cp Email

IT

port

Tr v ngy v gi

Tr v mt chui k t

Pha server FTP(Kt ni d liu)

PT

Pha server FTP(Kt ni iu khin)

Gii a ch t 1024 n 49151: Gii a ch cng ny ngi s dng c php dng,


nhng phi ng k trnh trng lp.

Gii a ch t 49152 n 65535: y l gii a ch ng hoc dng ring. Ngi s


dng dng a ch trong gii ny khng phi ng k v cng khng phi chu trch
nhim khi xy ra xung t a ch.
1.5. Giao din socket, a ch socket
Socket l g? Chng ta c th hiu socket l giao din v l mt cu trc truyn thng ng vai
tr nh l mt im cui(end point) truyn thng. Mi tin trnh khi mun truyn thng bng
socket, u tin n phi to ra mt socket v socket phi c gn mt nh danh duy nht
c gi l a ch socket. Mt a ch socket l mt t hp gm 2 a ch: a ch IP v a ch
cng(port). Nh vy a ch socket xc nh mt u mt cui truyn thng. N ch ra tin trnh
truyn thng no(port) v chy trn trn my no(IP) s thc hin truyn thng.

IT

h tr ngui pht trin ng dng mng s dng socket, cc nh sn xut phn mm xy


dng sn mt tp cc hm th vin API v gi l tp hm th vin giao din socket. Giao din
socket c phn lm 3 loi socket(hnh 2).

PT

ICMP

Hnh 1.4. Cc kiu giao din socket

Stream socket: cho php truyn thng vi cc giao thc truyn thng hng kt ni m
tiu biu l giao thc TCP(TCPSocket). TCP s dng mt cp stream socket kt ni
mt chng trnh ng dng vi mt chng trnh ng dng khc qua mng Internet.
Datagram socket: Cho php truyn thng vi cc giao thc hng khng kt ni, tiu biu
l giao thc UDP (UDP socket). UDP s dng mt cp datagram socket gi thng ip
t mt chng trnh ng dng ti mt chng trnh ng dng khc qua mng Internet.
Raw socket: y l kiu giao socket cho php truyn thng n cc giao thc tng
mng thp hn c tng giao vnm tiu biu nht l giao thc ICMP ca tng Internet
hoc OSPF. V d chng trnh ping s dng kiu socket ny.
II. CC M HNH LP TRNH MNG
1. M hnh client/server
Chng trnh ng dng mng t chc theo m hnh client/server c s dng ph bin trong
thc t. Chng trnh ng dng mng theo m hnh ny gm c 2 phn mm: Phn mm

server(phc v) v phn mm client(my khch) v n th hin nh hnh 2. Mt chng trnh


server c th phc v nhiu chng trnh client ng thi hoc tun t(kiu lp).

Server

Client_1

Client_2

Client_n

Hnh 1.5. M hnh client/server

PT

IT

1.1. Chng trnh client: client l mt chng trnh chy trn my cc b m a ra yu cu


dch v i vi server. Chng trnh client c thi gian chy hu hn. N c khi u bi
ngi s dng( hoc mt chng trnh ng dng khc) v kt thc khi dch v thc hin hon
thnh. Sau khi khi to, client thc hin m mt knh truyn thng s dng a ch IP ca my
trm t xa v a ch cng(nhn) bit r ca chng trnh server c th chy trn my tnh t
xa . Cch m ca client c gi l m tch cc( active open). Sau khi knh truyn thng
c m client s gi yu cu ti server v nhn p ng tr v t server.
1.2. Chng trnh server: Chng trnh ny c c im l c thi gian chy v tn v ch
dng chy bi ngi s dng hoc tt my tnh. Chng trnh ny sau khi khi to, n s thc
hin m th ng(passive Open) v c t trng thi nghe ch tn hiu gi ti t client,
nu c, n s nhn yu cu gi ti t client, thc hin x l v p ng yu cu .
2. M hnh peer-to-peer

Chng trnh ng dng mng lm vic theo m hnh peer-to-peer(ngang cp, bnh ng) c th
ni l cc chng trnh m c th thc hin vai tr ca c server v ca client. Chng trnh ny
khi chy c th yu cu chng trnh khc phc v n v n cng c th phc v yu cu gi ti
t chng trnh khc.
3. M hnh a tng
M hnh a tng gm nhiu tng m tiu biu nht l m hnh 3 tng. Trong m hnh ny, tng
thp nht l tng thng tin, tng trung gian v tng nh. Mt v d tiu biu ca m hnh 3 tng
l dch v Web vi tng nh l trnh duyt, tng trung gian l webserver v tng thng tin l
c s d liu. M hnh nhiu tng s c kho st k trong phn lp trnh ng dng mng nng
cao vi cc k thut Servlet, EJB, Portlet..
III . NGN NG LP TRNH MNG
1. Gii thiu chung

Ni chung tt c cc ngn ng lp trnh u c th s dng lp trnh mng. Nhng mi ngn


ng c nhng u, nhc im khc nhau v c h tr th vin API cc mc khc nhau.
Tu tng ng dng mng c th, h iu hnh mng c th v thi quen lp trnh m ngi lp
trnh c th chn ngn ng ph hp pht trin cc ng dng mng. Cc ngn ng lp trnh ph
bin hin nay gm nhng ngn ng sau:

Hp ng( Assembly Language)

C/C++

VC++, VB, Delphi

Java

.NET

ASP

IT

i vi pht trin ng dng mng hin nay c 2 ngn ng lp trnh c s dng ph bin nht,
l .NET v JAVA. Ngi lp trnh c th s dng thnh tho mt trong 2 dng ngn ng
pht trin ng dng mng( vi Vit Nam ni chung nn nm tt c 2 cng ngh ny). Trong
gio trnh ny chng ti s s dng ngn ng lp trnh JAVA v cc cng ngh lin quan n n
pht trin ng dng mng. Sau khi nm chc k thut, t tng lp trnh mng thng qua ngn
ng Java, sinh vin c th s dng bt k ngn ng lp trnh no ph hp nh VB.NET, C#, ...
2. Lp trnh mng bng ngn ng Java

PT

lp trnh mng bng ngn ng Java, sinh vin phi nm chc mt s kin thc lp trnh java
sau:

Tng quan cng ngh Java, cc gi th vin(J2SE, J2ME, J2EE)

Lp trnh Java c s

Lp trnh Java OOP

Lp trnh giao din ho ngi s dng(GUI) v applet

I/O theo lung v thao tc tp

Lp trnh kt ni vi c s d liu

K thut lp trnh a lung

Ngoi l v x l ngoi l

Lp trnh an ton bo mt trong Java

Ngoi ra sinh vin cn phi hiu v my o java dnh cho cc ng dng java khc nhau(JVM,
KVM, my o cho dng SPOT...).
IV. K THUT LP TRNH MNG
C nhiu k thut lp trnh mng khc nhau, nhng trong gio trnh ny ch yu ch tp trung vo
3 k thut lp trnh mng chnh:
-

K thut lp trnh mng vi socket: Trong k thut ny, chng trnh ng dng
mng s c xy dng vi cc kiu socket khc nhau. K thut ny cho php mi

quan h qua mng gia cc chng trnh chy lng lo v bn thn socket l giao
din mng , khng phi c ch truyn thng.
-

K thut lp trnh phn tn: Tri vi k thut lp trnh socket, trong k thut ny
mi quan h gia chng trnh client v server l gn kt cht ch. K thut lp
trnh ny thc cht l k thut lp trnh phn tn m lnh(i tng), cho php
phn ti tnh ton ln cc my tnh kt ni vi nhau vi quan h hu c thay v tp
trung trn cng mt my. iu ny cho php tn dng ti nguyn mng gii
quyt cc bi ton vi khi lng tnh ton ln, thi gian thc.

K thut lp trnh truyn thng qua mng in thoi cng cng PSTN.

Cc k thut ny s c kho st chi tit trong cc chng tip theo.


V. THIT K V CI T THEO M HNH MVC
1. Gii thiu m hnh MVC

PT

IT

M hnh MVC (Model View - Control) c s dng kh rng ri thit k cc phn mm


hin nay. Theo , h thng c nhm thnh 3 thnh phn chnh (Hnh 1.6):

Hnh 1.6: M hnh MVC tng quan


-

Thnh phn Model (M): m hnh, hay cn c gi vi nhiu tn khc nh thc th


(entity, bean). L cc lp cha thng tin x l ca h thng. Cc thng tin khng
nn ring l m nn hp li thnh cc lp thc th trao i, truyn/nhn, v x l
gia cc lp thuc cc phn cn li nh Control v View cho tin li.

Thnh phn View (V): trnh din, hay cn c gi vi cc tn khc nh giao din
(interface), bin (boundary). C nhim v hin th cc form nhp d liu v hin th
kt qu x l t h thng cho ngi dng.

Thnh phn Control (C): iu khin, hay cn c gi l nghip v (business). Cha


ton b cc hot ng x l, tnh ton, iu khin lung, iu khin form, v c th c
cc thao tc truy cp c s d liu.

2. Case study: thit k ng dng login theo m hnh MVC


Bi ton t ra nh sau: Xy dng mt ng dng cho php ngi dung ng nhp theo ti khon
ca mnh
Trn giao din ang nhp c 2 vn bn cho php ngi dng nhp
username/password, v mt nt nhn Login ngi dng click vo ng nhp.

Khi ngi dng click vo nt Login, h thng phi kim tra trong c s d liu xem
c username/password y khng. Nu c th thng bo thnh cng, nu sai th thng
bo username/password khng hp l.

H thng phi c thit k v ci t theo m hnh MVC

PT

IT

Hnh 1. 7: S lp ca h thng

S lp ca h thng c thit k theo m hnh MVC trong Hnh 1.7, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
-

Lp LoginModel: l lp tng ng vi thnh phn model (M), bao gm hai thuc tnh
username v password, cc hm khi to v cc cp getter/setter tng ng vi cc
thuc tnh.

Lp LoginView: l lp tng ng vi thnh phn view (V), l lp form nn phi k


tha t lp JFrame ca Java, n cha cc thuc tnh l cc thnh phn ha bao gm
text nhp username, text nhp password, nt nht Login.

Lp LoginControl: l lp tng ng vi thnh phn control (C), n cha mt lp ni


ti l LoginListener. Khi nt Login trn tng view b click th n s chuyn tip s
kin xung lp ni ti ny x l. Tt c cc x l u gi t trong phng thc
actionPerformed ca lp ni ti ny. iu ny m bo nguyn tc control iu khin
cc phn cn li trong h thng, ng theo nguyn tc ca m hnh MVC.

Tun t cc bc x l nh sau:

1. Ngi dng nhp username/password v click vo giao din ca lp LoginView


2. Lp Loginview s ng gi thng tin username/password trn form vo mt i
tng model LoginModel bng phng thc getUser() v chuyn xung cho lp
LoginControl x l
3. Lp LoginControl chuyn sang cho lp ni ti LoginListener x l trong phng
thc actionPerformed
4. Lp LoginListener s gi phng thc checkLogin() ca lp LoginControl
km tra thng tin ng nhp trong c s d liu.
5. Kt qu kim tra s c chuyn cho lp LoginView hin th bng phng thc
showMessage()
6. Lp LoginView hin th kt qu ng nhp ln cho ngi dng
3. Ci t ng dng login theo m hnh MVC
Lp LoginModel.java

public class LoginModel {


private String userName;
private String password;

PT

public LoginModel(){
}

IT

package login_GUI_MVC;

public LoginModel(String username, String password){


this.userName = username;
this.password = password;
}
public String getPassword() {
return password;
}

public void setPassword(String password) {


this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}

Lp LoginView.java
package login_GUI_MVC;
import java.awt.FlowLayout;

import
import
import
import
import
import
import
import
import
import
import

java.awt.event.ActionEvent;
java.awt.event.ActionListener;
java.awt.event.WindowAdapter;
java.awt.event.WindowEvent;
javax.swing.JButton;
javax.swing.JFrame;
javax.swing.JLabel;
javax.swing.JOptionPane;
javax.swing.JPanel;
javax.swing.JPasswordField;
javax.swing.JTextField;

public class LoginView extends JFrame implements ActionListener{


private JTextField txtUsername;
private JPasswordField txtPassword;
private JButton btnLogin;
private LoginModel model;
public LoginView(){
super("Login MVC");

IT

txtUsername = new JTextField(15);


txtPassword = new JPasswordField(15);
txtPassword.setEchoChar('*');
btnLogin = new JButton("Login");

PT

JPanel content = new JPanel();


content.setLayout(new FlowLayout());
content.add(new JLabel("Username:"));
content.add(txtUsername);
content.add(new JLabel("Password:"));
content.add(txtPassword);
content.add(btnLogin);
btnLogin.addActionListener(this);
this.setContentPane(content);
this.pack();

this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

}
public void actionPerformed(ActionEvent e) {
}
public LoginModel getUser(){
model = new LoginModel(txtUsername.getText(), txtPassword.getText());
return model;
}
public void showMessage(String msg){
JOptionPane.showMessageDialog(this, msg);
}

public void addLoginListener(ActionListener log) {


btnLogin.addActionListener(log);
}
}

Lp LoginControl.java
package login_GUI_MVC;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class LoginControl {


private LoginModel model;
private LoginView view;

IT

public LoginControl(LoginView view){


this.view = view;

view.addLoginListener(new LoginListener());
}

PT

class LoginListener implements ActionListener {


public void actionPerformed(ActionEvent e) {
try {
model = view.getUser();
if(checkUser(model)){
view.showMessage("Login succesfully!");
}else{
view.showMessage("Invalid username and/or password!");
}
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}
}
}
public boolean checkUser(LoginModel user) throws Exception {
String dbUrl = "jdbc:mysql://localhost:3306/usermanagement";
String dbClass = "com.mysql.jdbc.Driver";
String query = "Select * FROM users WHERE username ='"
+ user.getUserName()
+ "' AND password ='" + user.getPassword() + "'";
try {
Class.forName(dbClass);
Connection con = DriverManager.getConnection(dbUrl,
"root", "12345678");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);

if (rs.next()) {
return true;
}
con.close();
}catch(Exception e) {
throw e;
}
return false;
}
}

Lp Test.java

IT

package login_GUI_MVC;
public class Test {
public static void main(String[] args) {
LoginView view
= new LoginView();
LoginControl controller = new LoginControl(view);
view.setVisible(true);
}
}

PT

Kt qu

Login thnh cng:

Login li:

VI. KT LUN

PT

IT

Trong chng ny chng ta im qua mt s kin thc c s cho lp trnh mng bao gm kin
thc mng truyn thng, m hnh lp trnh mng v ngn ng lp trnh mng. V thng qua
chng ny sinh vin cng nm c mc ch ca mn lp trnh mng. Cc chng tip theo s
lm r cc k thut lp trnh mng c bn v ch ra lp trnh mng an ton bo mt. Cn nhng
k thut lp trnh mng phc tp khc nh CORBA, EJB, PORTAL, JAVAMAIL hoc cng
ngh m my(cloud) cng nh m hnh a tng, k thut lp trnh hng dch v SOA s c
xt trong gio trnh lp trnh mng nng cao. Cn k thut lp trnh cc dch v mng di ng
nh SMS, MMS, cc dch v mng di ng khc v mng Bluetooth, mng Sensor, ZeeBig,
WUSB, GPS...sinh vin s c cung cp qua mn lp trnh thit b di ng, qua cc bi tp thc
hnh v h thng bi tp ln ca mn lp trnh mng.

PHN II. K THUT LP TRNH MNG VI SOCKET


CHNG II
LP TRNH NG DNG MNG VI SOCKET
I. GII THIU CHUNG
Lp trnh ng dng mng vi socket l k thut hin nay c s dng cc k ph bin trong
thc t. Cc ngn ng lp trnh mng hu ht u c th vin h tr lp trnh vi socket nh:
Ngn ng c/c++ c th vin socket, VC++ c , VB c th vin WinSock, C# c th vin
system.socket...Trong Java cc lp th vin h tr lp trnh vi socket hu ht nm trong gi
java.net. Khi pht trin cc ng dng mng th java v .NET h tr rt mnh i vi socket s
dng giao thc TCP( TCPsocket) v UDP(UDPsocket), nhng lp trnh Raw socket vi java th
cc k phc tp. Chnh v vy, khi lp trnh cc ng dng tin ch mng nh chng trnh ping,
tracer,.. hoc cc ng dng can thit su h thng mng m s dng raw socket th tt nht s
dng ngn ng C/C++(Linux), VC++ hoc .NET(Windows).

PT

IT

Trong chng ny chng ti s tp trung lp trnh ng dng mng s dng TCPSocket,


UDPSocket v s dng ngn ng lp trnh Java. i vi cc ng dng ny, Java h tr rt mnh
trong cc gi java.net, java.nio. Cc lp quan trong nht trong gi java.net gm 6 lp:
InetAddress, ServerSocket, Socket, DatagramPacket, DatagramSocket, URL. Vi 6 lp ny Java
cho php pht trin tt c cc ng dng mng t chng trnh ng dng n gin cho n phc
tp, t cc ng dng c nh n cc ng dng ln. Ngoi ra cn mt s lp khc cng c s
dng ph bin nh NetworkInterface... Sau y chng ta s kho st nhng k thut lp trnh
mng c bn nht s dng socket trong Java.
II. LP TRNH THAO TC VI A CH MY TRM
1. Lp trnh thao tc vi a ch IP
1.1. Lp InetAddress

Java c cc lp quan trng thao tc vi a ch IP trong gi java.net. Lp quan trng nht l


lp InetAddress. Lp ny cho php ly a ch ca mt my trm bt k trn mng v cho php
d dng hon chuyn gia a ch IP v tn ca mt my trm(host). Mi i tng InetAddress
cha 2 thnh phn chnh ca mt my trm l hostname v a ch IP ca my trm . Ngoi ra
cn c 2 lp khc kt tha trc tip t lp InetAddress dnh cho cc phin bn IPv4 v IPv6 l
lp Inet4Address, Inet6Address v 2 lp khc l lp SocketAddress , InetSocketAddress lin
quan ti a ch socket .

Hnh 2.1. Lp k tha t lp InetAddress v SocketAddress


Lp InetAddress c s dng ph bin trong cc lp Socket, ServerSocket, URL,
DatagramSocket, DatagramPacket v n c k tha t lp
Object:
public class InetAddress extends Object implements Serializable
c im ca lp InetAddress l lp khng c cu t nn khng th to ra i tng InetAddress
bng ton t new. Nhng b li, lp InetAddress c mt s phng thc c thuc tnh static cho
php ly a ch ca my trm bt k trn mng, c th l c cc phng thc sau:
Tm tt cc phng thc ca lp InetAddress
equals(Object obj)
So snh i tng vi i tng obj

byte[]

getAddress()
Tr v a ch IP cha trong i tng InetAddress dng mng byte

IT

boolean

static InetAddress[] getAllByName(String host)


Tr v mng a ch ca tt c cc my trm c cng tn trn mng
getByAddress(byte[] addr)
Tr v i tng InetAddress tng ng vi a ch IP truyn cho phng
thc di dng mng byte

PT

static InetAddress

static InetAddress

getByAddress(String host,byte[] addr)


To i tng InetAddress da trn tn v a ch IP

static InetAddress

getByName(String host)
Xc nh a ch IP ca my trm t tn ca my trm(host)

String

getCanonicalHostName()
Ly tn min ca a ch IP

String

getHostAddress()
Tr v a ch IP cha trong i tng INetAddress l chui dng a.b.c.d

String

getHostName()
Tr v tn my trm cha trong i tng

static InetAddress

getLocalHost()
Ly i tng InetAddress ca my cc b

int

hashCode()

Tr v hashcode ca a ch IP cc th
isAnyLocalAddress()
Kim tra a ch InetAddress c phi a ch wildcard khng?

boolean

isLinkLocalAddress()
Kim tra a ch c phi l mt a ch link-local hay khng.

boolean

isLoopbackAddress()
Kim tra a ch c phi l a ch Loopback khng.

boolean

isMCGlobal()
Kim tra a ch multicast c phm vi ton cc hay khng?

boolean

isMCLinkLocal()
Kim tra a ch multicast c phi l a ch c phm vi lin kt hay
khng?

boolean

isMCNodeLocal()
Kim tra a ch multicast c phi l a ch phm vi nt mng hay
khng?

boolean

isMulticastAddress()
Kim tra a ch InetAddress c phi l a ch IP multicast hay
khng.

PT

String

IT

boolean

toString()
Chuyn a ch IP thnh chui.

Phng thc getByName():

Phng thc ny c c php sau:


public static InetAddress getByName(String hostName)
throws UnknownHostException
Phng thc ny cho php tr v a ch ca mt my trm bt k trn mng c ch ra bi
tham s hostName. Tham s ny c th PCname, l tn min DNS hoc a ch IP. Trong
trng hp khng tn ti my trm c tn ch ra trn mng, phng thc nm tr v ngoi l
UnknownHostException. V d on chng trnh sau ly a ch ca my trm c tn
min l www.yahoo.com v hin th a ch ra mn hnh:
try {
InetAddress address = InetAddress.getByName("www.yahoo.com");

System.out.println(address);

}
catch (UnknownHostException ex) {
System.out.println("Could not find www.yahoo.com");
}

Lnh InetAddress.getByName() s dng c do phng thc getByName() c thuc tnh static.


Nu my trm vi tn min ch ra khng tn ti th ngoi l UnknownHostException c nm
tr v v c x l.
Phng thc getAllByName():
Phng thc ny cho php tr v a ch ca tt c cc my trm c cng tn trn mng di
dng l mt mng i tng InetAddress. Phng thc c c php sau:
InetAddress[] addresses = InetAddress.getAllByName(String name)
throws UnknownHostException

//AllAddr.java
import java.net.*;
public class AllAddr{

IT

V d: Hy in ra a ch ca tt c cc my trm trn mng m c cng tn min


www.microsoft.com:

public static void main (String[] args) {

PT

try {

InetAddress[] addresses =

InetAddress.getAllByName("www.microsoft.com");

for (int i = 0; i < addresses.length; i++) {


System.out.println(addresses[i]);

}
}

catch (UnknownHostException ex) {

System.out.println("Could not find www.microsoft.com");


}
}
}
Dch chy chng trnh trn my tnh c kt ni mng Internet, kt qu tr v nh sau:
www.microsoft.com/63.211.66.123
www.microsoft.com/63.211.66.124
www.microsoft.com/63.211.66.131
www.microsoft.com/63.211.66.117

www.microsoft.com/63.211.66.116
www.microsoft.com/63.211.66.107
www.microsoft.com/63.211.66.118
www.microsoft.com/63.211.66.115
www.microsoft.com/63.211.66.110

Phng thc getLocalHost():


Phng thc ny cho php tr v a ch ca my cc b, nu khng tm thy n cng nm tr v
ngoi l tng t nh phong thc getByName(). N cng c c php:
public static InetAddress getLocalHost( ) throws UnknownHostException
Ngoi cc phng thc static trn, mt s phng thc khc cho php tr v a ch IP hoc tn
ca mt my trm t i tng InetAddress ca my trm sau khi ly c a ch ca my
trm. Cc phng thc tiu biu l:
Phng thc getHosName():Tr v tn my trm t i tng InetAddress ca my trm
. C php:

IT

public String getHostName( )


V d: Cho a ch, in ra tn my trm:
import java.net.*;

public class ReverseTest {

public static void main (String[] args) {

PT

try {

InetAddress ia = InetAddress.getByName("208.201.239.37");
System.out.println(ia.getHostName( ));

catch (Exception ex) {

System.err.println(ex);

Phng thc getHostAddress(): Tr v a ch IP ca my trm t i tng InetAddress


tng ng l chui a ch dng a.b.c.d. Phng thc c c php:
public String getHostAddress( )
V d: In ra a ch IP ca my cc b
import java.net.*;
public class MyAddress {
public static void main(String[] args) {
try {
InetAddress me = InetAddress.getLocalHost( );
String dottedQuad = me.getHostAddress( );
System.out.println("My address is " + dottedQuad);

}
catch (UnknownHostException ex) {
System.out.println("I'm sorry. I don't know my own address.");
}
}
}

Phng thc getAddress(): Tr v a ch IP ca my trm t i tng InetAddress ca


my trm tng ng di dng mng byte. Phng thc c c php:
public byte[] getAddress( )
V d: Phng thc getVersion() ly phin bn a ch IP ca my cc b:
import java.net.*;
public class AddressTests {
public static int getVersion(InetAddress ia) {
byte[] address = ia.getAddress( );
if (address.length == 4) return 4;
else return -1;
}

IT

else if (address.length == 16) return 6;

PT

Lu : Khi in ra cc byte a ch IP, nu gi tr ca byte a ch m vt qua 127 thi phi


cng vi 256 ra gi tr ng( v kiu byte ch c gi tr trong khong t 0128 n +127), nu
khng n s c gi tr m. V d vi mng address trong v d trn:
for(int i=0;i<address.length;i++)

System.out.println((address[i]>0)?address[i]: (address[i]+256));

Cc phng thc khc ca lp InetAddress:

public boolean isAnyLocalAddress( ): Phng thc ny tr v gi tr true vi a ch wildcard,


false nu khng phi. a ch wildcard tng hp vi bt c a ch no ca my cc b. Phng
thc ny quan trng nu h thng cc b c nhiu card giao tip mng, nht l i vi server v
gateway. Trong IPv4, a ch wildcard l 0.0.0.0, trong IPv6 l 0:0:0:0:0:0:0:0.
public boolean isLoopbackAddress( ): Phng thc ny kim tra mt a ch c phi l a ch
loopback hay khng, nu khng phi tr v false. a ch loopback kt ni trc tip trong my
trm trong lp IP m khng s dng bt k phn cng vt l no. Vi IPv4, a ch loopback l
127.0.0.1, vi IPv6 l 0:0:0:0:0:0:0:1.
public boolean isLinkLocalAddress( ): Phng thc ny tr v gi tr true nu mt a ch l a
ch link-local IPv6, nu khng phi th tr v gi tr false. a ch link-local l a ch ch c h
tr trong mng IPv6 t cu hnh, tng t nh DHCP trn mng IPv4 nhng khng cn
server. B nh tuyn s khng cho php truyn qua cc gi tin c a ch ny ra khi mng con
cc b. Tt c a ch link-local u bt u vi 8 byte:
FE80:0000:0000:0000

8 byte tip theo s l a ch cc b thng l a ch ly t a ch MAC trong th


Ethernet(NIC).
public boolean isMulticastAddress( ): Trae v true nu a ch l a ch multicast, nu khng tr
v gi tr false. Trong IPv4, a ch multicast nm trong di a ch IP: 224.0.0.0>239.255.255.255(lp D), trong IPv6 th chng c bt u vi byte c gi tr FF.
1. 2. V d s dng cc phng thc lp InetAddress
Chng trnh sau cho php s dng cc phng thc ca lp InetAddresss hin th cc c
trng ca mt a ch IP c nhp vo t trn dng lnh. M chng trnh v d c th hin
nh sau:
//IPCharacteristics.java
import java.net.*;
public class IPCharacteristics {
public static void main(String[] args) {
try {
InetAddress address = InetAddress.getByName(args[0]);

IT

if (address.isAnyLocalAddress( )) {
System.out.println(address + " is a wildcard address.");
}

if (address.isLoopbackAddress( )) {

System.out.println(address + " is loopback address.");

PT

if (address.isLinkLocalAddress( )) {
System.out.println(address + " is a link-local address.");
}

else if (address.isSiteLocalAddress( )) {
System.out.println(address + " is a site-local address.");
}

else {

System.out.println(address + " is a global address.");


}
if (address.isMulticastAddress( )) {
if (address.isMCGlobal( )) {
System.out.println(address + " is a global multicast address.");
}
else if (address.isMCOrgLocal( )) {
System.out.println(address
+ " is an organization wide multicast address.");
}
else if (address.isMCSiteLocal( )) {
System.out.println(address + " is a site wide multicast

address.");
}
else if (address.isMCLinkLocal( )) {
System.out.println(address + " is a subnet wide multicast
address.");
}
else if (address.isMCNodeLocal( )) {
System.out.println(address
+ " is an interface-local multicast address.");
}
else {
System.out.println(address + " is an unknown multicast
address type.");
}
}
else {

IT

System.out.println(address + " is a unicast address.");


}
}

catch (UnknownHostException ex) {


}
}
}

PT

System.err.println("Could not resolve " + args[0]);

Sau khi bin dch chng trnh, chy chng trnh vi lnh:
java IPCharacteristics

<addresss> [Enter]

III. LP TRNH NG DNG MNG VI TCPSOCKET


1. Giao thc TCP v c ch truyn thng ca TCP
<Tham kho gio trnh mng my tnh>
2. Mt s lp Java h tr lp trnh vi TCPSocket
2.1. Lp Socket
Lp Socket dng to i tng socket cho php truyn thng vi giao thc TCP hoc UDP.
(Vi giao thc UDP ngi ta thng s dng lp DatagramSocket thay v lp Socket).
2.1.1. Cc cu t:

public Socket(String host, int port)


throws UnknownHostException, IOException

Cu t ny cho php to ra i tng Socket truyn thng vi giao thc TCP v thc hin kt
ni vi my trm t xa c a ch v s cng c ch ra bi tham s host v port tng ng.
Tham s host c th l tn my trm, tn min hoc a ch IP. Nu khng tm thy my trm t

xa hoc i tung Socket khng c m th n nm tr v ngoi l UnknownHostException


hoc IOException. V d on chong trnh sau cho php m socket v kt ni ti my trm t
xa c tn min www.yahoo.com v s cng l 80.
try {
Socket toYahoo = new Socket("www.yahoo.com", 80);
// Hot ng gi /nhn d liu
}
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}

public Socket(InetAddress host, int port) throws IOException

IT

Cu t ny tng t nh cu t trn, nhng tham s th nht l i tng InetAddress ca my


trm t xa. i tng InetAddress ca my trm t xa c th ly c bng phng thc
getByName() ca lp InetAddress.
public Socket(String host, int port, InetAddress interface, int localPort) throws IOException,
UnknownHostException

PT

Cu t ny cho php to ra i tng Socket v kt ni vi my trm t xa. Hai tham s u l


tn v s cng ca my trm t xa, 2 tham s sau l giao tip mng vt l(NIC) hoc o v s
cng c s dng trn my cc b. Nu s cng cc b localPort m bng 0 th Java s chn s
dng mt s cng cho php ngu nhin trong khong 1024 n 65535.
public Socket(InetAddress host, int port, InetAddress interface, int localPort) throws
IOException

Tng t nh cu t trn, nhng tham s th nht l i tng InetAddress ca my trm t xa.


protected Socket( )
Cu t ny to i tng socket m khng kt ni vi my trm t xa. Cu t ny c s dng
khi chng trnh c cc socket lp con.
2.1.2. Mt s phng thc quan trng ca lp Socket

public InetAddress getInetAddress( ): Phng thc cho php tr v a ch ca my trm t


xa hin ang kt ni vi socket.

public int getPort( ): Tr v s cng trn my trm t xa m hin ang kt ni vi socket.

public int getLocalPort( ): Tr v s cng trn my cc b

public InputStream getInputStream( ) throws IOException: Tr v lung nhp ca socket l


i tng InputStream.

public OutputStream getOutputStream( ) throws IOException: Tr v lung xut ca socket


l i tng OutputStream.

public void close( ) throws IOException: ng socket

2.1.3. Thit t cc tu chn Socket


Tu chn socket ch ra lm th no lp Java Socket c th gi /nhn d liu trn native socket.
Socket kt c cc tu chn sau:
TCP_NODELAY

SO_BINDADDR

SO_TIMEOUT

SO_LINGER

SO_SNDBUF (Java 1.2 and later)

SO_RCVBUF (Java 1.2 and later)

SO_KEEPALIVE (Java 1.3 and later)

OOBINLINE (Java 1.4 and later)

IT

thit lp cc tu chn v tr v trng thi cc tu chn, lp socket c cc phng thc tng


ng. V d thit t v tr v trng thi tu chn TCP_NODELAY, lp Socket c cc
phng thc sau:
public void setTcpNoDelay(boolean on) throws SocketException

PT

public boolean getTcpNoDelay( ) throws SocketException


2.2. Lp ServerSocket

Lp ServerSocket cho php to i tng socket pha server v truyn thng vi giao thc TCP.
Sau khi c to ra, n c t trng thi lng nghe( trng thi th ng) ch tn hiu kt ni
gi ti t client.
2.2.1 Cc cu t

public ServerSocket(int port) throws BindException, IOException

Cu t ny cho php to ra i tng ServerSocket vi s cng xc nh c ch ra bi tham s


port. Nu s cng port=0 th n cho php s dng mt s cng cho php no (anonymous port
). Cu t s nm tr v ngoi l khi socket khng th to ra c. Socket c to bi cu t
ny cho php p ng cc i ti 50 kt ni ng thi.

public ServerSocket(int port, int queueLength)


throws IOException, BindException

Tng t nh cu t trn nhng cho php ch ra s kt ni cc i m socket c th p ng


ng thi bi tham s queueLenth.

public ServerSocket( ) throws IOException

Cu t ny cho php to i tng ServerSocket nhng khng gn kt thc s socket vi mt s


cng c th no c. V nh vy n s khng th chp nhn bt c kt ni no gi ti. N s c
gn kt a ch sau s dng phng thc bind(). V d:
ServerSocket ss = new ServerSocket( );
// set socket options...
SocketAddress

http = new InetSocketAddress(80);

ss.bind(http);

2.2.2. Phng thc

Phng thc accept()

Phng thc ny c c php sau:


public Socket accept( ) throws IOException
Phng thc ny khi thc hin n t i tng ServerSocket trng thi nghe ti s cng xc
nh ch tn hiu kt ni gi n t client. Khi c tn hiu kt ni gi ti phng thc s tr v
i tng Socket mi phc v kt ni . Khi xy ra li nhp/xut, phng thc s nm tr
v ngoi l IOException. V d:

while (true) {

IT

ServerSocket server = new ServerSocket(5776);

PT

Socket connection = server.accept( );


OutputStreamWriter out

= new OutputStreamWriter(connection.getOutputStream( ));

out.write("You've connected to this server. Bye-bye now.\r\n");


connection.close( );
}

Phng thc close()

Phng thc close() c c php sau:


public void close( ) throws IOException
Phng thc ny cho php ng soccket v gii phng ti nguyn cp cho socket.
3. K thut lp trnh truyn thng vi giao thc TCP

Trong chng trnh ng dng mng xy dng theo m hnh client/server, chng trnh client
v chng trnh server c th truyn thng c vi nhau th mi pha phi thc hin ti thiu
cc thao tc c bn sau y(Hnh 2.2 ):

3.1. Chng trnh pha server:

IT

Hnh 2.2. Qu trnh khi to truyn thng vi TCPSocket


To i tng ServerSocket vi mt s hiu cng xc nh

t i tng ServerSocket trng thi nghe tn hiu n kt ni bng phng thc


accept(). Nu c tn hiu n kt ni phng thc accept() to ra i tng Socket
mi phc v kt ni .

PT

Khai bo lung nhp/xut cho i tng Socket mi( to ra bc trn). Lung


nhp/xut c th l lung kiu byte hoc kiu char.
Thc hin truyn d liu vi client thng qua lung nhp/xut
Server hoc client hoc c 2 ng kt ni
Server tr v bc 2 v i kt ni tip theo.

3.2. Chng trnh client

To i tng Socket v thit lp kt ni ti server bng cch ch ra cc tham s ca


server.

Khai bo lng nhp/xut cho Socket. Lung nhp/xut c th l lung kiu byte
hoc kiu char.

Thc hin truyn d liu qua mng thng qua lung nhp/xut

ng Socket, gii phng cc ti nguyn khc, kt thc chng trnh nu cn.

Lu :

Bnh thng chng trnh server lun chy trc chng trnh client

Mt chng trnh server c th phc v nhiu client ng thi hoc lp.

V d:
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws IOException {

Socket echoSocket = null;


PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket("taranis", 7);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));

IT

} catch (UnknownHostException e) {

System.err.println("Don't know about host: taranis.");


System.exit(1);

} catch (IOException e) {

PT

System.err.println("Couldn't get I/O for "


+ "the connection to: taranis.");

System.exit(1);

BufferedReader stdIn = new BufferedReader(


new InputStreamReader(System.in));

String userInput;

while ((userInput = stdIn.readLine()) != null) {


out.println(userInput);
System.out.println("echo: " + in.readLine());
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}}

3.3. Lung nhp/xut mng v c/ghi d liu qua lung nhp/xut


Lung nhp/xut mng cho php chng trnh client v server trao i d liu vi nhau
qua mng. Lung nhp/xut ca socket c th l lung kiu byte hoc kiu k t. y chng ti
nu ln mt cch thng dng nht to lung kiu byte v kiu k t chung trnh thc hin
c ghi d liu vi mng.

Lung kiu byte

Gi s i tng Socket c to ra vi bin tham chiu l cl.


- Vi lung nhp:
+ To lung nhp cho socket:
InputStream inp=cl.getInputStream();
+ c d liu: C ba cch
-/ c mi ln mt byte: inp.read()
-/c mt khi d liu v ct vo mng b:
byte b=new byte[1024];

IT

inp.read(b) hoc inp.read(b,offset, len)


- Vi lung xut:
+To lung xut:

OutputStream outp=cl.getOutputStream();

PT

+ Vit d liu:

-/Vit mi ln mt byte b: outp.write(b);


-/ Vit c khi d liu cha trong mng b kiu byte:
//byte[]

b;

outp.write(b) hoc outp.write(b,offset,len);

Lung kiu char:

- Vi lung nhp:

+To lung nhp:


BufferedReader inp=new BuferedReader(
new
+ c d liu:

InputStreamReader(cl.getInputStream()));

-/c tng k t: int ch=inp.read()


-/ c chui:

String s=inp.readLine();

- Vi lung xut:
+ To lung xut:
PrintWriter outp=new PrintWriter(cl.getOutputStream(),true);
+ Vit d liu:

outp.println(<data>);
4. Mt s v d
4.1. Chng trnh qut cng s dng Socket
//PortScanner.java
import java.net.*;
import java.io.*;
public class PortScanner {
public static void main(String[] args) {
String host = "localhost";
if (args.length > 0) {
host = args[0];
}
try {
InetAddress theAddress = InetAddress.getByName(host);
for (int i = 1; i < 65536; i++) {

try {

IT

Socket connection = null;

connection = new Socket(host, i);

System.out.println("There is a server on port "


+ i + " of " + host);

PT

catch (IOException ex) {

// must not be a server on this port

finally {
try {

if (connection != null) connection.close( );

catch (IOException ex) {}


}
} // end for
} // end try
catch (UnknownHostException ex) {
System.err.println(ex);
}
}
}

// end main

// end PortScanner

4.2. Chng trnh qut cng cc b dng lp ServerSocket


import java.net.*;

import java.io.*;
public class LocalPortScanner {
public static void main(String[] args) {
for (int port = 1; port <= 65535; port++) {
try {
// the next line will fail and drop into the catch block if
// there is already a server running on the port
ServerSocket server = new ServerSocket(port);
}
catch (IOException ex) {
System.out.println("There is a server on port " + port + ".");
} // end catch
} // end for
}

4.3. Chng trnh finger client

IT

Finger l mt giao thc truyn thng theo RFC 1288, client to kt ni TCP ti server vi s
cng 79 v gi mt truy vn on-line ti server. Server p ng truy vn v ng kt ni.
import java.net.*;

PT

import java.io.*;
public class FingerClient {

public final static int DEFAULT_PORT = 79;


public static void main(String[] args) {
String hostname = "localhost";
try {

hostname = args[0];
}

catch (ArrayIndexOutOfBoundsException ex) {


hostname = "localhost";
}
Socket connection = null;
try {
connection = new Socket(hostname, DEFAULT_PORT);
Writer out = new OutputStreamWriter(
connection.getOutputStream( ), "8859_1");
for (int i = 1; i < args.length; i++) out.write(args[i] + " ");
out.write("\r\n");
out.flush( );
InputStream raw = connection.getInputStream( );

BufferedInputStream buffer = new BufferedInputStream(raw);


InputStreamReader in = new InputStreamReader(buffer, "8859_1");
int c;
while ((c = in.read( )) != -1) {
// filter non-printable and non-ASCII as recommended by RFC 1288
if ((c >= 32 && c < 127) || c == '\t' || c == '\r' || c == '\n')
{
System.out.write(c);
}
}
}
catch (IOException ex) {
System.err.println(ex);
}
finally {
try {

IT

if (connection != null) connection.close( );


}

catch (IOException ex) {}


}
}

PT

4.4. Chng trnh cho php ly thi gian server v client.


//TimeClient.java

import java.net.*;
import java.io.*;

import java.util.*;

public class TimeClient {


public final static int

DEFAULT_PORT = 37;

public final static String DEFAULT_HOST = "time.nist.gov";


public static void main(String[] args) {
String hostname = DEFAULT_HOST ;
int port = DEFAULT_PORT;
if (args.length > 0) {
hostname = args[0];
}
if (args.length > 1) {
try {
port = Integer.parseInt(args[1]);
}

catch (NumberFormatException ex) {


// Stay with the default port
}
}
// The time protocol sets the epoch at 1900,
// the Java Date class at 1970. This number
// converts between them.
long differenceBetweenEpochs = 2208988800L;
// If you'd rather not use the magic number, uncomment
// the following section which calculates it directly.
/*
TimeZone gmt = TimeZone.getTimeZone("GMT");
Calendar epoch1900 = Calendar.getInstance(gmt);
epoch1900.set(1900, 01, 01, 00, 00, 00);

IT

long epoch1900ms = epoch1900.getTime( ).getTime( );


Calendar epoch1970 = Calendar.getInstance(gmt);
epoch1970.set(1970, 01, 01, 00, 00, 00);

long epoch1970ms = epoch1970.getTime( ).getTime( );


long differenceInMS = epoch1970ms - epoch1900ms;
*/

PT

long differenceBetweenEpochs = differenceInMS/1000;


InputStream raw = null;
try {

Socket theSocket = new Socket(hostname, port);


raw = theSocket.getInputStream( );
long secondsSince1900 = 0;

for (int i = 0; i < 4; i++) {

secondsSince1900 = (secondsSince1900 << 8) | raw.read( );


}
long secondsSince1970
= secondsSince1900 - differenceBetweenEpochs;
long msSince1970 = secondsSince1970 * 1000;
Date time = new Date(msSince1970);
System.out.println("It is " + time + " at " + hostname);
}

// end try

catch (UnknownHostException ex) {


System.err.println(ex);
}
catch (IOException ex) {

System.err.println(ex);
}
finally {
try {
if (raw != null) raw.close( );
}
catch (IOException ex) {}
}
}

// end main

} // end TimeClient
//TimeServe.java
import java.net.*;
import java.io.*;
import java.util.Date;
public class TimeServer {
public final static int DEFAULT_PORT = 37;

int port = DEFAULT_PORT;


if (args.length > 0) {
try {

IT

public static void main(String[] args) {

port = Integer.parseInt(args[0]);

PT

if (port < 0 || port >= 65536) {

System.out.println("Port must between 0 and 65535");


return;

}
}

catch (NumberFormatException ex) {}


}

// The time protocol sets the epoch at 1900,


// the Date class at 1970. This number
// converts between them.
long differenceBetweenEpochs = 2208988800L;
try {
ServerSocket server = new ServerSocket(port);
while (true) {
Socket connection = null;
try {
connection = server.accept( );
OutputStream out = connection.getOutputStream( );
Date now = new Date( );
long msSince1970 = now.getTime( );

long secondsSince1970 = msSince1970/1000;


long secondsSince1900 = secondsSince1970
+ differenceBetweenEpochs;
byte[] time = new byte[4];
time[0]= (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24);
time[1 = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
time[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
time[3] = (byte) (secondsSince1900 & 0x00000000000000FFL);
out.write(time);
out.flush( );
} // end try
catch (IOException ex) {
} // end catch
finally {
if (connection != null) connection.close( );
}
}

// end while

// end try

catch (IOException ex) {


System.err.println(ex);
} // end catch

PT

} // end main

IT

} // end TimeServer

5. Case study: Login t xa dng giao thc TCP/IP


5.1 Bi ton

Bi ton login t xa dng giao thc TCP/IP t ra nh sau:


-

C s d liu c lu tr v qun l trn server TCP, trong c bng users cha t


nht hai ct: ct username v ct password.

Chng trnh pha client TCP phi hin giao din ha, trong c mt text
nhp username, mt text nhp password, v mt nt nhn Login.

Khi nt Login c click, chng trnh client s gi thng tin ng nhp


(username/password) trn form giao din, v gi sang server theo giao thc TCP

Ti pha server, mi khi nhn c thng tin ng nhp gi t client, n s tin hnh
kim tra trong c s d liu xem c ti khon no trng vi thng tin ng nhp nhn
c hay khng.

Sau khi c kt qu kim tra (ng nhp ng, hoc sai), server TCP s gi kt qu ny
v cho client tng ng, theo ng giao thc TCP.

pha client, sau khi nhn c kt qu ng nhp (ng nhp ng, hoc sai) t
server, n s hin th thng bo tng ng vi kt qu nhn c: nu ng nhp

ng th thng bo login thnh cng. Nu ng nhp sai th thng bo l


username/password khng ng.
-

Yu cu kin trc h thng c hai pha client v server u c thit k theo m


hnh MVC

5.2 Kin trc h thng theo m hnh MVC


V h thng c thit k theo m hnh client/server dng giao thc TCP/IP nn mi pha client,
server s c mt s lp ring, cc s ny c thit k theo m hnh MVC.

PT

IT

5.2.1 S lp pha client

Hnh 2.3: S lp pha client TCP/IP

S lp ca pha client c thit k theo m hnh MVC trong Hnh 2.3, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
-

Lp User: l lp tng ng vi thnh phn model (M), bao gm hai thuc tnh
username v password, cc hm khi to v cc cp getter/setter tng ng vi cc
thuc tnh.

Lp ClientView: l lp tng ng vi thnh phn view (V), l lp form nn phi k


tha t lp JFrame ca Java, n cha cc thuc tnh l cc thnh phn ha bao gm
text nhp username, text nhp password, nt nht Login.

Lp ClientControl: l lp tng ng vi thnh phn control (C), n cha mt lp ni


ti l LoginListener. Khi nt Login trn tng view b click th n s chuyn tip s
kin xung lp ni ti ny x l. Tt c cc x l u gi t trong phng thc
actionPerformed ca lp ni ti ny, bao gm: ly thng tin trn form giao din v gi
sang server theo giao thc TCP/IP, nhn kt qu ng nhp t server v v yu cu

form giao din hin th. iu ny m bo nguyn tc control iu khin cc phn cn


li trong h thng, ng theo nguyn tc ca m hnh MVC.
5.2.2 S lp pha server
S lp ca pha server c thit k theo m hnh MVC trong Hnh 2.4, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
Lp User: l lp thc th, dng chung thng nht vi lp pha bn client.

Lp ServerView: l lp tng ng vi thnh phn view (V), l lp dng hin th cc


thng bo v trng thi hot ng bn server TCP.

Lp ServerControl: l lp tng ng vi thnh phn control (C), n m nhim vai


tr x l ca server TCP, bao gm: nhn thng tin ng nhp t pha cc client, kim
tra trong c s d liu xem cc thng tin ny ng hay sai, sau gi kt qu ng
nhp v cho client tng ng.

PT

IT

Hnh 2.4: S lp pha server TCP/IP


5.2.3 Tun t cc bc thc hin

Hnh 2.5: Tun t cc bc thc hin theo giao thc TCP/IP


Tun t cc bc x l nh sau (Hnh 2.5):

IT

1. pha client, ngi dng nhp username/password v click vo giao din ca lp


ClientView
2. Lp ClientView s ng gi thng tin username/password trn form vo mt i
tng model User bng phng thc getUser() v chuyn xung cho lp
ClientControl x l

PT

3. Lp ClientControl gi thng tin cha trong i tng User ny sang pha server
kim tra ng nhp
4. Bn pha server, khi nhn c thng tin ng nhp trong i tng User, n s
gi phng thc checkLogin() km tra thng tin ng nhp trong c s d liu.
5. Kt qu kim tra s c tr v cho lp ClientControl
6. pha client, khi nhn c kt qu kim tra ng nhp, lp ClientControl s
chuyn cho lp LoginView hin th bng phng thc showMessage()
7. Lp LoginView hin th kt qu ng nhp ln cho ngi dng
5.3 Ci t
5.3.1 Cc lp pha client
User.java
package tcp.client;
import java.io.Serializable;
public class User implements Serializable{
private String userName;
private String password;
public User(){
}

public User(String username, String password){


this.userName = username;
this.password = password;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}

ClientView.java

IT

PT

package tcp.client;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class ClientView extends JFrame implements ActionListener{


private JTextField txtUsername;
private JPasswordField txtPassword;
private JButton btnLogin;
public ClientView(){
super("TCP Login MVC");
txtUsername = new JTextField(15);
txtPassword = new JPasswordField(15);
txtPassword.setEchoChar('*');
btnLogin = new JButton("Login");
JPanel content = new JPanel();
content.setLayout(new FlowLayout());
content.add(new JLabel("Username:"));
content.add(txtUsername);
content.add(new JLabel("Password:"));
content.add(txtPassword);

content.add(btnLogin);
this.setContentPane(content);
this.pack();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e) {
}
public User getUser(){
User model = new User(txtUsername.getText(), txtPassword.getText());
return model;
}

IT

public void showMessage(String msg){


JOptionPane.showMessageDialog(this, msg);
}
public void addLoginListener(ActionListener log) {
btnLogin.addActionListener(log);
}
}

PT

ClientControl.java

package tcp.client;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class ClientControl {


private ClientView view;
private String serverHost = "localhost";
private int serverPort = 8888;
public ClientControl(ClientView view){
this.view = view;
this.view.addLoginListener(new LoginListener());
}
class LoginListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
User user = view.getUser();
Socket mySocket = new Socket(serverHost, serverPort);
ObjectOutputStream oos =
new ObjectOutputStream(mySocket.getOutputStream());
oos.writeObject(user);

ObjectInputStream ois =
new ObjectInputStream(mySocket.getInputStream());
Object o = ois.readObject();
if(o instanceof String){
String result = (String)o;
if(result.equals("ok"))
view.showMessage("Login succesfully!");
else view.showMessage("Invalid username and/or password!");
}
mySocket.close();
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}
}
}
}

ClientRun.java
package tcp.client;

PT

IT

public class ClientRun {


public static void main(String[] args) {
ClientView view = new ClientView();
ClientControl control = new ClientControl(view);
view.setVisible(true);
}
}

5.3.2 Cc lp pha server


ServerView.java

package tcp.server;

public class ServerView {


public ServerView(){
}

public void showMessage(String msg){


System.out.println(msg);
}
}

ServerControl.java
package tcp.server;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import tcp.client.User;
public class ServerControl {
private ServerView view;
private Connection con;
private ServerSocket myServer;
private Socket clientSocket;
private int serverPort = 8888;
public ServerControl(ServerView view){
this.view = view;
getDBConnection("usermanagement", "root", "12345678");
openServer(serverPort);
view.showMessage("TCP server is running...");
while(true){
listenning();
}
}

IT

private void getDBConnection(String dbName,


String username, String password){
String dbUrl = "jdbc:mysql://localhost:3306/" + dbName;
String dbClass = "com.mysql.jdbc.Driver";

PT

try {
Class.forName(dbClass);
con = DriverManager.getConnection (dbUrl, username, password);
}catch(Exception e) {
view.showMessage(e.getStackTrace().toString());
}

private void openServer(int portNumber){


try {
myServer = new ServerSocket(portNumber);
}catch(IOException e) {
view.showMessage(e.toString());
}
}
private void listenning(){
try {
clientSocket = myServer.accept();
ObjectInputStream ois =
new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream oos =
new ObjectOutputStream(clientSocket.getOutputStream());
Object o = ois.readObject();
if(o instanceof User){
User user = (User)o;
if(checkUser(user)){
oos.writeObject("ok");
}
else
oos.writeObject("false");

}
}catch (Exception e) {
view.showMessage(e.toString());
}
}

private boolean checkUser(User user) throws Exception {


String query = "Select * FROM users WHERE username ='"
+ user.getUserName()
+ "' AND password ='" + user.getPassword() + "'";
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
if (rs.next()) {
return true;
}
}catch(Exception e) {
throw e;
}
return false;
}

ServerRun.java
package tcp.server;

IT

5.5 Kt qu

PT

public class ServerRun {


public static void main(String[] args) {
ServerView view
= new ServerView();
ServerControl control = new ServerControl(view);
}
}

Login thnh cng:

Login li:

IV. LP TRNH NG DNG MNG VI UDPSOCKET


1. Giao thc UDP v c ch truyn thng ca UDP
<Tham kho gio trnh mng my tnh>
2. Mt s lp Java h tr lp trnh vi UDPSocket
2.1. Lp DatagramPacket

IT

Lp ny cho php to gi tin truyn thng vi giao thc UDP. Lp ny kt tha trc tip t lp
Object.
public final class DatagramPacket extends Object
Gi tin l i tng ca lp ny cha 4 thnh phn quan trng: a ch, d liu truyn tht s,
kch thc ca gi tin v s hiu cng cha trong gi tin.
2.1.1. Cu t

PT

Lp ny c cc cu t to gi tin gi v gi tin nhn khc nhau:


* Cu t to gi tin nhn t mng:

public DatagramPacket(byte[] inBuffer, int length)

Tham s:

inBuffer: B m nhp, cha d liu ca gi tin nhn

length: kch c ca d liu ca gi tin nhn, n thng c xc nh bng lnh: length=


buffer.length.

V d to gi tin nhn:
byte[] inBuff=new byte[512];//b m nhp
DatagramPacket inData=new DatagramPacket(inBuf, inBuff.length);
* Cu t to gi tinh gi:
public DatagramPacket(byte[] outBuffer , int length,
InetAddress destination, int port)
Tham s:

outBuffer: B m xut cha d liu ca gi tin gi

length: kch c d liu ca gi tin gi tnh theo s byte v thng bng outBuffer.length.

destination: a ch ni nhn gi tin

port: S hiu cng ch, ni nhn gi tin.

V d:
String s= Hello World!;
//B m xut v gn d liu cho b m xut
byte[] outBuff=s.getBytes();
//a ch ch
InetAddress addrDest=InetAddress.getByName(localhost);
//S cng ch
int

portDest=3456;

//To gi tin gi
DatagramPacket outData=new DatagramPacket(outBuff,
outBuff.length, addrDest, portDest);

2.1.2. Phng thc


public InetAddress getAddress( ): Phng thc ny tr v i tng InetAddress ca my
trm t xa cha trong gi tin nhn.

public int getPort( ): Tr v s hiu cng ca my trm t xa cha trong gi tin.

public byte[] getData( ): Tr v d liu cha trong gi tin di dng mng byte.

public int getLength( ): Tr v kch c ca d liu cha trong gi tin tnh theo s byte.

IT

PT

Tng ng vi 4 phng thc getXXXX..(), lp DatagramPacket c 4 phng thc


setXXXX..() thit lp 4 tham s cho gi tin gi.
2.2. Lp DatagramSocket

Lp DatagramSocket cho php to ra i tng socket truyn thng vi giao thc UDP. Socket
ny cho php gi/nhn gi tin DatagramPacket. Lp ny c khai bo k tha t lp Object.
public class DatagramSocket extends Object

2.2.1. Cc cu t (phng thc khi to)

public DatagramSocket( ) throws SocketException:

Cu t ny cho php to ra socket vi s cng no (anonymous) v thng c s dng pha


chng trnh client. Nu to socket khng thnh cng, n nm tr v ngoi l SocketException.
V d:
try {
DatagramSocket client = new DatagramSocket( );

// send packets...
}

catch (SocketException ex) {

System.err.println(ex);
}

public DatagramSocket(int port) throws SocketException:

Cu t ny cho php to socket vi s cng xc nh v ch nhn gi tn truyn ti. Cu t ny


c s dng pha server trong m hnh client/server. V d chng trnh sau s cho php hin
th cc cng cc b c s dng:
//UDPPortScanner.java
import java.net.*;
public class UDPPortScanner {
public static void main(String[] args) {
for (int port = 1024; port <= 65535; port++) {
try {

IT

// the next line will fail and drop into the catch block if
// there is already a server running on port i
DatagramSocket server = new DatagramSocket(port);
server.close( );
}

PT

catch (SocketException ex) {

System.out.println("There is a server on port " + port + ".");

} // end try

} // end for

}
}

2.2.2. Cc phng thc

public void send(DatagramPacket dp) throws IOException:

Phng thc ny cho php gi gi tin UDP qua mng. V d chong trnh sau nhn mt chui t
bn phm, to gi tin gi v gi ti server.
//UDPDiscardClient.java
import java.net.*;
import java.io.*;
public class UDPDiscardClient {
public final static int DEFAULT_PORT = 9;
public static void main(String[] args) {
String hostname;
int port = DEFAULT_PORT;
if (args.length > 0) {
hostname = args[0];

try {
port = Integer.parseInt(args[1]);
}
catch (Exception ex) {
// use default port
}
}
else {
hostname = "localhost";
}
try {
InetAddress server = InetAddress.getByName(hostname);
BufferedReader userInput
= new BufferedReader(new InputStreamReader(System.in));
DatagramSocket theSocket = new DatagramSocket( );
while (true) {

IT

String theLine = userInput.readLine( );


if (theLine.equals(".")) break;

byte[] data = theLine.getBytes( );


DatagramPacket theOutput

= new DatagramPacket(data, data.length, server, port);

PT

theSocket.send(theOutput);

}
}

// end while

// end try

catch (UnknownHostException uhex) {


System.err.println(uhex);
}

catch (SocketException sex) {


System.err.println(sex);
}
catch (IOException ioex) {
System.err.println(ioex);
}
}

// end main

public void receive(DatagramPacket dp) throws IOException:

Phng thc nhn gi tin UDP qua mng. V d chng trnh sau s to i tng
DatagramSocket vi s cng xc nh, nghe nhn gi d liu gi n, hin th ni dung gi tin v
a ch, s cng ca my trm gi gi tin.

//UDPDiscardServer.java
import java.net.*;
import java.io.*;
public class UDPDiscardServer {
public final static int DEFAULT_PORT = 9;
public final static int MAX_PACKET_SIZE = 65507;
public static void main(String[] args) {
int port = DEFAULT_PORT;
byte[] buffer = new byte[MAX_PACKET_SIZE];
try {
port = Integer.parseInt(args[0]);
}
catch (Exception ex) {
// use default port
}
try {

IT

DatagramSocket server = new DatagramSocket(port);


DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
try {

server.receive(packet);

PT

String s = new String(packet.getData( ), 0, packet.getLength( ));


System.out.println(packet.getAddress( ) + " at port "
+ packet.getPort( ) + " says " + s);

// reset the length for the next packet


packet.setLength(buffer.length);

catch (IOException ex) {

System.err.println(ex);

}
} // end while
}

// end try

catch (SocketException

ex) {

System.err.println(ex);
}
}

// end catch

// end main

public void close( ): Phng thc ng socket.

Cc phng thc khc th hin trong bng sau:

Mt s phng thc ca lp DatagramSocket


bind(SocketAddress addr)
Gn kt DatagramSocket vi a ch v s cng c th

void

connect(InetAddress address,int port)


Kt ni socket vi a ch my trm t xa

void

connect(SocketAddress addr)
Kt ni socket vi a ch socket t xa.

void

disconnect()
Hu b kt ni

boolean

isBound()
Tr v trng thi kt ni ca socket.

boolean

isClosed()
Kim tra socket ng hay cha

boolean

isConnected()
Kim tra trng thi kt ni

PT

IT

void

3. K thut lp trnh truyn thng vi giao thc UDP


Trong m hnh client/server, chng trnh client v server c th truyn thng c vi nhau,
mi pha phi thc hin mt s thao tc c bn sau y(Hnh 2.3)

Hnh 2.6. Qu trnh khi to truyn thng UDPSocket


3.1. Pha server:

To i tng DatagramSocket vi s cng xc nh c ch ra

Khai bo b m nhp /xut inBuffer/outBuffer dng mng kiu byte

Khai bo gi tin nhn gi inData/outData l i tng DatagramPacket.

Thc hin nhn/gi gi tin vi phng thc receive()/send()

ng socket, gii phng cc ti nguyn khc, kt thc chng trnh nu cn, khng quay
v bc 3.

3.2. Pha client

To i tng DatagramSocket vi s cng no

Khai bo b m xut/nhp outBuffer/inBuffer dng mng kiu byte

Khai bo gi tin gi/nhn outData/inData l i tng DatagramPacket.

Thc hin gi /nhn gi tin vi phng thc send()/receive()

ng socket, gii phng cc ti nguyn khc, kt thc chng trnh nu cn, khng quay
v bc 3.

3.3. Mt s lu :
Chng trnh server phi chy trc chng trnh client v chng trnh client phi gi
gi tin n server trc. t gi tn nhn c pha server, server mi tch c a ch
v s hiu cng pha client , t mi to gi tin gi cho client.

Chng trnh server c th phc v nhiu my khch kiu lp.

4. Mt s chng trnh v d
4.1. Chng trnh minh ho

PT

//UDPEchoClient.java

IT

import java.net.*;
import java.io.*;

public class UDPEchoClient {

public final static int DEFAULT_PORT = 7;


public static void main(String[] args) {
String hostname = "localhost";
int port = DEFAULT_PORT;
if (args.length > 0) {
hostname = args[0];
}
try {
InetAddress ia = InetAddress.getByName(hostname);
Thread sender = new SenderThread(ia, DEFAULT_PORT);
sender.start( );
Thread receiver = new ReceiverThread(sender.getSocket( ));
receiver.start( );
}
catch (UnknownHostException ex) {
System.err.println(ex);

}
catch (SocketException ex) {
System.err.println(ex);
}
}

// end main

}
//UDPEchoServer.java
import java.net.*;
import java.io.*;
public class

extends UDPServer {

public final static int DEFAULT_PORT = 7;


public UDPEchoServer( ) throws SocketException {
super(DEFAULT_PORT);
}
try {

IT

public void respond(DatagramPacket packet) {

DatagramPacket outgoing = new DatagramPacket(packet.getData( ),


packet.getLength( ), packet.getAddress( ), packet.getPort( ));
socket.send(outgoing);
}

PT

catch (IOException ex) {

System.err.println(ex);

public static void main(String[] args) {


try {

UDPServer server = new UDPEchoServer( );


server.start( );

}
catch (SocketException ex) {
System.err.println(ex);
}
}
}

V. LP TRNH VI TH GIAO TIP MNG(NIC)


1. Gii thiu v th giao tip mng( network interface card-NIC)
Th giao tip mng l im lin kt gia my tnh vi mng ring hoc mng cng cng. Giao
tip mng ni chung l mt th giao tip mng(NIC) nhng n cng c th khng phi giao tip
vt l. M thay vo giao tip mng c th c thc hin trong dng phn mm. V d giao

tip loopback(127.0.0.1 i vi IPv4 v ::1 i vi IPv6) khng phi l dng thit b vt l m l


mt phn mm phng theo giao tip mng vt l. Giao tip loopback noi chung c s dng
trong mi trng th nghim.
2. Lp NetworkInterface
Lp ny dng cho c th giao tip vt l nh Ethernet Card hoc th giao tip o m c to ra
tng t ging nh th giao tip vt l. Lp NetworkInterface cung cp cc phng thc lit
k tt c cc a ch cc b v to ra i tng InetAddress t chng. Cc i tng InetAddress
ny c th c s dng to cc socket, server socket...
i tng NetworkInterface th hin phn cng vt l hoc a ch o v chng khng th c
xy dng tu . Cng tng t nh lp InetAdddress, n cng c mt s phng thc c thuc
tnh static cho php tr v i tng NetworkInterface gn kt vi b giao tip mng c th. Sau
y chng ta s kho st mt s phng thc quan trng ca lp NetworkInterface.
2.1. Cc phng thc static

Phng thc getByName():

IT

C php:
public static NetworkInterface getByName(String name)

throws SocketException

PT

Phng thc ny tr v i tng NetworkInterface biu din mt b giao tip mng vi tn c


th. Nu khng c tn th n tr v gi tr null. Nu cc tng mng nn tng xy ra vn ,
phng thc tr v ngoi l SocketException. Dng tn giao tip mng ph thuc vo nn c
th. Vi h iu hnh Unix, tn ca giao tip Ethernet c dng eth0, eth1,...a ch loopback cc
b c th t tn chng hn nh "lo". i vi h iu hnh Windows, tn l cc chui "CE31",
"ELX100" m c ly t cc nh cung cp v m hnh phn cng trn phn cng giao tip
mng . V d on chng trnh sau thc hin tm giao tip mng Etthernet c s trn h iu
hnh Unix:
try {

NetworkInterface ni = NetworkInterface.getByName("eth0");
if (ni == null) {

System.err.println("No such interface:

eth0" );

}
}
catch (SocketException ex) {

System.err.println("Could not list sockets." );

Phng thc getByInetAddress():

C php:
public static NetworkInterface getByInetAddress(InetAddress address)
throws SocketException
Phng thc ny tr v i tng NeworkInterface biu din giao tip mng c gn vi vi
mt a ch IP c th, Nu khng c giao tip mng gn vi a ch IP trn my trm cc b
th n tr v null. Khi xy ra li n nm tr v ngoi l SocketException. v d on chng
trnh sau minh ho cch s dng phng thc tm giao tip mng i vi a ch loopback cc
b:
try {
InetAddress local = InetAddress.getByName("127.0.0.1");
NetworkInterface ni = NetworkInterface.getByName(local);
if (ni == null) {
System.err.println("That's weird. No local loopback address.");

IT

}
}

catch (SocketException ex) {

System.err.println("Could not list sockets." );


}

PT

catch (UnknownHostException ex) {

System.err.println("That's weird. No local loopback address.");


}

Phng thc getNetworkInterfaces( ):

C php:

public static Enumeration getNetworkInterfaces( ) throws SocketException


Phng thc ny tr v i tng java.util.Enumeration l mt danh sch lit k tt c cc giao
tip mng c trn my cc b. Chng trnh v d sau minh ho cch s dng phng thc
a ra mt danh sch tt c cc giao tip mng trn my cc b:
//InterfaceLister.java
import java.net.*;
import java.util.*;
public class InterfaceLister {
public static void main(String[] args) throws Exception {
Enumeration interfaces = NetworkInterface.getNetworkInterfaces( );
while (interfaces.hasMoreElements( )) {
NetworkInterface ni = (NetworkInterface)
);
System.out.println(ni);

interfaces.nextElement(

}
}
}

2.2. Cc phng thc khc:

public Enumeration getInetAddresses( ): Phng thc ny tr v i tng


java.util.Enumeration cha i tng InetAddress i vi mi a ch IP m giao
tip mng c vi n. M mi giao tip mng n c th gn vi cc a ch IP khc nhau.
V d sau hin th tt c cc a ch IP gn vi giao din mng eth0:
NetworkInterface eth0 = NetworkInterrface.getByName("eth0");
Enumeration addresses = eth0.getInetAddresses( );
while (addresses.hasMoreElements( )) {
System.out.println(addresses.nextElement( ));
}

public String getName( ): Phng thc ny tr v tn ca i tng NetworkInterface c


th, chng hn nh eth0 hoc lo.

public String getDisplayName( ):

IT

Phng thc tr v tn "thn thin" hn ca mt giao tip mng c th. Trong mng Unix, n
tr v chui ging nh phng thc getName(), Trong mng Windows, no tr v chui tn "thn
thin" nh "Local Area Connection" hoc "Local Area Connection 2".

PT

Ngoi ra trong lp NetworkInterface cn nh ngha cc phng thc equals(), hashCode(),


toString().
3. Lp trnh vi giao tip mng(NIC)

Lp NetworkInterface th hin c 2 kiu giao din vt l v giao tip mm. Lp ny y hu ch


i vi cc h thng multihome c nhiu NIC. Vi lp ny, chng trnh c th ch ra NIC cho
mt hot ng mng c th.
gi d liu, h thng xc nh giao tip no s c s dng. Nhng cng c th truy vn h
thng i vi cc giao tip ph hp v tm mt a ch trn giao tip mun s dng. Khi chng
trnh to ra mt socket v gn n vi a ch , h thng s s dng giao tip c gn kt .
V d:
NetworkInterface nif = NetworkInterface.getByName("bge0");
Enumeration nifAddresses = nif.getInetAddresses();
Socket soc = new java.net.Socket();
soc.bind(nifAddresses.nextElement());
soc.connect(new InetSocketAddress(address, port));

Ngi s dng cng c th s dng NetworkInterface nhn bit giao tip cc b m mt nhm
multicast c ghp ni, v d:
NetworkInterface nif = NetworkInterface.getByName("bge0");
MulticastSocket() ms = new MulticastSocket();
ms.joinGroup(new InetSocketAddress(hostname, port) , nif);

3.1. Ly cc giao tip mng


Lp NetworkInterface khng c cu t public. Do khng th to c i tng vi ton t
new. Thay vo n c cc phng thc static(ging InetAddress) cho php ly c cc chi tit
giao tip t h thng: getByInetAddress(), getByName() v getNetworkInterfaces(). Hai
phng thc u tin c s dng khi c sn a ch IP hoc tn ca giao tip mng cc th.
Phng thc th 3, getNetworkInterfaces( ), tr v mt danh sch y cc giao tip mng
trn my tnh.
Giao tip mng cng c th t chc theo kiu phn cp. Lp NetworkInterface s dng 2 phng
thc getParent() v getSubInterface() i vi cu trc giao tip mng phn cp. Nu giao tip
mng l giao tip con, getParent() tr v gi tr none-null. Phng thc getSubInterfaces() s tr
v tt c cc giao tip con ca giao tip mng. V d sau y s hin th tn ca tt c cc giao
tip mng v giao tip con(n nu n tn ti) trn mt my:
//ListNIFs.java
import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

IT

public class ListNIFs


{
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets =
NetworkInterface.getNetworkInterfaces();

PT

for (NetworkInterface netIf : Collections.list(nets)) {


out.printf("Display name: %s\n", netIf.getDisplayName());
out.printf("Name: %s\n", netIf.getName());
displaySubInterfaces(netIf);
out.printf("\n");
}

static void displaySubInterfaces(NetworkInterface netIf) throws


SocketException {
Enumeration<NetworkInterface> subIfs = netIf.getSubInterfaces();
for (NetworkInterface subIf : Collections.list(subIfs)) {
out.printf("\tSub Interface Display name: %s\n",
subIf.getDisplayName());
out.printf("\tSub Interface Name: %s\n", subIf.getName());
}
}
}

Kt qu chy trn my tnh ca chng ti hin ra nh sau:


Display name: bge0
Name: bge0
Sub Interface Display name: bge0:3
Sub Interface Name: bge0:3
Sub Interface Display name: bge0:2
Sub Interface Name: bge0:2
Sub Interface Display name: bge0:1
Sub Interface Name: bge0:1
Display name: lo0

Name: lo0

3.2. Ly danh sch a ch giao tip mng


Mt phn thng tin cc k hu ch m ngi s dng cn ly c t giao tip mng l danh
sch a ch IP m c gn cho cc giao tip mng. Ngi s dng c th thu c thng tin t
mt th hin NetworkInterface bng cch s dng mt trong 2 phng thc sau: Phng thc
getInetAddresses() tr v mt Enumeration ca cc i tng InetAddress, cn phng thc
getInterfaceAddresses() tr v mt danh sch ca cc th hin java.net.InterfaceAddress. Phng
thcc ny c s dng khi ngi s dng cn thng tin nhiu hn v a ch giao tip ngoi a
ch IP ca n. V d, khi bn cn thng tin b sung v mt n mng con v a ch broardcast khi
a ch l mt a ch IPv4 v chiu di prefix mng trong a ch IPv6. V d sau y hin th
danh sch tt c cc giao tip mng v a ch ca chng trn mt my:
import
import
import
import

java.io.*;
java.net.*;
java.util.*;
static java.lang.System.out;

IT

public class ListNets


{
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets =
NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
displayInterfaceInformation(netint);
}

PT

static void displayInterfaceInformation(NetworkInterface netint)


throws SocketException {
out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
Enumeration<InetAddress> inetAddresses =
netint.getInetAddresses();
for (InetAddress inetAddress : Collections.list(inetAddresses))
{
out.printf("InetAddress: %s\n", inetAddress);
}
out.printf("\n");
}
}

Kt qu chy chng trnh trn my tnh ca chng ti nh sau:


Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /121.153.225.59
Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1

3.3. Truy cp cc tham s giao tip mng

Ngi s dng c th truy cp cc tham s v giao tip mng ngoi tn v a ch IP gn cho n.


V chng trnh c th pht hin giao tip mng ang chy vi phng thc isUp(). cc phng
thc sau ch th kiu giao tip mng:
isLoopback(): ch th giao tip mng l mt giao tip loopback.
isPointToPoint() ch th nu giao tip l giao tip point-to-point.
isVirrtual(): ch th nu giao tip l giao tip o(giao tip mm).
Phng thc supportsMulticast() ch th mt khi giao tip mng h tr multicast. Phng thc
getHardwareAddress() tr v a ch phn cng vt l ca giao tip mng, a ch MAC, khi n
c kh nng. Phng thc getMTU() tr v n v truyn cc i(MTU) l kch c gi tin ln
nht. V d sau m rng ca v d trn bng cch thm cc tham s mng b sung:
//ListNetsEx.java
import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

IT

public class ListNetsEx


{
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets =
NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
displayInterfaceInformation(netint);
}

PT

static void displayInterfaceInformation(NetworkInterface netint) throws


SocketException {
out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
for (InetAddress inetAddress : Collections.list(inetAddresses)) {
out.printf("InetAddress: %s\n", inetAddress);
}
out.printf("Up? %s\n", netint.isUp());
out.printf("Loopback? %s\n", netint.isLoopback());
out.printf("PointToPoint? %s\n", netint.isPointToPoint());
out.printf("Supports multicast? %s\n", netint.supportsMulticast());
out.printf("Virtual? %s\n", netint.isVirtual());
out.printf("Hardware address: %s\n",
Arrays.toString(netint.getHardwareAddress()));
out.printf("MTU: %s\n", netint.getMTU());
out.printf("\n");
}
}

Kt qu chy chng trnh trn my tnh ca chng ti nh sau:


Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2

InetAddress: /129.156.225.59
Up? true
Loopback? false
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: [0, 3, 4, 5, 6, 7]
MTU: 1500

IT

Display name: lo0


Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1
Up? true
Loopback? true
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: null
MTU: 8232

4. Mt s chng trnh v d minh ho s dng lp NetworkInterface v InetAddress


//InetExample.java

import java.util.Enumeration;
import java.net.*;

PT

public class InetExample {

public static void main(String[] args) {


// Get the network interfaces and associated addresses for this host
try {

Enumeration<NetworkInterface>
NetworkInterface.getNetworkInterfaces();

interfaceList

if (interfaceList == null) {

System.out.println("--No interfaces found--");


} else {
while (interfaceList.hasMoreElements()) {
NetworkInterface iface = interfaceList.nextElement();
System.out.println("Interface " + iface.getName() + ":");
Enumeration<InetAddress> addrList = iface.getInetAddresses();
if (!addrList.hasMoreElements()) {
System.out.println("\t(No addresses for this interface)");
}
while (addrList.hasMoreElements()) {
InetAddress address = addrList.nextElement();
System.out.print("\tAddress
"(v4)"

"

((address

instanceof

Inet4Address

: (address instanceof Inet6Address ? "(v6)" : "(?)"))));


System.out.println(": " + address.getHostAddress());
}
}
}
} catch (SocketException se) {
System.out.println("Error
se.getMessage());

getting

network

interfaces:"

}
// Get name(s)/address(es) of hosts given on command line
for (String host : args) {
try {
System.out.println(host + ":");
InetAddress[] addressList = InetAddress.getAllByName(host);
for (InetAddress address : addressList) {
address.getHostName()

"/"

IT

System.out.println("\t"
+
address.getHostAddress());
}

} catch (UnknownHostException e) {

System.out.println("\tUnable to find address for " + host);


}
}
}

PT

5. Case study: Login t xa dng giao thc UDP


5.1 Bi ton

Bi ton login t xa dng giao thc UDP t ra nh sau:


-

C s d liu c lu tr v qun l trn server UDP, trong c bng users cha t


nht hai ct: ct username v ct password.

Chng trnh pha client UDP phi hin giao din ha, trong c mt text
nhp username, mt text nhp password, v mt nt nhn Login.

Khi nt Login c click, chng trnh client s gi thng tin ng nhp


(username/password) trn form giao din, v gi sang server theo giao thc UDP

Ti pha server, mi khi nhn c thng tin ng nhp gi t client, n s tin hnh
kim tra trong c s d liu xem c ti khon no trng vi thng tin ng nhp nhn
c hay khng.

Sau khi c kt qu kim tra (ng nhp ng, hoc sai), server UDP s gi kt qu
ny v cho client tng ng, theo ng giao thc UDP.

pha client, sau khi nhn c kt qu ng nhp (ng nhp ng, hoc sai) t
server, n s hin th thng bo tng ng vi kt qu nhn c: nu ng nhp
ng th thng bo login thnh cng. Nu ng nhp sai th thng bo l
username/password khng ng.

Yu cu kin trc h thng c hai pha client v server u c thit k theo m


hnh MVC

5.2 Kin trc h thng theo m hnh MVC


V h thng c thit k theo m hnh client/server dng giao thc UDP nn mi pha client,
server s c mt s lp ring, cc s ny c thit k theo m hnh MVC.

PT

IT

5.2.1 S lp pha client

Hnh 2.7: S lp pha client UDP


S lp ca pha client c thit k theo m hnh MVC trong Hnh 2.7, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
-

Lp User: l lp tng ng vi thnh phn model (M), bao gm hai thuc tnh
username v password, cc hm khi to v cc cp getter/setter tng ng vi cc
thuc tnh.

Lp ClientView: l lp tng ng vi thnh phn view (V), l lp form nn phi k


tha t lp JFrame ca Java, n cha cc thuc tnh l cc thnh phn ha bao gm
text nhp username, text nhp password, nt nht Login.

Lp ClientControl: l lp tng ng vi thnh phn control (C), n cha mt lp ni


ti l LoginListener. Khi nt Login trn tng view b click th n s chuyn tip s
kin xung lp ni ti ny x l. Tt c cc x l u gi t trong phng thc
actionPerformed ca lp ni ti ny, bao gm: ly thng tin trn form giao din v gi
sang server theo giao thc UDP, nhn kt qu ng nhp t server v v yu cu form
giao din hin th. iu ny m bo nguyn tc control iu khin cc phn cn li
trong h thng, ng theo nguyn tc ca m hnh MVC.

PT

IT

5.2.2 S lp pha server

Hnh 2.8: S lp pha server UDP

S lp ca pha server c thit k theo m hnh MVC trong Hnh 2.8, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
-

Lp User: l lp thc th, dng chung thng nht vi lp pha bn client.

Lp ServerView: l lp tng ng vi thnh phn view (V), l lp dng hin th cc


thng bo v trng thi hot ng bn server UDP.

Lp ServerControl: l lp tng ng vi thnh phn control (C), n m nhim vai


tr x l ca server UDP, bao gm: nhn thng tin ng nhp t pha cc client, kim
tra trong c s d liu xem cc thng tin ny ng hay sai, sau gi kt qu ng
nhp v cho client tng ng.

5.2.3 Tun t cc bc thc hin

Hnh 2.9: Tun t cc bc thc hin theo giao thc UDP


Tun t cc bc x l nh sau (Hnh 2.9):

IT

1. pha client, ngi dng nhp username/password v click vo giao din ca lp


ClientView
2. Lp ClientView s ng gi thng tin username/password trn form vo mt i
tng model User bng phng thc getUser() v chuyn xung cho lp
ClientControl x l

PT

3. Lp ClientControl gi thng tin cha trong i tng User ny sang pha server
kim tra ng nhp
4. Bn pha server, khi nhn c thng tin ng nhp trong i tng User, n s
gi phng thc checkLogin() km tra thng tin ng nhp trong c s d liu.
5. Kt qu kim tra s c tr v cho lp ClientControl
6. pha client, khi nhn c kt qu kim tra ng nhp, lp ClientControl s
chuyn cho lp LoginView hin th bng phng thc showMessage()
7. Lp LoginView hin th kt qu ng nhp ln cho ngi dng
5.3 Ci t
5.3.1 Cc lp pha client
User.java
package udp.client;
import java.io.Serializable;
public class User implements Serializable{
private String userName;
private String password;
public User(){
}

public User(String username, String password){


this.userName = username;
this.password = password;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}

ClientView.java

IT

PT

package udp.client;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class ClientView extends JFrame implements ActionListener{


private JTextField txtUsername;
private JPasswordField txtPassword;
private JButton btnLogin;
public ClientView(){
super("UDP Login MVC");
txtUsername = new JTextField(15);
txtPassword = new JPasswordField(15);
txtPassword.setEchoChar('*');
btnLogin = new JButton("Login");
JPanel content = new JPanel();
content.setLayout(new FlowLayout());
content.add(new JLabel("Username:"));
content.add(txtUsername);
content.add(new JLabel("Password:"));
content.add(txtPassword);

content.add(btnLogin);
this.setContentPane(content);
this.pack();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e) {
}
public User getUser(){
User model = new User(txtUsername.getText(), txtPassword.getText());
return model;
}

IT

public void showMessage(String msg){


JOptionPane.showMessageDialog(this, msg);
}
public void addLoginListener(ActionListener log) {
btnLogin.addActionListener(log);
}
}

PT

ClientControl.java

package udp.client;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ClientControl {


private ClientView view;
private int serverPort = 5555;
private int clientPort = 6666;
private String serverHost = "localhost";
private DatagramSocket myClient;
public ClientControl(ClientView view){
this.view = view;
this.view.addLoginListener(new LoginListener());
}
class LoginListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
openConnection();

User user = view.getUser();


sendData(user);
String result = receiveData();
if(result.equals("ok"))
view.showMessage("Login succesfully!");
else
view.showMessage("Invalid username and/or password!");
closeConnection();
}
}
private void openConnection(){
try {
myClient = new DatagramSocket(clientPort);
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}
}

IT

private void closeConnection(){


try {
myClient.close();
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}
}

PT

private void sendData(User user){


try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(user);
oos.flush();
InetAddress IPAddress = InetAddress.getByName(serverHost);
byte[] sendData = baos.toByteArray();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, serverPort);
myClient.send(sendPacket);

} catch (Exception ex) {


view.showMessage(ex.getStackTrace().toString());
}
}
private String receiveData(){
String result = "";
try {
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
myClient.receive(receivePacket);
ByteArrayInputStream bais =

new ByteArrayInputStream(receiveData);
ObjectInputStream ois = new ObjectInputStream(bais);
result = (String)ois.readObject();
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}
return result;
}
}

ClientRun.java
package udp.client;

5.3.2 Cc lp pha server


ServerView.java
package udp.server;

PT

public class ServerView {


public ServerView(){
}

IT

public class ClientRun {


public static void main(String[] args) {
ClientView view = new ClientView();
ClientControl control = new ClientControl(view);
view.setVisible(true);
}
}

public void showMessage(String msg){


System.out.println(msg);
}
}

ServerControl.java

package udp.server;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import udp.client.User;

public class ServerControl {

private
private
private
private
private

ServerView view;
Connection con;
DatagramSocket myServer;
int serverPort = 5555;
DatagramPacket receivePacket = null;

public ServerControl(ServerView view){


this.view = view;
getDBConnection("usermanagement", "root", "12345678");
openServer(serverPort);
view.showMessage("UDP server is running...");
while(true){
listenning();
}
}
private void getDBConnection(String dbName,
String username, String password){
String dbUrl = "jdbc:mysql://localhost:3306/" + dbName;
String dbClass = "com.mysql.jdbc.Driver";

IT

try {
Class.forName(dbClass);
con = DriverManager.getConnection (dbUrl, username, password);
}catch(Exception e) {
view.showMessage(e.getStackTrace().toString());
}
}

PT

private void openServer(int portNumber){


try {
myServer = new DatagramSocket(portNumber);
}catch(IOException e) {
view.showMessage(e.toString());
}
}
private void listenning(){
User user = receiveData();
String result = "false";
if(checkUser(user)){
result = "ok";
}
sendData(result);
}
private void sendData(String result){
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(result);
oos.flush();
InetAddress IPAddress = receivePacket.getAddress();

int clientPort = receivePacket.getPort();


byte[] sendData = baos.toByteArray();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, clientPort);
myServer.send(sendPacket);
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}
}
private User receiveData(){
User user = null;
try {
byte[] receiveData = new byte[1024];
receivePacket =
new DatagramPacket(receiveData, receiveData.length);
myServer.receive(receivePacket);

IT

ByteArrayInputStream bais =
new ByteArrayInputStream(receiveData);
ObjectInputStream ois = new ObjectInputStream(bais);
user = (User)ois.readObject();
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}
return user;

PT

private boolean checkUser(User user) {


String query = "Select * FROM users WHERE username ='"
+ user.getUserName()
+ "' AND password ='" + user.getPassword() + "'";
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
if (rs.next()) {
return true;
}
}catch(Exception e) {
view.showMessage(e.getStackTrace().toString());
}
return false;

}
}

ServerRun.java
package udp.server;
public class ServerRun {
public static void main(String[] args) {
ServerView view
= new ServerView();
ServerControl control = new ServerControl(view);

}
}

5.5 Kt qu

PT

Login li:

IT

Login thnh cng:

VI. LP TRNH TRUYN THNG MULTICAST


1. Gii thiu truyn thng multicast v lp MulticastSocket
Trong truyn thng multicast cho php truyn gi tin ti mt nhm client nh s dng a ch
multicast ca lp D t a ch 224.0.0.0 n 239.255.255.255. Truyn thng multicast c nhiu
ng dng trong thc t nh:
Videoconferencing
Usenet news
Computer configuration
Cc a ch multicast:
224.0.0.1: Tt c cc h thng trn mng con cc b
224.0.0.2 : Tt c cc router tren mng con cc b.
224.0.0.11: Cc tc t di ng( agent) trn mng con cc b
224.0.1.1 : Giao thc nh thi mng
224.0.1.20: Th nghim m khng cho vt ra khi mng con cc b

224.2.X.X (Multicast Backbone on the Internet (MBONE)): c s dng cho audio v


video qung b trn mng Internet .
Java h tr lp MulticastSocket cho php to ra socket thc hin truyn thng kiu ny. Lp
MulticastSocket c k th t lp DatagramSocket
public class MulticastSocket extends DatagramSocket
MuticastSocket l mt DatagramSocket m thm kh nng ghp ni gp nhm cc my trm
multicast trn mng Internet. Mt nhm multicast c ch ra bi a ch lp D v mt a ch
cng UDP chun. Lp MulticastSocket c s dng pha bn nhn. Cc cu t v phng thc
ca lp MulticastSocket c trnh by tm tt trong bng sau:
Cu t lp MulticastSocket
MulticastSocket()
To socket muticast
MulticastSocket(int port)
To socket muticast v gn vi socket mt a ch cng c th.

IT

MulticastSocket(SocketAddress bindaddr)
To socket muticast v gn vi socket mt a ch socket c th.
Cc phng thc ca lp MulticastSocket

PT

InetAddress getInterface()
Ly a ch giao tip mng c s dng cho cc gi tin multicast
boolean getLoopbackMode()
Ly chui thit t i local loopback ca gi tin multicast

NetworkInterface getNetworkInterface()
Ly tp giao tip mng multicast
int getTimeToLive()
Ly tham s time to live mc nh ca cc gi tin multicast gi ra
socket

byte getTTL()
Ly tham s time- to -live
void joinGroup(InetAddress mcastaddr)
Ghp nhm multicast
void joinGroup(SocketAddress mcastaddr,
NetworkInterface netIf)
Ghp nhm multicast c th ti giao tip mng c th
void leaveGroup(InetAddress mcastaddr)
Loi b mt nhm multicast
void leaveGroup(SocketAddress mcastaddr,
NetworkInterface netIf)
Loi b mt nhm multicast trn giao tip mng cc b c ch
ra.

void send(DatagramPacket p, byte ttl)


Gi gi tin
void setInterface(InetAddress inf)
t giao tip mng multicast c s dng bi phng thc m
hnh vi ca n b nh hng bi gi tr ca gao tip mng.
void setLoopbackMode(boolean disiao tip mngable)
Cho php hoc lm mt hiu lc vng phn hi cc b ca lc
d liu multicast
void setNetworkInterface(NetworkInterface netIf)
Ch ra giao tip mng gi cc lc d liu multicast qua
void setTimeToLive(int ttl)
Thit t tham s TTL mc nh cho cc gi tin multicast gi trn
MulticastSocket nhm mc ch iu khin phm vi multicast.
void setTTL(byte ttl)
Thit t tham s TTL

IT

to ra kt ni mt nhm multicast, u tin phi to ra i tng MulticastSocket vi mt a


ch cng xc nh bng cch gi phng thc jointGroup() ca lp MulticastSocket. V d:

PT

// Kt ni mt nhm multicast v gi li cho ti nhm ...


String msg = "Hello";
InetAddress group = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(group);
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 6789);
s.send(hi);
// Nhn p ng ca chng
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
...
// OK, I'm done talking - leave the group...
s.leaveGroup(group);

Khi gi thng ip ti group, tt c cc my trm pha nhn l cc thnh vin ca nhm s nhn
c gi tin, loi b nhm, phng thc leaveGroup() s c gi.
2. Mt s v d gi/nhn d liu multicast
2.1. V d gi d liu multicast
import java.net.*;
// Which port should we send to
int port = 5000;
// Which address
String group = "225.4.5.6";
// Which ttl

PT

IT

int ttl = 1;
// Create the socket but we don't bind it as we are only going to send data
MulticastSocket s = new MulticastSocket();
// Note that we don't have to join the multicast group if we are only
// sending data and not receiving
// Fill the buffer with some data
byte buf[] = byte[10];
for (int i=0; i<buf.length; i++) buf[i] = (byte)i;
// Create a DatagramPacket
DatagramPacket pack = new DatagramPacket(buf, buf.length,
InetAddress.getByName(group), port);
// Do a send. Note that send takes a byte for the ttl and not an int.
s.send(pack,(byte)ttl);
// And when we have finished sending data close the socket
s.close();
2.2. V d nhn d liu multicast
import java.net.*;
// Which port should we listen to
int port = 5000;
// Which address
String group = "225.4.5.6";
// Create the socket and bind it to port 'port'.
MulticastSocket s = new MulticastSocket(port);
// join the multicast group
s.joinGroup(InetAddress.getByName(group));
// Now the socket is set up and we are ready to receive packets
// Create a DatagramPacket and do a receive
byte buf[] = byte[1024];
DatagramPacket pack = new DatagramPacket(buf, buf.length);
s.receive(pack);
// Finally, let us do something useful with the data we just received,
// like print it on stdout :-)
System.out.println("Received data from: " + pack.getAddress().toString() +
":" + pack.getPort() + " with length: " +
pack.getLength());
System.out.write(pack.getData(),0,pack.getLength());
System.out.println();
// And when we have finished receiving data leave the multicast group and
// close the socket
s.leaveGroup(InetAddress.getByName(group));
s.close();

2.3. Mt s v d khc
//MulticastJoin.java
import java.net.*;
import java.io.*;
public class MulticastJoin {
public static void main(String [ ] args){
try {
MulticastSocket mSocket = new MulticastSocket(4001);

InetAddress mAddr = InetAddress.getByName("224.0.0.1");


mSocket.joinGroup(mAddr);
byte [ ] buffer = new byte[512];
while (true) {
DatagramPacket dp = new DatagramPacket(buffer,
buffer.length);
mSocket.receive(dp);
String str = new String(dp.getData(), "8859_1");
System.out.println(str);
}//end of while
}//end of try
catch (SocketException se){
System.out.println("Socket Exception : " + se); }
catch (IOException e) { System.out.println("Exception : " + e); }
}//end of main
}// end of class definition

PT

IT

//MulticastListener.java
import java.net.*;
import java.io.*;
public class MulticastListener {
public static void main( String [ ] args) {
InetAddress mAddr=null;
MulticastSocket mSocket=null;
final int PORT_NUM= 4001;
try {
mAddr = InetAddress.getByName("audionews.mcast.net");
mSocket = new MulticastSocket(PORT_NUM);
String hostname = InetAddress.getLocalHost().getHostName();
byte [ ] buffer = new byte[8192];
mSocket.joinGroup(mAddr);
System.out.println("Listening from " + hostname + " at " +
mAddr.getHostName());
while (true){
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
mSocket.receive(dp);
String str = new String(dp.getData(), "8859_1");
System.out.println(str);
}//end of while
}
catch (SocketException se) {
System.out.println("Socket Exception : " + se);
}
catch (IOException e) {
System.out.println("Exception : " + e);
}
finally {
if (mSocket != null){
try {
mSocket.leaveGroup(mAddr);

mSocket.close();
}
catch (IOException e){ }
}//end of if
}//end of finally
}//end of main
}

VII. KT LUN

PT

IT

Trong chng ny chng ta nghin cu cc k thut lp trnh mng c bn s dng socket:


TCP Socket, UDP Socket. Sau chng ta nghin cu cch lp trnh vi a ch mng, vi
giao tip mng v k thut lp trnh truyn thng multicacst. Trong chng tip theo chng ta s
m rng kin thc trong chng ny pht trin cc chng trnh server phc v ng thi
nhiu chng trnh my khc cng nh tun t.

CHNG III
K THUT XY DNG NG DNG MNG PHA SERVER
I. GII THIU V CC KIU SERVER
Trong m hnh client/server, chng trnh server ng vai tr phc v yu cu gi ti t chng
trnh client. Chng trnh server c th phc v mt hoc nhiu client ng thi hoc phc v
kiu lp.
Server c th phn thnh cc loi sau:
Server chy ch ng thi hng khng kt ni(TCP)
Server chy ch lp hng khng kt ni(TCP)
Server chy ch ng thi hng khng kt ni(UDP)
Server chy ch lp hng khng kt ni(UDP)
v s phn loi ny c th hin nh hnh 3.

PT

Hng kt ni
(TCP)

IT

SERVER

Kiu ng
thi

Kiu lp
(Tun t)

Hng khng
kt ni(UDP)

Kiu ng
thi

Kiu lp
(Tun t)

Hnh 3.1. Cc kiu server


Trong cc kiu server ny, kiu server ng thi hng kt ni v server kiu lp hng khng
kt ni c s dng ph bin. Chnh v vy chng ta ch tp trung vo xt 2 kiu server ny.
1. Server chy ch ng thi hng kt ni
y l loi server chun, s dng giao thc truyn thng TCP. Server ny c th phc v nhiu
client ng thi. Kt ni c thit lp gia server vi mi client v kt ni c duy tr hot
ng cho n khi ton b lung c x l, cui cng kt ni c kt thc. Server hng kt
ni ng thi khng th ch s dng mt cng bit bi mi kt ni cn mt a ch cng v c
nhiu kt ni s c thit lp ti cng thi im. Chnh v vy server phi s dng nhiu cng
v n ch s dng mt cng bit r trc. Khi khi to, server s thc hin m th ng ti cng
bit r v t trng thi nghe tn hiu n kt ni t client. Mi khi c mt client thit lp kt
ni vi server qua cng , server s sinh ra cc server con vi mt s cng khc phc v

client . Cn server chnh s tip tc t trng thi nghe tn hiu kt ni khc.Server cng c
th s dng b m cho mi kt ni. Cc segment truyn t client ti s c ct vo b m ph
hp v s c phc v ng thi bi server. M hnh hot ng ca server ny c th hin
nh hnh 3.2.
Client

Parrent
server

Port

Child
server

Child
server

Child
server

Well-known

TCP

Port

Client

TCP
Client

TCP

TCP

PT

Port

IT

Port

Hnh 3.2. M hnh server phc vc ng thi hng kt ni

2. Server chy ch lp hng khng kt ni


Server kiu lp hng khng kt ni thng s dng giao thc UDP. Trong kiu server ny, ti
mi thi im n ch x l mt yu cu. Server ly yu cu t UDP, x l yu cu v tr p ng
v cho UDP gi v client. Khi cc client gi gi tin n s c cha trong hng i ch
phc v. Cc gi tin ny c th i ti t mt client hoc nhiu client v server s thc hin s l
tun t tng yu cu theo trt t trong hng i. M hnh hot ng ca server ny c th hin
nh hnh 3.3.
II. XY DNG CHNG TRNH SERVER PHC V NHIU CLIENT HNG KT
NI
1. Gii thiu
ci t chng trnh server TCP phc v nhiu client ng thi, trong lp trnh mng c 2 k
thut ph bin:


Xy dng chng trnh a tin trnh: Trong chng trnh ny tin trnh cha s sinh ra tin
trnh con mi khi c mt client gi yu cu ti server. Nhc im ca k thut lp trnh ny l
khng tn dng hiu qu CPU. V khi chng trnh chy, n phi s dng c ch ngt
chuyn t tin trnh ny sang tin trnh khc, nn CPU s rnh ri trong qu trnh ny.
Client
Port
server

UDP
Well-known

Port

Client
Port

UDP
Client

UDP

PT

Port

IT

UDP

Hnh

3.3. M hnh server kiu lp hng khng kt ni


trong qu trnh chuyn tin trnh . K thut ny c s dng ph bin trong cc ngn ng
lp trnh C/C++(Linux, Unix), VC++...
Xy dng chng trnh a lung(a tiu trnh): Chng trnh server kiu ny s sinh ra
mt lung mi mi khi c mt client gi yu cu ti i phc v. Kiu chng trnh ny
khi chy tn dng hiu qu CPU v chng trnh khng c vic chuyn t tin trnh ny
sang tin trnh khc. K thut lp trnh ny c cc ngn ng lp trnh ph bin hin nay
h tr mnh m nh VC++, Java, .NET...Sau y chng ta s lt qua k thut lp trnh a
lung trong java v s dng xy dng chong trnh server p ng nhiu kt ni ng
thi vi giao thc truyn thng TCP.
2. K thut lp trnh a lung trong Java(MultiThread)
Mt lung l mt thuc tnh duy nht ca Java. N l n v nh nht ca on m c th thi
hnh c m thc hin mt cng vic ring bit. Ngn ng Java v my o Java c hai l cc
h thng c phn lung. Java h tr a lung, m c kh nng lm vic vi nhiu lung. Mt
ng dng c th bao hm nhiu lung. Mi lung c ng k mt cng vic ring bit, m
chng c thc thi ng thi vi cc lung khc.
a lung gi thi gian nhn ri ca h thng thnh nh nht. iu ny cho php bn vit cc
chng trnh c hiu qu cao vi s tn dng CPU l ti a. Mi phn ca chng trnh c

PT

IT

gi mt lung, mi lung nh ngha mt ng dn khc nhau ca s thc hin. y l mt thit


k chuyn dng ca s a nhim.
Trong s a nhim, nhiu chng trnh chy ng thi, mi chng trnh c t nht mt lung
trong n(lung chnh). Mt vi x l thc thi tt c cc chng trnh. Cho d n c th xut hin
m cc chng trnh c thc thi ng thi, trn thc t b vi x l nhy qua li gia cc
lung.
Cu trc ca mt chng trnh a lung gm mt lung chnh(main) v cc lung con. Lung
chnh c khi to ngay khi chng trnh chy v n c c im:
L lung sinh ra cc lung con
L lung kt thc sau cng.
Mi lung trong chng trnh Java c ng k cho mt quyn u tin. My o Java khng
bao gi thay i quyn u tin ca lung. Quyn u tin vn cn l hng s cho n khi lung b
ngt.
Mi lung c mt gi tr u tin nm trong khong ca Thread.MIN_PRIORITY(Gi tr 1), v
Thread.MAX_PRIORITY(gi tr 10). Mi lung ph thuc vo mt nhm lung, v mi nhm
lung c quyn u tin ca chnh n. Mi lung mc nh c mc tin bng 5. Mi lung
mi tha k quyn u tin ca lung m to ra n.
h tr lp trnh a lung, java c giao din Runnable v lp Thread, ThreadGroup thuc gi
java.lang(gi mc nh)). Cc phng thc ca lp Thread nh bng sau:
Phng thc
M t
Enumerate(Thread t)
Sao chp tt c cc lung hin hnh vo mng c ch
nh t nhm ca cc lung, v cc nhm con ca n.
getName()
Tr v tn ca lung
isAlive()
Kim tra mt lung c cn tn ti (sng)
getPriority()
Tr v quyn u tin ca lung
setName(String name)
t tn ca lung l tn m lung c truyn nh l mt
tham s
join()
i cho n khi lung kt thc
resume()
Chy li mt lung
sleep()
Tm dng mt lung sau khong thi gian no
start()
Khi to mt lung, thc cht l gi thi hnh phng thc run
run()
im vo ca mt lung(tng t phng thc main())
Mi lung con trong chng trnh java c im vo l phng thc run() l phng thc ca giao
din Runnable hoc lp Thread.
public void run()
{
//Khi lnh ca lung
}
Chu k sng ca lung c th hin nh hnh 3.4.

PT

IT

to mt lung mi:
to lung mi c 2 cch khai bo:
Cch 1: Khai bo mt lp k tha lp Thread, t ci t m lnh thc thi ca lung
vo phng thc run() bng cch khai bo np chng phng thc run.
V d:
Vit chng trnh sinh ra 10 lung, mi lung in ra s th t ca lung.
//TestThread.java
class NewThread extends Thread
{
private int count;
//Khai bao cau tu
NewThread(int count)
{
super();
this.count=count;
start();
}
public void run()
{
System.out.println("Luong thu:"+count);
}}
class TestThread{
public static void main(String[] args)
{
int i=0;
while(i<10)
{
new NewThread(i);
i++;
}
}}

sleep()

Blocked

suspend()

new Thread
wait()
resume()

start()

Runnable
notify()
stop()

Dead

IT

Hnh 3.4. Chu k sng ca lung(thread)

PT

Cch 2: Khai bo lp thc thi giao din Runnable. Lp ny cho php to ra i tng
Thread v ci t phn thn cho phng thc run() ca giao din. V d vit li chng
trnh trn, chng trnh ch khc phn khai bo lp NewThread.
//TestThread.java
class NewThread implmnts Runnable
{
private int count;
//Khai bao cau tu
NewThread(int count)
{
Thread t=new Thread();
this.count=count;
public void start()
{ run(); }
public void run()
{
System.out.println("Luong thu:"+count);
}}
Mt vn quan trng khc l vn ng b. gii quyt vn ny Java s dng mt c
ch c bit gi l Monitor.
3. Xy dng chng trnh server phc v nhiu client ng thi hng kt ni
minh ho k thut ny, chng ta tin hnh xy dng mt chng trnh v d:
Hy vit chng trnh server phc v nhiu client ng thi s dng giao thc truyn thng TCP.
Chng trnh cho php nhn bn knh ng trn gi n t cc client, tnh din tch hnh trn,

hin th tn, a ch IP, s cng, bn knh r, din tch ca client tng ng. Sau tr kt qu v
cho client.
a) Chy chng trnh s dng trnh telnet
b) Vit chng trnh client.
vit chng trnh ny chng ta s s dng k thut a lung trong Java. Mi khi mt chng
trnh client gi yu cu kt ni n, server s sinh ra mt lung mi phc v kt ni . Sau
khi phc v xong kt ni no th lung c gii phng. M hnh xy dng chng trnh th
hin nh hnh 3.5.

Server

S1
r1

S2

Sn

r2

rn

Client_2

r1

r2

IT

Client_1

Client_n

PT

Hnh 3.5. M hnh client/server ca bi ton

3.1. Chng trnh client


Chng trnh client thc hin cc cng vic sau:
Gi kt ni ti server
Nhp bn knh r t bn phm
Gi bn knh ti server
Nhn kt qu tr v v hin th
Kt thc chng trnh

//areaClient.java
import java.io.*;
import java.net.*;
class areaClient{
public static void main(String[] args)
{
//Khai bao bien
Socket cl=null;
BufferedReader inp=null;//luong nhap
PrintWriter
outp=null.//luong xuat
BufferedReader key=null;//luong nhap tu ban phim
String ipserver= "127.0.0.1";//Chuoi dia chi server
int
portserver=3456; //dia chi cong server

rn

PT

IT

String
r; //ban kinh r la chuoi so
//Tao socket va ket noi toi server
try{
cl=new Socket(ipserver,portserver);
//tao luong nha/xuatp kieu ky tu cho socket
inp=new BufferedReader(new InputStreamReader(cl.getInputStream()));
outp=new PrintWriter(cl,getOutputStream(),true);
//tao luong nhap tu ban phim
key=new BufferedReader(new InputStreamReader(System.in));
//Nhap ban kinh r tu ban phim
System.out.print("r=");
r=key.readLine().trim();
//gui r toi server
outp.println(r);
//Nhan dien tich tra ve tu server va hien thi
System.out.println("Area:"+inp.readLine());
//ket thuc chuong trinh
if(inp!=null)
inp.close();
if(key!=null)
key.close();
if(outp!=null)
outp.close();
if(cl!=null)
cl.close();
}
cacth(IOException e)
{
System.out.println(e);
}
}
}

3.2. Chng trnh server


Chng trnh server phc v nhiu client thc hin cc cng vic sau:
Khi to i tng ServerSocket v nghe ti s cng 3456.
Thc hin lp li cc cng vic sau:
Nhn kt ni mi, to socket mi
Pht sinh mt lung mi v nhn socket
Nhn bn knh gi ti t client
Tnh din tch
Hin th s th t lung, tn, a ch IP, s cng, bn knh r, din tch ca client
Gi din tch v cho client
Kt thc lung
//AreaThreadServer.java
import java.io.*;
import java.net.*;
//Khai bo lp NewThread cho php to ra lung mi

PT

IT

class NewThread
extends
Thread
{
private
int count;
private Socket cl=null;
private BufferedReader inp=null;//luong nhap
private PrintWriter
outp=null;//luong xuat
NewThread(Socket
cl, int count)
{
super();//Truy xut cu t lp Thread
this.cl=cl;
this.count=count;
start();
}
//cai dat phuong thuc run-Luong moi
public void
run()
{
try{
//tao luong nhap /xuat cho socket cl
inp=new BufferedReader(new InputStreamReader(cl.getInputStream()));
outp=new PrintWriter(cl.getOutputStream(),true);
//Doc ban kinh gui toi tu client
double r=Double.parseDouble(inp.readLine().trim());
// lay dia chi client
InetAddress addrclient=cl.getInetAddress();
//lay so cong phia client
int
portclient=cl.getPort();
//Tinh dien tich
double area=3.14*r*r;
//Hien thi
System.out.println("Luong
thu:"+count+",
client:"+addrclient.getHostName()+
", ip:"+addrclient.getHostAddress()+",port:"+portclient+
", r="+r+",area:"+area);
//Gui dien tich ve cho client tuong ung
outp.println(area);
//ket thuc luong
inp.close();
outp.close();
cl.close();
}
catch(IOException e)
{
System.out.println(e);
}
}
}
//Chuong trinh server
class
AreaThreadServer{
public static void main(String[] args)
{

IT

//Khai bao bien


int
count;
ServerSocket svr=null;
Socket
cl=null;
int portserver=3456;
try{
svr=new ServerSocket(portserver);
count=0;
while(true){
cl=svr.accept();
new NewThread(cl, count);
count++;
}
}
catch(IOException
e)
{
System.out.println(e);
}
}
}

PT

3.3. Dch v chy chng trnh


Dch chng trnh:
M ca s lnh v n th mc cha chng trnh client v server, thc hin bin dch chng
trnh:
javac areaClient.java
[Enter]
javac AreaThreadServer.java
[Enter]
Chy chng trnh:
Chy chng trnh vi trnh telnet:
- M 1 ca s lnh, chy chng trnh server:
java AreaThreadServer [Enter]
- Gi s m 3 ca s, mi ca s l chy mt chng trnh client s dng trnh telnet c
chy vi c php sau:
telnet localhost 3456 [Enter]
Kt qu chy chng trnh th hin nh ca s hnh 3.6.

IT

PT

Hnh 3.6. Kt qu chy chng trnh vi trnh telnet


Chy chng trnh vi chng trnh client:
Thay v chy trnh telnet, s dng chng trnh client areaClient. Chng trnh chy trong cc
ca s vi c pht sau:
java areaClient
[Enter]
Chy chng trnh trn mng cc b:
Bc 1: Sa li chng trnh client trong cu lnh new Socket(....,....) vi a ch ipserver l
a ch ca my trm trn chy chng trnh server. Sau dch li chng trnh.
Bc 2: Copy chng trnh server ti my c a ch dng sa bc 1 v chy chng
trnh.
Bc 3: Copy chng trnh client dch bc 1 ti cc my tnh khc trn mng v thc hin
chy chng trnh client .
Bc 4: Nhp gi tr bn knh r t ca s client, quan st kt qu chy chng trnh trn client
v server.
III. KT LUN
Trong chng 3 ny chng ta kho st cc kiu chng trnh server, kho st k thut lp trnh
a lung v ng dng n vo xy dng chng trnh server phc v nhiu client ng thi. Cui
cng chng ta xy dng mt chng trnh v d n gin minh ho k thut xy dng
server. T chng trnh v d, sinh vin c th sa chng trnh ng dng nhiu bi ton thc
t nh bi ton tra cu tuyn sinh, bi ton nhp d liu t xa, bi ton tra cu thi tit ... m c

PT

IT

kt ni vi cc c s d liu nh Access, SQL hoc Oracle. Cc k thut lp trnh mng ny s


c cng c hn cc chng tip theo.

CHNG IV
LP TRNH VI GIAO THC DCH V MNG PHA CLIENT
I. GII THIU
Chng ny s hng sinh vin s dng k thut lp trnh socket c trang b trong cc
chng trc lp trnh vi mt s giao thc dch v mng ph bin trn internet nh: DSN,
Telnet, FTP, TFTP, SMTP, POP3, IMAP4, HTTP, RTP.
lp trnh c vi cc giao thc truyn thng c sn, ngi lp trnh phi:

Kho st k c im, m hnh v c ch truyn thng ca giao thc;

Tp lnh(command), tp p ng(response) v tp tham s ca cc giao thc;

Cc ch hot ng ca giao thc

K thut ci t giao thc bng cc ngn ng lp trnh

Thng qua sinh vin nm c k thut lp trnh vi cc giao thc truyn thng c sn khc
pht trin cc ng dng hoc pht trin cc modul tch hp gii quyt cc bi ton thc t.

IT

II. LP TRNH GIAO THC DCH V TELNET


1. Mt s khi nim v c im ca dch v Telnet

u cui: Trong dch v Telnet, u cui c th coi l t hp ca bn phm v mn hnh.


Thit b u cui ny cho php ngi s dng nhp d liu gi ti trung tm x l v nhn
kt qu tr v.

Mi trng chia s thi gian: y thc cht l mt mng cc u cui, cc u cui c kt


ni vi nhau thng qua trung tm x l thng l mt my tnh mnh. Trong mi trng chia
s thi gian, cc k t c ngi s dng nhp vo bn phm u uc chuyn ti trung
tm x l. Sau khi x l xong kt qu c tr v mn hnh ngi s dng.

u cui o: khi mt my tnh kt ni qua mng Internet vi my tnh t xa vi vai tr nh


mt u cui cc b trn my tnh t xa gi l u cui o. Mng gm nhiu u cui o
c gi l mng u cui o (Network Virtual Terminal).

ng nhp: y l qu trnh ngi s dng m ti khon truy nhp vo h thng t xa. C


hai loi ng nhp:

PT

ng nhp cc b: l qu trnh ng nhp vo mi trng chia s thi gian cc b.

Hnh 4.1. ng nhp cc b

ng nhp t xa: my tnh cc b phi ci phn mm Telnet client, my tnh t xa phi


ci phn mm Telnet server.

Hnh 4.2. ng nhp t xa

PT

IT

Qu trnh ng nhp: Khi ngi s dng nhp cc k t thng qua u cui, k t s c gi


ti H iu hnh ca my tnh cc b (h iu hnh khng dch k t m n gi n cho
chng trnh Telnet Client ). Chng trnh Telnet Client dch k t ra dng tp k t chung
NVT-ASCII 7 bt v gi n cc tng TCP/IP chuyn qua mng Internet, ti cc tng TCP/IP
ca my tnh t xa. H iu hnh gi cc k t n chng trnh Telnet Server, chng trnh
ny s dch cc k t ra dng m my tnh t xa c th hiu c. Nhng do h iu hnh
c thit k khng cho php gi k t ngc li h iu hnh. gii quyt vn ny, trn
my tnh t xa b sung thm modul phn mm gi lp u cui (Pseudo Terminal Driver). T
Telnet Server gi k t n cho phn mm ny v chuyn tip n h iu hnh. H iu hnh
s gi cc k t n chng trnh ph hp.
c im ca dch v Telnet:

TELNET= TErminaL NETwork

Telnet s dng kt ni TCP vi s cng mc nh l 23


Telnet gm 2 phn mm: Telnet client ci trn my cc b, Telnet Server ci trn my t
xa.
Telnet l dch v ng nhp t xa. Sau khi ng nhp thnh cng, my cc b tr thnh
u cui o ca my t xa( mn hnh , bn phm... tr thnh ca my t xa). Dch v cho
php truy cp v thao tc vi ti nguyn trn my t xa.
Dch v Telnet hin c tch hp vo h iu hnh mng v c coi nh l giao
thc chun ca TCP/IP.

i vi lp trnh ng dng mng, bi ton quan trng nht l xy dng chng trnh phn
mm pha client. iu ny cho php ngi s dng c th to ra c phn mm vi giao
din ph hp v d dng tch hp vi cc dch v khc. lp trnh oc dch v Telnet pha
ngi s dng,ngi lp trnh phi nm chc tp k t NVT, cc tu chn v cc chnh sch

tho thun tu chn ca Telnet, cc lnh iu khin server v cu trc lnh Telnet. Cui
cng ngi s dng phi nm c cc ch hot ng ca Telnet trc khi ci t chng
trnh Telnet.
2. Mt s kin thc giao thc Telnet c bn
2.1. Tp k t chung NVT
to ra s c lp gia my tnh cc b v my tnh t xa trong cc mng khng ng nht,
telnet nh ngha mt giao din chung gi l tp k t mng u cui o NVT (Network Virtual
Terminal). NVT gm 2 tp k t:
Tp k t d liu: c bit cao nht bng 0 v c m thuc [0,127] .
Tp k t iu khin: c bit cao nht bng 1 v c m thuc [128,255] .
Code

Decimal Value

Function

NULL

NUL

No operation

Line Feed

LF

10

Di chuyn my in ti hng in tip theo, nh v v


tr nm ngang.
Di chuyn my in sang bn tri

Carriage
CR

13

BELL

BEL

L ca hng hin thi


Sinh ra mt tn hiu nghe c hoc r rng (m
khng di chuyn u in).

PT

Return

Back Space

IT

Name

BS

Di chuyn u in mt k t nh v v pha l tri


(trn thit b in, m thit b ny thng thng c
s dng ti mu vn bn k t hon chnh bng
cch in hai k t c bn trn phn u ln nhau).

HT

Di chuyn my in ti Horizontal Tab tip theo (N


gi nguyn khng c ch r phi lm nh th
no mi nhm xc nh hoc thit lp ni c
nh v ).

Vertical Tab

VT

11

Tng t nh HT

Form Feed

FF

12

Di chuyn my in ti phn u ca trang tip theo


v gi v tr nm ngang (trn hin th trc quan,
vic xa mn hnh v di chuyn con tr ti gc
tri)

Horizontal
Tab

Mt s k t d liu quan trng

Name

Decimal Code

Meaning

240

End of subnegotiation parameters: Kt thc ca tham s tha


thun

NOP

241

No operation: khng thao tc

DM

242

Data mark: Ch ra v tr ca s kin ng b bn trong lung


d liu. (Ci ny lun phi c km theo cnh bo TCP).

BRK

243

Break: ch ra s thot

IP

244

Interupt Process: dng ngt tin trnh ang chy trn my


t xa.

AO

245

Abort output: cho php tin trnh hin thi chy hon thnh
nhng khng gi u ra ca n cho ngi s dng

AYT

246

Are you there: gi n cho server v hi xem server cn hot


ng khng.

EC

247

Erase character: ngi nhn nn xa k t trc ln cui t


lung d liu.

EL

248

Erase line: xa k t t lung d liu nhng khng bao gm


CRLF

GA

249

Go ahead: ngi dng, di nhng hon cnh nht nh c


th din t kt thc khc m n c th truyn.

PT

IT

SE

250

SubOption Begin: ch th bt u mt ty chn thnh phn.

251

Ch ra s mong mun bt u c thc hin hoc s xc


nhn m bn ang thc hin.

252

Ch ra s t chi thc hin hoc tip tc thc hin.

253

Ch ra yu cu m mt nhm thc hin khc hoc xc nhn


iu bn ang mong i ca nhm khc thc hin.

DONT

254

Ch ra s yu cu m nhm khc ngng thc hin xc nhn


iu m bn khng mong ch nhm khc thc hin.

IAC

255

Interpret as command: y l k t khng dch lnh

SB
WILL
WONT
DO

Mt s k t iu khin quan trng


2.2. Cc ty chn
Cc ty chn: c s dng b sung thm thng tin cho cc lnh:
Echo: hin th tr li.
Terminal Type: tu chn kiu u cui.
Terminal Speed: tha thun v tc u cui.

Binary : cho php ngi nhn dch mi k t 8 bit nh l d liu nh phn, tr k t IAC
Echo: cho php Server phn hi d liu nhn c tr li client hin ln mn hnh
Suppress go head : loi b k t CA
Timing: cho php mt thnh vin pht sinh du hiu nh thi, ch th rng tt c d liu nhn
c trc c x l. M ca cc tu chn c th hin trong bng sau:
Name

RFC

Echo

857

Suppress go ahead

858

Status

859

Timing mark

860

24

Terminal type

1091

31

Window size

1073

32

Terminal speed

1079

33

Remote flow control

1372

34

Linemode

1184

36

Environment variables

1408

PT

IT

Decimal Code

2.3. S tha thun cc ty chn

Trong Telnel trc khi s dng mt ty chn no th gia Client v Server phi c tha thun
v ty chn . C hai phng thc tha thun l: ngh v yu cu.
Vi hai hnh thc ny th c hai kiu tha thun:
Cho php mt ty chn

Lm mt hiu lc mt ty chn
Cc lnh dng trong tha thun ty chn:WILL, DO, WONT, DONT
2.4. S nhng trong telnet
Trong telnet gi cc lnh v d liu th s dng mt kt ni duy nht, cc lnh c nhng
trong dng d liu bn nhn phn bit c lnh vi d liu trc mi k t iu khin u c
k t IAC. Trong trng hp c 2 k t IAC i lin nhau th k t IAC th nht s b b qua v k
t IAC th hai s l d liu.
2.5. Cc ch lm vic ca Telnet

Ch mc nh: c s dng khi khng c s tha thun dng mt ch khc.


Trong ch ny, khi cc k t c nhp vo t bn phm, n s phn hi ngay ln mn

hnh cc b v ch khi nhp hon chnh c dng k t th dng mi c gi sang


server v n phi ch tn hiu GA ( go Ahead ) t server tr v mi chp nhn dng mi
(truyn theo kiu half-duplex).

Ch Character: trong ch ny, mi khi c k t nhp vo t bn phm, trnh Telnet


Client gi k t n cho Server, Server s gi phn hi k t li trnh Client
hin th ln mn hnh cc b.

Ch Line Mode: ch ny b sung s khim khuyt ca hai ch trn. Mi khi


Client nhn mt dng, n gi ti Server v n s nhn dng mi m khng cn ch tn
hiu GA gi v t Server (truyn thng theo kiu full-duplex).

3. Ci t dch v Telnet Client vi Java


Chng trnh Telnet pha ngi s dng phi thc hin cc cng vic sau:

To mt i tng Socket v thit lp kt ni ti TelnetServer vi a ch my m trn


trnh Telnet Server ang chy, v s cng m Telnet Server ang nghe.

Socket

telnetclient=new

IT

V d: Gi s telnet server chy trn may tnh c a ch IP l 192.168.1.10, a ch cng l


23:
Socket("192.168.1.10",23);

To lung nhp/xut cho socket.

Thc hin gi/ nhn cc lnh ca Telnet thing qua lung nhp/xut

v d khi tho thun, client cn phi gi lnh WONT c m l 252, IAC l 255 vi lnh:

PT

if(c2==255)
{

out.write(new byte[] {(byte)255, (byte)254, (byte)c2});

Xy dng giao din GUI cho chng trnh nu mun.

Sau y l mt chng trnh v d ci t dch v Telnet n gin vi giao thc Telnet:


// TelnetClient.java
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
// Terminal hin th ch trn ca s
class Terminal extends Canvas
{
// Kch c font ch
private int charWidth, charHeight;
// text[0] l dng thao tc hin ti
private String[] text;

// Khong cch vi vin ca s chnh chng trnh


private final int margin=4;
// S dng lnh ti a c lu li
private final int lines=50;
// Constructor, khi to cc gi tr ban u
Terminal()
{
charHeight=12;
setFont(new Font("Monospaced", Font.PLAIN, charHeight));
charWidth=getFontMetrics(getFont()).stringWidth(" ");
text=new String[lines];
for (int i=0; i<lines; ++i)
text[i]="";
setSize(80*charWidth+margin*2, 25*charHeight+margin*2);
requestFocus();

IT

// Lng nghe s kin con tr chut

addMouseListener(new MouseAdapter() {

public void mousePressed(MouseEvent e)


{

requestFocus();

PT

});

// In v lu li cc k t ngi dng nhp t bn phm


public void put(char c)
{

Graphics g=getGraphics();
if (c=='\r')
{

// Return
for (int i=lines-1; i>0; --i)
text[i]=text[i-1];
text[0]="";
update(g);

// Clear screen and paint

}
// Cc k t iu khin: backspace, delete, telnet EC
else if (c==8 || c==127 || c==247)
{
int len=text[0].length();
if (len>0)
{

--len;
text[0]=text[0].substring(0, len);
g.setColor(getBackground());
g.fillRect(len*charWidth+margin, getSize().height-margin-charHeight,
(len+1)*charWidth+margin, getSize().height-margin);
}
}
else if (c=='\t')
{

// Tab vi khong cch 8 space

text[0]+="

";

text[0].substring(0, text[0].length()&-8);
}
else if (c>=32 && c<127)
{

// K t c th in

g.drawString(""+c, margin+text[0].length()*charWidth,
text[0]+=c;
}
g.dispose();
}

IT

getSize().height-margin);

// Hin th nhng g g t bn phm


{

PT

public void paint(Graphics g)

int height=getSize().height;
for (int i=0; i<lines; ++i)

g.drawString(text[i], margin, height-margin-i*charHeight);

}
}

// lung nhn s ch cc k t n t mt lung vo (Input


// stream) v gi n Termial. m phn cc la chn u cui
class Receiver extends Thread
{
private InputStream in;
private OutputStream out;
private Terminal terminal;
public Receiver(InputStream in, OutputStream out, Terminal terminal)
{
this.in=in;
this.out=out;
this.terminal=terminal;
start();

}
// c cc k t v gi n u cui
public void run()
{
while (true)
{
try {
int c=in.read();
if (c<0)
{

// EOF

System.out.println("Connection closed by remote host");


return;
}
else if (c==255)
{

// m phn cc la chn u cui


// 253=do, 251=will

int c2=in.read();

// option

if (c1==253)

IT

int c1=in.read();

// do option, send "won't do option"

out.write(new byte[] {(byte)255, (byte)252, (byte)c2});


else if (c1==251) // will do option, send "don't do option"
}

PT

out.write(new byte[] {(byte)255, (byte)254, (byte)c2});


else

terminal.put((char)c);
}

catch (IOException x) {

System.out.println("Receiver: "+x);

}}}}

// TelnetWindow. Gi d liu bn phm t terminal n mt socket t


// xa v bt u nhn cc k t t socket v hin th cc k t
terminal
class TelnetWindow extends Frame
{
Terminal terminal;
InputStream in;
OutputStream out;
// Constructor
TelnetWindow(String hostname, int port)
{
super("telnet "+hostname+" "+port);
// Thit lp ca s

// Set title\

trn

add(terminal=new Terminal());
// X l vic ng ca s
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
dispose();
try {
out.close();
}
catch (IOException x) {
System.out.println("Closing connection: "+x);
}
}
public void windowClosed(WindowEvent e) {
System.exit(0);
}

IT

});

// X l cc thao tc vi bn phm

terminal.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char k=e.getKeyChar();

PT

try {

terminal.put(k);

out.write((int)k);
if (k=='\r')
{

out.write('\n');

// Convert CR to CR-LF

out.flush();

}
}

catch (IOException x) {
System.out.println("Send: "+x);
}}});
try {
// M mt connection
System.out.println("Opening

connection

to

"+hostname+"

"+port);
Socket socket=new Socket(hostname, port);
InetAddress addr=socket.getInetAddress();
System.out.println("Connected to "+addr.getHostAddress());
in=socket.getInputStream();

on

port

out=socket.getOutputStream();
// Hin th ca s
pack();
setVisible(true);
// Bt u nhn d liu t server
new Receiver(in, out, terminal);
System.out.println("Ready");
}
catch (UnknownHostException x) {
System.out.println("Unknown host: "+hostname+" "+x);
System.exit(1);
}
catch (IOException x) {
System.out.println(x);
System.exit(1);
// Chng trnh chnh
public class TelnetClient
{

IT

}}}

public static void main(String[] argv)


{

PT

// Phn tch cc i s: telnet hostname port


String hostname="";
int port=23;
try {

hostname=argv[0];

if (argv.length>1)

port=Integer.parseInt(argv[1]);

catch (ArrayIndexOutOfBoundsException x) {

System.out.println("Usage: java telnet hostname [port]");


System.exit(1);
}
catch (NumberFormatException x) {}
TelnetWindow t1=new TelnetWindow(hostname, port);
}
}

4. Chy th chng trnh


Bc 1: Dch chng trnh TelnetClient.java
Bc 2: Kim tra xem trn my t xa, trnh Telnet server c khi to chy cha, nu cha
th chy n v dng trnh qun tr Telnet Server, thit lp cc tham s ph hp.

Bc 3: Chy chng trnh Telnet Client t my cc b.


III. LP TRNH DCH V TRUYN TP VI GIAO THC FTP
1. Dch v truyn tp FTP
1.1. Giao thc FTP
1.1.1. c im

FTP l giao thc chun ca TCP/IP

FTP s dng kt ni TCP, l kt ni truyn thng tin cy

FTP gm 2 phn mm: Phn mm FTPClient ci trn my cc b v FTPServer ci trn


my t xa(File Server).

FTP s dng 2 kt ni truyn thng ng thi tng hiu qu ca vic truyn tp qua
mng:

IT

Kt ni iu khin: S dng phng thc truyn thng n gin v d liu truyn


di dng text(NVT-ASCII 7bt). Kt ni ny cho php truyn lnh t client ti server
v truyn p ng t server v client. Kt ni ny s dng s cng mc nh l 21
pha server.

PT

Kt ni d liu: Kt ni ny s dng cc phng thc truyn thng phc tp v phi


truyn nhiu kiu d liu khc nhau. Kt ni ny c thit lp mi khi truyn mt
tp v hu sau khi truyn xong tp . Kt ni ny bao gi cng c khi to sau kt
ni iu khin v kt thc trc khi hu b kt ni iu khin(kt ni iu khin duy
tr trong sut phin lm vic). Kt ni d liu s dng s cng mc nh pha server l
20. C 2 cch thit lp kt ni d liu: dng lnh PORT v lnh PASV.
FTP c 3 ch truyn tp:

Ct tp trn my cc b ln my tnh t xa di s gim st ca lnh STOR.


Ly mt tp trn my tnh t xa v my tnh cc b di s gim st ca lnh RETR.
Ly danh sch cc mc trong mt th mc trn my t xa v my cc b di s gim
st ca lnh LIST.

M hnh hot ng ca FTP th hin nh hnh v

Hnh 4.3. M hnh FTP


1.1.2.1. Tp lnh:

IT

1.1.2. Tp lnh v p ng ca FTP


Tp lnh FTP ch c thi hnh pha FTP Server, khng dng cho ngi s dng. Khi client gi
mt lnh FTP n FTPServer, lnh s c FTPServer thi hnh v tr p ng v cho client.
C php lnh FTP c dng:

PT

<COMMAND> <SPACE> [PARAMS]


FTP c hn ba mi lnh c chia lm su nhm v c lit k trong bng sau:
Nhm lnh truy cp:

Nhm lnh qun l tp:

IT

PT

Nhm lnh nh dng d liu:

Nhm lnh nh ngha cng:

Nhm lnh truyn tp:

1.2.1.2. Tp p ng(response)

IT

Nhm lnh cn li:

p ng FTP c gi t FTP server v client sau mi khi FTP server thc thi mt lnh FTP gi
t client n server. C php ca mt p ng ca FTP c dng sau:

PT

<XYZ> <SPACE> <TEXT>

Vi XYZ l phn m gm 3 s nguyn, mi ch s v gi tr s c n nh vi mt ngha xc


nh:

IT

PT

PT

IT

1.1.3. V d qu trnh truyn tp gia FTPclient v FTPserver

Hnh 4.4. V d qu trnh truyn tp FTP


2. K thut ci t giao thc FTP vi java
2.1. Cc bc ci t:
c th truyn tp vi my ch truyn tp vi giao thc FTP, chng trnh phi:

Thit lp v hu b kt ni iu khin.

Thit lp v hu b kt ni d liu s dng lnh PORT hoc PASV

Gi cc lnh t client ti server v nhn p ng t server tr v. Tt nht l vit cc


phng thc bao ly cc lnh ca FTP v phng thc x l p ng tr v.

Nm chc trnh t c th thc hin download hoc upload tp s dng giao thc
FTP.

2.2.Chng trnh truyn tp FTP


Trong chng trnh ny, chng ti thc hin cc cng vic sau:

Khai bo to i tng Socket v thit lp kt ni ti FTPServer to kt ni iu


khin v to lung nhp xut cho socket:

V du: Gi s FTPServer nm trn my cc b v s dng s cng mc nh 21


Socket clientFTP=new Socket("localhost",21);
Hoc vit phng thc kt ni nh v d sau:

IT

public boolean connect(String host, int port)


throws UnknownHostException, IOException
{
connectionSocket = new Socket(host, port);
outputStream = new
PrintStream(connectionSocket.getOutputStream());
inputStream = new BufferedReader(new

InputStreamReader(connectionSocket.getInputStream()));

PT

if (!isPositiveCompleteResponse(getServerReply())){
disconnect();
return false;
}
return true;

Hoc hm gii phng kt ni:

public void disconnect()


{
if (outputStream != null) {
try {
if (loggedIn) { logout(); };
outputStream.close();
inputStream.close();
connectionSocket.close();
} catch (IOException e) {}
outputStream = null;
inputStream = null;
connectionSocket = null;
}
}

Khai bo cc phng thc thc hin gi cc lnh ca FTP ti FTPServer:


V d:

Phng thc thc hin ng nhp vi lnh USER v PASS


public boolean login(String username, String password)
throws IOException
{
int response = executeCommand("user " + username);
if (!isPositiveIntermediateResponse(response)) return false;
response = executeCommand("pass " + password);
loggedIn = isPositiveCompleteResponse(response);
return loggedIn;
}

Trong phng thc executeCommand() thc thi mt lnh FTP bt k:


public int executeCommand(String command)
throws IOException
{
outputStream.println(command);
return getServerReply();
}

Phng thc c/ghi d liu:

PT

IT

public boolean readDataToFile(String command, String fileName)


throws IOException
{
// Open the local file
RandomAccessFile outfile = new RandomAccessFile(fileName, "rw");
// Do restart if desired
if (restartPoint != 0) {
debugPrint("Seeking to " + restartPoint);
outfile.seek(restartPoint);
}
// Convert the RandomAccessFile to an OutputStream
FileOutputStream fileStream = new FileOutputStream(outfile.getFD());
boolean success = executeDataCommand(command, fileStream);
outfile.close();
return success;
}
}
public boolean writeDataFromFile(String command, String fileName)
throws IOException
{
// Open the local file
RandomAccessFile infile = new RandomAccessFile(fileName, "r");
// Do restart if desired
if (restartPoint != 0) {
debugPrint("Seeking to " + restartPoint);
infile.seek(restartPoint);
}
// Convert the RandomAccessFile to an InputStream
FileInputStream fileStream = new FileInputStream(infile.getFD());
boolean success = executeDataCommand(command, fileStream);
infile.close();
return success;
}

Phng thc download v Upload tp:


public boolean downloadFile(String fileName)
throws IOException

{
return readDataToFile("retr " + fileName, fileName);
}
public boolean downloadFile(String serverPath, String localPath)
throws IOException
{
return readDataToFile("retr " + serverPath, localPath);
}

Mt s phng thc thc hin cc lnh FTP c lit k trong bng sau:
STT

2
3
4
5

public boolean changeDirectory(String directory)


throws IOException
public boolean renameFile(String oldName, String newName)
throws IOException
public boolean removeDirectory(String directory)
throws IOException
public boolean deleteFile(String fileName)
throws IOException
public String getCurrentDirectory()
throws IOException

IT

Phng thc ci t

Lnh FTP
CD
RNFR,
RNTO
RMD
DELE
PWD

PT

2.3. Chng trnh v d


on chng trnh sau l v d minh ho cc phng thc ci t trn:
try {
if (connection.connect(host)) {
if (connection.login(username, password)) {
connection.downloadFile(serverFileName);
connection.uploadFile(localFileName);
}
connection.disconnect();
}
} catch (UnknownHostException e) {
// handle unknown host
} catch (IOException e) {
// handle I/O exception
}

IV. LP TRNH GI/NHN TH VI GIAO THC SMTP v POP3


1. Giao thc SMTP
1.1 Gii thiu
Mc ch ca giao thc SMTP l truyn mail mt cch tin cy v hiu qu. Giao thc SMTP
khng ph thuc vo bt k h thng c bit no v n ch yu cu trt t ca d liu truyn trn
knh m bo tin cy.

1.2 M hnh ca giao thc SMTP

PT

IT

Giao thc SMTP c thit k da vo m hnh giao tip sau: khi c yu cu t user v
dch v mail, bn gi Sender-SMTP thit lp mt knh truyn hai chiu ti bn nhn
Receiver-SMTP v Receiver-SMTP gi p ng tr li cho Sender-SMTP

Hnh 4.6. . M hnh ngi gi v nhn trn cng h thng

IT

PT

Hnh 4.7.M hnh gi th qua h thng khc nhau

IT

PT

Hnh 4.8.M hnh gi th c 2 pha qua mng LAN/WAN

IT

PT

Hnh 4.9. M hnh ngi gi/nhn kt ni mail server qua LAN/WAN


1.3. Tp lnh v p ng ca SMTP

Nhng lnh SMTP nh ngha s truyn mail hay chc nng ca h thng mail c yu
cu bi user. Nhng lnh SMTP l nhng chui k t kt thc bng <CRLF>. Bn thn
m lnh l nhng k t ch (alphabetic) kt thc bi <SP> nu c nhng tham s theo sau
v nu khng c th <CRLF>. C php ca nhng mailbox phi tun theo nhng quy c
ca receiver.
Mt phin giao dch mail cha ng mt vi i tng d liu, c truyn nh l nhng
i s cho cc lnh khc nhau. Receiver-path l i s ca lnh MAIL. Forward-path l
i s ca nhng lnh RCPT. V mail data l i s ca lnh DATA. Nhng i s hay
nhng i tng d liu ny c truyn i v duy tr cho n khi truyn xong bi s ch
nh kt thc ca mail data. M hnh hin thc cho cch lm ny l nhng buffer ring
bit c cung cp lu tr kiu ca i tng d liu, l cc buffer: reverse-path,
forward-path, v mail data buffer. Nhng lnh xc nh to ra thng tin c gn vo mt
buffer xc nh , hoc xa bt i mt hay mt s buffer no

IT
PT

Cn cc p ng ca SMTP tng t gn ging nh ca FTP nhng gi tr ca x ch ly


t 2 n 5.
1.4. Ci t chng trnh gi th vi SMTP

gi th, chng trnh ng dng phi thc hin cc thao tc c bn sau y:


u tin phi to i tng socket v kt ni ti mail server bng cch ch ra
tn min hoc a ch IP ca my ch mail server v s dng s cng mc nh
25.
Khai bo to lung nhp xut cho socket
Thc hin ln lt gi cc lnh v tham s ca SMTP ti mail server theo trn
t sau:
HELLO

MAIL FROM
RCPT TO
DATA
QUIT
Sau mi lnh gi, phi thc hin c cc p ng tr v.

PT

IT

V d v mt giao dch gi th ca SMTP:

Sau y l m ci t ca chng trnh v d:


import
import
import
import
import
import

java.io.BufferedReader;
java.io.FileInputStream;
java.io.InputStreamReader;
java.io.PrintStream;
java.net.Socket;
java.util.StringTokenizer;

public class SendMail


{
Object mailLock
mailer
public String mailServerHost
public String from
public String to
public String replyTo
public String subject
public String mailData
"HyperSendMail";
public String errorMsg = "";
public Socket mailSendSock =

= null;
=
=
=
=
=
=

//In case we want a multi-threaded

"";
"";
"";
"";
"Java is Fun";

null;

public BufferedReader inputStream = null;


public PrintStream outputStream
= null;
public String serverReply
= "";
SendMail()
{
// Doesn't do anything but we need this for extension purposes.
}
// Server, from,to,subject, data
SendMail(String server,String tFrom,String tTo,String sub,String sendData)
{
mailServerHost = server;
mailLock=this; //
from = tFrom;
to
= tTo;
if(sendData != null)
mailData = sendData;
}

IT

SendMail()
{
if(mailLock != null)
{
if(mailLock instanceof Applet)
{
Applet app = (Applet)
}
}
}
*/

PT

public void send()


{
if(!open())
//Yikes! get out of here.
return;
try
{
outputStream.println("HELO sendMail");
serverReply = inputStream.readLine();
}
catch(Exception e0)
{
e0.printStackTrace();
}
try
{
outputStream.println("MAIL FROM: "+from);
serverReply = inputStream.readLine();
if(serverReply.startsWith("5"))
{
close("FROM: Server error :"+serverReply);
return;
}
if(replyTo == null)
replyTo = from;
outputStream.println("RCPT TO: <"+to+">");
serverReply = inputStream.readLine();
if(serverReply.startsWith("5"))

{
close("Reply error:"+serverReply);
return;

PT

IT

}
outputStream.println("DATA");
serverReply = inputStream.readLine();
if(serverReply.startsWith("5"))
{
close("DATA Server error : "+serverReply);
return;
}
outputStream.println("From: "+from);
outputStream.println("To: "+to);
if(subject != null)
outputStream.println("Subject: "+subject);
if(replyTo != null)
outputStream.println("Reply-to: "+replyTo);
outputStream.println("");
outputStream.println(mailData);
outputStream.print("\r\n.\r\n");
outputStream.flush();
serverReply = inputStream.readLine();
if(serverReply.startsWith("5"))
{
close("DATA finish server error: "+serverReply);
return;
}
outputStream.println("quit");
serverReply = inputStream.readLine();
if(serverReply.startsWith("5"))
{
close("Server error on QUIT: "+serverReply);
return;
}
inputStream.close();
outputStream.close();
mailSendSock.close();
}
catch(Exception any)
{
any.printStackTrace();
close("send() Exception");
}
close("Mail sent");
}
public boolean open()
{
synchronized(mailLock)
{
try
{
mailSendSock = new Socket(mailServerHost, 25);
outputStream = new PrintStream(mailSendSock.getOutputStream());
inputStream = new BufferedReader(new InputStreamReader(
mailSendSock.getInputStream()));
serverReply = inputStream.readLine();
if(serverReply.startsWith("4"))
{

errorMsg = "Server refused the connect message :


"+serverReply;
return false;
}
}
catch(Exception openError)
{
openError.printStackTrace();
close("Mail Socket Error");
return false;
}
System.out.println("Connected to "+mailServerHost);
return true;
}
}

PT

IT

public void close(String msg)


{
//try to close the sockets
System.out.println("Close("+msg+")");
try
{
outputStream.println("quit");
inputStream.close();
outputStream.close();
mailSendSock.close();
}
catch(Exception e)
{
System.out.println("Close() Exception");
// We are closing so see ya later anyway
}
}

// What do you know the damned thing works :)


/*
public static void main(String Args[])
{
SendMail sm = new
SendMail(
"mail.hyperbyte.ab.ca",
//Mail Server
"tswain@hyperbyte.ab.ca",
// sender
"tswain@hyperbyte.ab.ca",
// Recipient
"Java mail test",
// Subject
"test test test!");
// Message Data
sm.send();
// Send it!
}
*/
/*
// Going a be an applet/thread safe version of readLine()
public void readLine(DataInputStream in,)
{
}
*/
}

2. Giao thc POP3

2.1. Gii thiu

IT

POP3 (Post Office Protocol Version 3) l mt giao thc truy cp hp th. N gm 2 phn mm:
POP3 Server ci trn my ch c cha hp th; POP3 Client ci t trn my cc b. truy cp
c th, ngi s dng dng phn mm truy cp hp th thit lp kt ni ti POP3 Server ti s
cng mc nh l 110. POP3 server s gi tr v cho client mt danh sch cc mc th cha trong
hp th ngi s dng. Giai on s dng giao thc truy cp th c th hin nh hnh v.

PT

2.2. Mt s lnh v p ng ca POP3

Mt s lnh quan trng ca POP3 c miu t sau y. Cn cc p ng ca POP3 tng t


nh ca giao thc FTP.

USER username: i s username l mt chui nh danh mailbox, ch c ngha


i vi server. N tr li +OK nu tn mailbox c hiu lc v -ERR nu
khng chp nhn tn mailbox
PASS string: i s l mt password cho mailbox hay server. N tr li +OK
kha maildrop v sn sng v -ERR nu password khng hiu lc hoc khng
c php kha maildrop.
QUIT: Khng c i s v tr li +OK.
STAT: khng c i s. Tr li +OK nn mm vi nn l s message, mm l kch
thc maildrop tnh bng byte. Cc message c nh du xa khng c m
theo tng s.

LIST [msg]: i s l s th t ca message, c th khng lin quan ti cc


message c nh du xa. Tr li +OK scan listing flow vi scan listing l
s th t ca message , theo sau l khong trng v kch thc chnh xc ca
message tnh theo byte; hoc tr li -ERR no such message.
RETR msg: i s l s th t message, c th khng lin quan ti cc message
c nh du xa. Tr li +OK message flows hoc -ERR no such
message.
DELE msg: i s l s th t message, c th khng lin quan ti cc message
c nh du xa. Tr li +OK message deleted, POP3 s nh du xa
message ny hoc -ERR no such message.

IT

NOOP: khng c i s v tr li +OK. POP3 server khng lm g ht, ch hi


m li cho client vi tr li +OK.
RSET: khng c i s, tr li +OK phc hi li cc message b nh du
xa bi POP3 server.

PT

2.3. Cc thao tc truy cp th

thc hin truy cp ly th, chng trnh ly th phi thc hin cc thao tc c bn sau:

ng nhp bng lnh USER, PASS vi ti khon hp l

Gi lnh thao tc vi hp th.

V d qu trnh thc hin truy cp hp th ly th th hin nh hnh 4.10


2.4. Xy dng chng trnh truy cp hp th vi giao thc POP3
Cc thao tc c bn:

To i tng Socket v thit lp vi Mail Server ti s cng 110.

To lung nhp/xut

Thc hin gi lnh ti mail server, sau mi lnh gi, n thc hin c p ng tr v

Kt thc chng trnh

IT
PT

Hnh 4.10. V d qu trnh ly th vi giao thc POP3

Chng trnh v d sau minh ho cch ci t chng trnh nhn th vi giao thc POP3.
//CheckMail.java
import java.net.*;
import java.io.*;
public class CheckMail {
public static void main(String s[]) {
// CheckMail [mailServer] [user] [password]
try {
CheckMail t = new CheckMail();
int i = t.checkMyMail(s[0], s[1], s[2]);
if (i==0) {
System.out.println("No mail waiting.");
}
else {
System.out.println
("There " + (i==1?"is " :"are ") + i +
" message" +(i==1?"":"s")+ " waiting.");
}

}
catch (Exception e) {
e.printStackTrace();
}

PT

IT

}
private void send(BufferedWriter out, String s) throws IOException {
out.write(s+"\n");
out.flush();
}
private String receive(BufferedReader in) throws IOException {
return in.readLine();
}
private int checkMyMail
(String server, String user, String pass) throws IOException {
Socket s = new Socket(server, 110);
BufferedReader in = new BufferedReader(
new InputStreamReader(s.getInputStream()));
BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
receive(in);
send(out, "USER " + user);
receive(in);
send(out, "PASS " + pass);
receive(in);
return getNumberOfMessages(in, out);
}
public int getNumberOfMessages
(BufferedReader in, BufferedWriter out) throws IOException {
int i = 0;
String s;
send(out, "LIST");
receive(in);
while((s = receive(in)) != null) {
if (!(s.equals("."))) {
i++;
}
else
return i;
}
return 0;
}

V. KT LUN
Nh vy trong chng ny bc u cung cp cho ngi lp trnh cch lp trnh vi cc giao
thc truyn thng pht trin sn c thng qua k thut socket. y l chng quan trng, n
va cng c cho sinh vin kin thc mng, va trang b cho sinh vin bit cch ci t cc giao
thc bng mt ngn ng lp trnh c th. Trn c s sinh vin c th hon thin mt dch
v mng hon chnh hoc pht trin cc modul chng trnh tch hp vo cc chng trnh
ung dng khc nhau. Ngoi cc giao thc trn, sinh vin nn lp trnh vi mt s giao thc
Internet ph bin khc nh DNS, TFTP, HTTP, RTP hoc ci t cc giao thc, gi tin ca cc
giao thc TCP, UDP, ICMP, ARP, IP, ICMP hoc kho st pht trin cc ng dng vi h giao
thc Hxxx, SIP...Cui cng mt iu nhn mnh vi ngi hc khi pht trin cc ng dng mng
vi cc giao thc: Phi nm chc m hnh, cu trc, c ch truyn thng ca cc giao thc th

PT

IT

mi lp trnh c. Mt vn khc, thng qua chng ny ngi lp trnh c th pht trin cc


giao thc truyn thng ring ca mnh gii quyt bi ton c th.

PHN III. LP TRNH PHN TN


CHNG IV
K THUT LP TRNH PHN TN I TNG RMI
I. GII THIU LP TRNH PHN TN V RMI
(Remote Method Invocation)
1. Gii thiu k thut lp trnh phn tn
K thut lp trnh phn tn thc cht l k thut lp trnh phn tn m lnh hay i tng. N cho
php phn b ti ln ton mng tn dng ti nguyn mng gii quyt bi ton ln, phc tp
thay v tp trung trn cng mt my. Cc thnh phn m lnh phn tn kt cp vi nhau mt
cch cht ch, khc vi lp trnh socket l kt cp lng lo. Mt im khc c bn na ca lp
trnh phn tn so vi lp trnh socket l: Socket l giao din, cn cc k thut lp trnh phn tn
nh RPC, RMI...l c ch truyn thng.

IT

Hin ny c nhiu k thut lp trnh phn tn khc nhau nh:

K thut gi th tc t xa RPC(Remote Procedure Call)

K thut gi phng thc t xa RMI(Remote Method Invocation)

K thut m hnh i tng thnh phn phn tn DCOM

K thut kin trc mi gii trung gian CORBA

K thut EJB, WebService, RPC-XML...

PT

Cc k thut lp trnh phn tn hin ny u hng n m hnh a tng vi k thut lp trnh


hng dch v(SOP) m tiu biu l WebService. V n cho php gii quyt cc bi ton ln,
phc tp hiu qu v nhiu u im khc. K thut lp trnh RMI tng t nh k thut RPC
nhng khc ch: Trong RPC chong trnh client gi th tc pha Server , cn trong RMI client
gi phng thc t xa pha server(hng i tng).
2. Gii thiu k thut lp trnh RMI
2.1. c trng ca k thut RMI
RMI l k thut lp trnh phn tn i tng, n cho php gi phng thc ca i tng t xa
qua mng v nhn kt qu tr v t my t xa.
RMI l mt c ch truyn thng v l k thut thun Java. iu ngha l, k thut RMI ch
cho php cc i tng thun Java mi gi t xa phng thc ca nhau c. Cn cc i tng
vit bng ngn ng khc nh Delphi, C++... th k thut RMI khng cho php.
Chng trnh ng dng phn tn RMI cng c t chc theo m hnh client/server:

Pha server l pha my tnh t xa cha cc i tng c phng thc cho php gi t xa.

Pha client l pha cha cc i tng pht sinh li gi phng thc t xa.

Mt chng trnh Client c th kch hot cc phng thc xa trn mt hay nhiu Server. Tc l
s thc thi ca chng trnh c tri rng trn nhiu my tnh. y chnh l c im ca cc
ng dng phn tn. Ni cch khc, RMI l c ch xy dng cc ng dng phn tn di ngn
ng Java.
Mi i tng c phng thc cho php gi t xa, trc khi s dng c n phi c ng k
vi my o java thng qua b ng k ca JDK hoc do ngi s dng nh ngha. V mi i
tng cng phi c gn mt chui dng lm tn truy xut tm i tng trn mng.
Chui tn c dng nh URL:
"rmi://<host>[:port]/ObjName"
Trong :
rmi : ch phng thc truy cp

host: a ch ca my trm cha i tng t xa cn tm

port: Ch ra s cng c s dng truy xut tm i tng, n c th c hoc khng.


Trong trng hp khng khai bo th n mc nh ly s cng 1099.

ObjName: L chui tn gn cho i tng c phng thc cho php gi t xa.

IT

PT

RMI s dng giao thc truyn thng JRMI. Giao thc ny cho php to ra mi trng mng
truyn thng trong sut m t li gi phng thc t xa khng khc g li gi cc b. V
truyn thng, java s dng 2 i tng trung gian ng gi truyn thng v khi phc li li
gi, kt qu thi hnh phng thc t xa qua mng t cc gi tin truyn qua mng .. i tng
_Skel ci pha bn server v _Stub ci pha bn client.
h tr lp trnh RMI, java h tr nhiu lp v giao din th vin m tp trung ch yu trong
2 gi: java.rmi v java.rmi.server.
Nh vy k thut lp trnh phn tn i tng RMI trong java cho php phn tn ti ln cc
my tnh trn mng thay v tp trung trn mt my. iu ny tht s c ngha ln i vi cc
ng dng m c khi lng tnh ton ln m i hi thi gian thc. V mt my tnh c mnh
n my cng vn hu hn. Nht l i vi nhng bi ton thc t nh: Bi ton th trng
chng khon, ngn hng, bi ton hng khng, d bo thi tit, bi ton nghin cu v
tr...Phn sau y chng ta s i su vo nghin cu cc k thut lp trnh ca RMI v c ch
hot ng ca chng.
2.1.. Kin trc ca chng trnh Client Server theo c ch RMI
Hnh 5.1. l kin trc ca mt chng trnh phn tn i tng RMI theo m hnh Client /Server:
Trong :

Server l chng trnh cung cp cc i tng c th c gi t xa.

Client l chng trnh c tham chiu n cc phng thc ca cc i tng


c phng thc cho php gi t xa trn Server.

Stub l i tng mi gii trung gian pha client.

Skeleton l i tng mi gii trung gian ci pha server.

Remote Reference Layer l lp tham chiu t xa ca RMI.

PT

IT

Hnh5.1.. Kin trc Client/Server ca chng trnh RMI

2.2. Cc c ch hot ng RMI

Trong mt ng dng phn tn cn c cc c ch sau:

C ch nh v i tng xa

C ch giao tip vi cc i tng xa

Ti cc lp dng bytecodes cho cc lp m n c chuyn ti qua li gia JVM

1.3.1.C ch nh v i tng xa (Locate remote objects): C ch ny xc nh cch thc m


chng trnh Client c th ly c tham chiu (Stub) n cc i tng xa. Thng thng
ngi ta s dng mt dch v danh b (Naming Service) lu gi cc tham chiu n cc i
tng cho php gi t xa m client sau c th tm kim.
1.3.2. C ch giao tip vi cc i tng xa (Communicate with remote objects): c ch truyn
thng vi cc i tng t xa c ci t chi tit bi h thng RMI.
1.3.3. Ti cc lp dng bytecodes cho cc lp m thc hin chuyn ti qua li gia My o
(Load class bytecodes for objects that are passed around): V RMI cho php cc chng trnh
gi phng thc t xa trao i cc i tng vi cc phng thc t xa di dng cc tham s

hay gi tr tr v ca phng thc, nn RMI cn c c ch cn thit ti m Bytecodes ca cc


i tng t my o ny sang my o khc.

IT

Hnh 5.2. m t mt ng dng phn tn RMI s dng dch v danh b ly cc tham chiu ti
cc i tng xa.

Hnh 5.2. Vai tr ca dch v tn


Trong :

PT

Server ng k tn cho i tng c th c gi t xa ca mnh vi Dch v danh b


(Registry Server).
Client tm i tng xa thng qua tn c ng k trn Registry Server (looks
up) v tip gi cc phng thc xa.
Hnh 5.2. minh ha cng cho thy cch thc m h thng RMI s dng mt WebServer
sn c truyn ti m bytecodes ca cc lp qua li gia Client v Server
Tin trnh vn hnh ca mt ng dng Client/Server theo kiu RMI din ra nh sau:
Bc 1: Server to ra cc i tng cho php gi t xa cng vi cc Stub v Skeleton
ca chng.

Bc 2: Server s dng lp Naming ng k tn cho mt i tng t xa (1).

Bc 3: Naming ng k Stub ca i tng t xa vi Registry Server (2).

Bc 4: Registry Server sn sng cung cp tham tho n i tng t xa khi c yu


cu (3).
Client yu cu Naming nh v i tng xa qua tn c ng k (phng thc
lookup) vi dch v tn (4).
Naming ti Stub ca i tng xa t dch v tn m i tng xa ng k v Client
(5).

Ci t i tng Stub v tr v tham kho i tng xa cho Client (6).

Client thc thi mt li gi phng thc t xa thng qua i tng Stub (7).

3. Cc lp h tr lp trnh vi RMI
Java h tr cc lp cn thit ci t cc ng dng Client-Server theo kiu RMI trong
cc gi: java.rmi. Trong s cc lp thng c dng l:

java.rmi.Naming:

java.rmi.RMISecurityManager

java.rmi.RemoteException;

java.rmi.server.RemoteObject

java.rmi.server.RemoteServer

java.rmi. server.UnicastRemoteObject

II. XY DNG CHNG TRNH PHN TN RMI


Xy dng mt ng dng phn tn bng c ch RMI gm cc bc sau:

IT

1. Thit k v ci t cc thnh phn ca ng dng.

2. Bin dch cc chng trnh ngun v to ra Stub v Skeleton.


3. To cc lp c th truy xut t mng cn thit.

PT

4. Khi to ng dng
1. K thut lp trnh RMI

u tin chng ta phi xc nh lp no l lp cc b, lp no l lp c gi t xa. N bao gm


cc bc sau:

nh ngha cc giao din cho cc phng thc xa (remote interfaces): Mt remote


interface m t cc phng thc m n c th c kch hot t xa bi cc Client. i
cng vi vic nh ngha Remote Interface l vic xc nh cc lp cc b lm tham s
hay gi tr tr v ca cc phng thc c gi t xa.

Ci t cc i tng t xa (remote objects): Cc Remote Object phi ci t cho mt


hoc nhiu Remote Interfaces c nh ngha. Cc lp ca Remote Object class ci
t cho cc phng thc c gi t xa c khai bo trong Remote Interface v c
th nh ngha v ci t cho c cc phng thc c s dng cc b. Nu c cc lp
lm i s hay gi tr tr v cho cc phng thc c gi t xa th ta cng nh ngha v
ci t chng.

Ci t cc chng trnh Client: Cc chng trnh Client c s dng cc Remote Object


c th c ci t bt k thi im no sau khi cc Remote Interface c nh
ngha.

nm c k thut lp trnh RMI c th chng ta xy dng chng trnh n gin s dng


RMI nh sau: Vit chng trnh ng dng phn tn RMI theo m hnh client server. Chng
trnh c cu trc sau:

Chng trnh server: c i tng c phng thc cho php gi t xa int add(int
x,int y) tnh tng ca 2 s.

Chng trnh client: cho php gi phng thc th xa add() qua mng tnh
tng ca 2 s nguyn v hin th kt qu.

Qu trnh xy dng chng trnh ny c th thc hin qua cc bc sau:


Bc 1: Khai bo giao din khai bo cc phng thc cho php gi t xa. V trong k thut
RMI, bt k phng thc no cho php gi t xa qua mng u phi c khai bo trong giao
din k tha t giao din Remote thuc lp java.rmi. V phng thc phi m bo 2 yu cu
sau:
Phi c thuc tnh public

Phi nm tr v ngoi l RemoteException

IT

Gi s giao din c tn TT, chng ta c th khai bo n nh sau:


//TT.java
import

java.rmi.*;

public int
}

TT

extends

PT

public interface

add(int x,int

Remote

y) throws

RemoteException;

Bc 2: Khai bo lp thc thi giao din TT ci dt phng thc add(). Gi s lp c tn l


TTImpl:
//TTImpl.java

import java.rmi.*;
class

TTImpl

implements

TT

{
public int add(int x,int y) throws

RemoteException

{
return

(x+y);

}
}

Bc 3: Xy dng chng trnh server. Chng trnh server phi thc hin 3 vn ct li sau
y:

To i tng c phng thc cho php gi t xa v tr v tham chiu n giao din ca


chng. V d:
TT

c=new TTImpl();

ng k i tng c phng thc cho php gi t xa vi my o java, thng qua trnh


ng k ca JDK hoc do ngi lp trnh t nh ngha, bng cch s dng phng thc
exportObject() ca lp UnicastRemoteObject thuc gi java.rmi.server. Phng thc
exportObject() c th khai bo nh sau:
UnicastRemoteObject.exportObject(Obj);

Gn cho i tng c phng thc cho php gi t xa mt tn di dng chui URL


thng qua chui tn , cc i tng client c th truy xut tm thy i tng trn
mng. thc hin vic , lp java.rmi.Naming cung cp phng thc bind() hoc
rebind(). Phong thc bind() c dng sau:
Naming.bind(rmi//<host>[:port]/ObjName, Obj);

//TTServer.java
import java.rmi.*;

IT

Chng trnh server c vit nh sau:

import java.rmi.serrver.*;

PT

class TTServer{

public static void main(String[] args)


{

try{

//Tao doi tuong


TT

c=new

TTImpl();

//dang ky voi mays ao java

UnicastRemoteObject.exportObject(c);
//Gan chuoi URL
Naming.bind(rmi://localhost/Obj, c);
System.out.println(Server RMI da san sang....);
}
catch(Exception

e)

{
System.out.println(e);
}
}}

Bc 4: Xy dng chng trnh client, gi s chng trnh l lp TTClient.java.. Chng trnh


client phi c nhim v sau:

Truy xut tm i tng c phng thc cho php gi t xa thng qua chui tn URL a
c chng trnh server gn cho i tng. Bng cch client s dng phng thc
lookup() ca lp Naming hi b ng k thng qua s cng c th c nh ngha
trong chui URL. Nu tm thy, server s tr v tham chiu n i tng t xa c kiu
giao din ca i tng.

Gi thi hnh phng thc t xa thng qua bin tham chiu ti i tng t xa.

Chng trnh client:


//TTClient.java
import java.rmi.*;
class TTClient{
public static void main(String[] args)

try{
TT

IT

x=(TT)Naming.lookup(rmi://localhost/Obj);

int a=10, b=20;

cua

a=+a+

voi

b=+b+

la

PT

System.out.println(Tong
s=+x.add(a,b));
}

catch(Exception e)
{

System.out.println(e);
}

}}

2. Bin dch chng trnh


Giai on ny gm 2 bc:
Bc th nht: Bin dch cc tp chng trnh thnh dng bytecode dng trnh
javac.exe. Trong chng trnh trn c 4 tp:
javac.exe
TT.java

---------------------------->TT.class

(1)

TTImpl.java ---------------------------->TTImpl.class

(2)

TTServer.java ---------------------------->TTServer.class

(3)

TTClient.java ----------------------------->TTClient.class

(4)

Bc th 2: Pht sinh cc tp i tng trung gian _stub v _skel bng cch s dng
trnh dch rmic.exe ca JDK dch tp i tng c phng thc cho php gi t xa TTImpl:
rmic

TTImpl

[Enter]

Sau khi dich, 2 tp mi c to ra:


TTImpl_Stub.class

(5)

TTImpl_Skel.class

(6)

3. Thc thi chng trnh ng dng


Bc 1: Phn b cc tp chng trnh ph hp t (1) n (6) v my client v server. C th:

Pha client: (1), (4), (5)

Pha server: (1), (2), (3), (5), (6)

Bc 2: Chy chng trnh


Thc hin m 3 ca s lnh:
Ca s th nht: Chy trnh ng k rmiregistry.exe vi c php sau:
rmiregistry

[porrt]

[Enter]

Ca s th 2: Chy chng trnh server:


[Enter]

PT

java TTServer

IT

Ca s th 3: Chy chng trnh client:


java TTClient

[Enter]

Sau khi thc hin xong, sa li chng trnh client phn a ch host trong chui URL, dch li v
c th chy th qua mi trng mng. Khi ca s 1, 2 chy phia bn server, ca s 3 chy
pha client.
III. C CH TRUYN THNG RMI

C ch truyn thng RMI c th gii thch theo hnh 5.3 v n thc hin theo cc bc sau:
Step 1: u tin i tng ci t cc phng thc v gi hm Naming.bind() ng k vi b
qun l rmiregistry trn server thng qua qu trnh 1.
Step 2: i tng trn client gi hm Naming.lookup() truy tm i tng t xa bng cch hi
b ng k thng qua chui URL bng qu trnh 2.

TTClient
4

TTImpl
(add())

rmiregistry

TT
6

TTImpl_Skel

TTImpl_Stub
5

Hnh 5.3. C ch RMI gi phng thc ca i tng t xa

IT

Step 3: B ng k rmiregistry tm i tng, nu thy n tr v tham chiu n i tng t xa


cho client bng qu trnh 3 thng qua lp giao din(interface) m i tng t xa cung cp.
Step 4: Da vo giao din(TT) i tng TTClient s gi phng thc t xa ca i tng trn
server(TTImpl) thng qua tham chiu nhn c bc 3 bng qu trnh 4.

PT

Step 5: Khi mt phng thc c gi, li gi s c chuyn ti i tng trung gian _Stub v
c ng gi chuyn qua mng theo giao thc JRMP ti i tng _Skel pha server.
Step 6: i tng Skel pha server s khi phc li li gi v gi thi hnh phng thc t xa
bng qu trnh 6.
Step 7: Sau khi phng thc t xa thi hnh xong, kt qu s c i tng _Skel tr v cho i
tng client bng mt qu trnh truyn thng ngc vi qu trnh trn.

IV. VN TRUYN THAM S CHO PHNG THC GI T XA


1. Gii thiu truyn tham s theo tham tr v tham chiu cho phng thc t xa
Trong k thut RMI, vic truyn tham s trong cc li gi cc phng thc t xa qua mng cng
c 2 cch: truyn tham tr v truyn tham chiu. Vi cc tham s truyn c kiu d liu c bn th
u l truyn tham tr. Cn i vi cc i tng th c 2 kiu truyn: truyn i tng theo kiu
tham tr v truyn i tng theo kiu tham chiu. Trong cch truyn i tng theo kiu tham
tr th bn thn i tng s c truyn qua mng. Cch truyn ny c hn ch l:

nh hng n tc ca mng nht l khi truyn i tng c kch thc ln.

Ch truy xut gi phng thc t xa theo mt chiu t client ti server.

Trong cch truyn i tng theo kiu tham chiu th ch c tham chiu n i tng c
truyn qua mng nn khc phc c hn ch ca truyn i tng theo kiu tham tr. V n cho
php truy xut gi phng thc t xa theo c 2 chiu t client n server v ngc li.
ch th mt i tng truyn cho phng thc t xa qua mng l truyn tham tr hay truyn
tham chiu th trong Java s dng cch ci t nh sau: Tt c cc i tng c kiu lp thc thi
giao din Serializable th khi truyn cho phng thc u c n nh l truyn tham tr. Cn
cc i tng m c kiu lp thc thi giao din Remote th khi truyn cho phng thc t xa s
l truyn tham chiu.
Sau y chng ta s kho st k 2 cch truyn i tng theo kiu tham tr v kiu tham chiu.
2. Truyn i tng theo kiu tham tr
nm c k thut ny, chng ta xt v d sau: Vit chng trnh RMI c cu trc sau:
Pha client cho php to i tng BOX c cc tham s w, h, d tng ng l chiu rng,
chiu cao v chiu su ca hnh hp ch nht. Sau gi phng thc t xa v truyn i
tng BOX cho phng thc theo kiu tham tr, nhn kt qu tr v v hin th.

Pha server c i tng c phng thc cho php gi t xa vi tham s truyn l i


tng BOX, thc hin thay i w, h, d ca i tng v tr i tng v cho client.

IT

Qu trnh xy dng chng trnh thc hin cc bc sau:

PT

Bc 1: Xy dng lp BOX thc thi giao din Serializable thuc gi java.io i tng c th
truyn theo kiu tham tr.
//BOX.java

import java.io.*:
class
{
int

BOX

implements

Serializable

w,h,d;

BOX(){

w=10; h=20; d=15;


}}

Cc bc 2 tr i tng t nh k thut xy dng chng trnh RMI kho st phn trn.


Bc 2: Xy dng giao din khai bo phng thc changeOBject() cho php gi t xa
//BB.java
import java.rmi.*;
interface BB

extends

Remote

{
public

BOX

changeObject(BOX

obj) throws

RemoteException;

Bc 3: Khai bo lp thc thi giao din BB


//BBImpl.java
import java.rmi.*;
class

BBImpl

implements

BB

{
public

BOX

changeObject(BOX

obj) throws

RemoteException

{
obj.w+=10; obj.h+=5; obj.d+=15;
return obj;
}}

Bc 4: Xy dng chng trnh server


//BBServer.java

IT

import java.rmi.*;
import java.rmi.server.*;
class BBServer{

public static boid main(String[] args)

PT

{
try{
BB

c=new

BBImpl();

UnicastRemoteObject.exportObject(c);
Naming.bind(rmi://localhost/cObj,c);
}

catch(Exception

e)

{
System.out.println(e);
}}}

Bc 5: Xy dng chng tnh client


//BBClient.java
import
class

java.rmi.*;
BBClient{

public static void main(String[]


{
try{

args)

BB
BOX

c=(BB)Naming.lookup(rmi://localhost/cObj);
box=new

BOX();

System.out.println(w=+box.w+,h=+box.h+,d=+box.d);
box=c.changeObject(box);
System.out.println(w=+box.w+,h=+box.h+,d=+box.d);
}
catch(Exception e)
{
System.out.println(e);
}
}}

IT

Sau khi to chng trnh xong, thc hin dch v chy chng trnh theo k thut c trnh
by phn trn. r hn, cc bn c th hin th kch c ca i tng BOX pha client, hin
th kch c i tng sau khi gi phng thc t xa pha server so snh.
3. Truyn i tng theo kiu tham chiu
Trong k thut ny, i tng pha bn client v server u c th gi phng thc t xa ca
nhau v khc vi k thut trun tham s trn l ch truyn tham chiu n i tng thay v
truyn bn thn i tng.

PT

Nhng c mt vn cn l trong k thut ny l: i tng pha client gi phng thc t


xa ca i tng pha server th vn xy ra nh trnh by. Nhng khi i tng server gi
phng thc t xa ca client th c ch c khc mt cht. C ch gi ngc t xa ca i tng
trn server n i tng trn client thng quan tham chiu gi l c ch callback.

i tng client

i tng server

Gi phng thc

Gi phng thc

Hnh 5.4. i tng gia client v server gi phng thc ca nhau


th hin k thut truyn i tng theo kiu tham chiu, chng ta s xt v d sau[2]: Chng
ta s to ra 2 i tng l AtClient chy trn client v AtServer chy trn server. u tin nh k
thut rmi bnh thng, client s hi trnh rmiregistry timg tham chiu n i tng AtServer,
sau trnh client s to i tng AtClient pha client v gi phng thc ca AtServer ng
k i tng AtClient vi server. Sau khi thc hin nhng thao tc ny, i tng AtClient v
AtServer c th t do iu khint v gi phng thc t xa ca nhau. Qu trnh thc hin ny c
th th hin thng qua cc bc sau:

Bc 1: Xy dng giao din phias client l AtClient.


//AtClient.java
import java.rmi.*;
public interface

AtClient

extends

Remote

{
public void callClientMethod(String msg) throws

RemoteException;

Bc 2: Xy dng giao din pha server l AtServer


//AtServer.java
import java.rmi.*;
public interface

AtServer

extends

Remote

{
c)throws

public void callServerMethod(String

msg) throws RemoteException;

RemoteException;

IT

public void registerClient(AtClient

Bc 3: Ci t lp thc thi cho cc giao din AtClient v AtServer


//AtClientImpl.java

PT

import java.rmi.*;
class AtClientImpl
{

public void
{

implements

AtClient

callClientMethod(String msg) throws RemoteException

System.out.println(msg);
}}

//AtServerImpl.java
import java.rmi.*;
class AtServerImpl

implements

AtServer

{
AtClient client;
public void registerClient(AtClient c) throws RemoteException{
client=c;
}
public void
{

callServerMethod(String msg) throws RemoteException

System.out.println(msg);
for(int i=0;i<10;i++){
String msg=Server response

+Math.random()*1000;

client.callClientMethod(msg);
}}}

Bc 4: Xy dng chng trnh server


//rServer.java
import java.rmi.*;
import java.rmi.server.*;
class

rServer{

public static void main(String[] args) throws Exception


{
AtServer

server=new

AtServerImpl();

IT

UnicastRemoteObject.exportObject(server);
Naming.bind(rmi://localhost/serverObject,server);
System.out.println(Waiting for client request...);
}}

PT

Bc 5: Xy dng chng trnh client


//rClient.java

import java.rmi.*;

import java.rmi.server.*;
class

rClient{

public static void main(String[] args) throws Exception


{

AtClient

cl=new

AtClientImpl();

UnicastRemoteObject.exportObject(cl);
Naming.bind(rmi://localhost/clObject, cl);
AtServer svr=(AtServer)Naming.lookup(rmi://localhost/serverObject);
svr.registerClient(cl);
svr.callServerMethod(Client contact server);
}}

Bc 6: Gi s cc tp chng trnh trn u t trong th mc D:\rmi, qu trnh dch v chy


chng trnh c th thc hin bng cc cu lnh sau:

Dch:

D:\rmi\>javac *.java
`

D:\rmi\>rmic AtServerImpl
D:\rmi\>rmic AtClientImpl

M ca s lnh chy trnh ng k


D:\rmi\>rmiregistry

M ca s lnh chy trnh rServer


D:\rmi\>java rServer

M ca s lnh chy trnh rClient


D:\rmi\>java rClient

V. K THUT S DNG MT I TNG SN SINH NHIU I TNG


1. Gii thiu

PT

IT

Chng ta bit, mt i tng c phng thc cho php gi t xa trwcs khi s dng phi ng
k i tng vi my o java thng qua trnh rmiregistry, sau phi gn mt chui URL pha
server v pha client phi c lnh tm kim thng qua URL . i vi chng trnh n gin, t
i tng th khng vn g. Nhng khi pha Server c hng trm, hng nghn v hn na cc
i tng c phng thc cho php gi t xa thi vn tr nn nghim trng. Khi trnh
rmiregistry phi qun l qua nhiu i tng, ngi lp trnh chng trnh client phi nh nhiu
i tng, s cu lnh ng k i tng, gn chui URL pha server(bind()) v cu lnh tm
kim pha client(lookup()) qu nhiu, tng tc qua mng qu nhiu, t chng trnh tr nn
phc tp. gii quyt vn ny, rmi c mt k thut cc k hu ch. l, thay v to truy
xut, nh nhiu i tng th by gi ngi lp trnh ch cn nh mt i tng, ch cn ng k
vi my o java mt i tng v ch cn truy tm mt i tng. Cn tt c cc i tng cn
li s do i tng i din ny to ra, ang k v cho php pha client ch cn gi cc phng
thc t xa ca i tng i din tr v tham chiu n cc i tng do n sn sinh ra. i
tng gi l i tng sn sinh nhiu i tng(Factory Object). Hnh 5.5. cho chung ta thy
c ch s dng mt i tng(Factory Object) sn sinh nhiu i tng khc(A, B, C). C ch
s dng i tng Factory sn sinh nhiu i tng khc c thc hin nh sau:

u tin i tng Factory Object ng k vi b ng k rmiregistry

Trnh client mun gi i tng A, B, C; trc ht trnh client phi lin h vi rmiregistry
ly v tham chiu n i tng Factory Object.

Sau khi c tham chiu n i tng Factory Object, trnh client thc hin Factory Object
yu cu to ra cc i tng A, B, C, ng k cc i tng A, B, C vi my o java
v tr v tham chiu n A, B, C cho client.

Da vo tham chiu nhn c, client thc hin li gi phng thc t xa ca cc i


tng A, B, C.

Pha Client

Pha Server
rmiregistry
Factory
Object

Client

Object A
Object B

Object C

IT

Hnh 5.5. M hnh hot ng ca i tng Factory


2. K thut ci t ng dng Factory

PT

K thut ci t i tng sn sinh ra nhiu i tng c th hin thng qua v d sau: Gi s


m hnh bi ton nh hnh 5.5. Trong i tng Factory Object c cc phng thc t xa cho
php tr v tham chiu n i tng A, B, C l getRef_X() sau khi i tng ny to A, B, C
v ng k vi rmiregistry. Sau client s gi cc phng thc t xa ca cc i tng A, B, C
laf get_X(). Cc phng thc ny s tr v cho client chui Day la doi tng X. Vi X l A, B
hoc C. Gi s giao din ca i tng Factory Object l FF v lp thc thi l FFImpl.
Bc 1: Xy dng giao din ca A, B, C tng ng l AA, BB, CC
//AA.java

import java.rmi.*;
public interface
{
public String

AA

extends

get_A()

throws

Remote
RemoteException;

}
//BB.java
import java.rmi.*;
public interface
{
public String
}
//CC.java

BB

extends

get_B()

throws

Remote

RemoteException;

import java.rmi.*;
public interface
{
public String

CC

extends

get_C()

Remote

throws

RemoteException;

Bc 2: Khai bo cc lp thc thi cc giao din AA, BB, CC


//AAImp.java
import java.rmi.*;
class

AAImpl

public String
return

implements
get_A()

AA{

throws

RemoteException{

Day la doi tuong A.;

}}
//BBImpl.java

class

BBImpl

public String
return

IT

import java.rmi.*;
implements
get_B()

BB{

throws

RemoteException{

Day la doi tuong B.;

}}

PT

//CCImpl.java

import java.rmi.*;
class

CCImpl

public String
return
}}

implements CC{
get_C()

throws

RemoteException{

Day la doi tuong C.;

Bc 3: Khai bo giao din FF, trong giao din ny khai bo cc phng thc getRef_X() tr
v cc tham chiu n i tng A, B, C
//FF.java
import

java.rmi.*;

public interface

FF

extends

Remote{

public AA

getRef_A() throws

RemoteException;

public BB

getRef_B() throws

RemoteException;

public CC

getRef_C() throws

RemoteException;

Bc 5: Khai bo lp FFImpl thc thi giao din FF. Trong lp ny phi thc hin cc cng vic
sau:

To cc i tng A, B, C tng ng l AAImpl, BBImpl, CCImpl

ng k cc i tng ny vi trnh ng k rmiregistry

Ci t cc phng thc tr v tham chiu cc i tng c to ra


//FFImpl.java
import

java.rmi.*;

import

java.rmi.serrver.*;

class

FFImpl

implements

FF{

//Tao cac doi tuong


AA

a=new

AAImpl();

BB

b=new

BBImpl();

CC

c=new

CCImpl();

//Khai bao cau tu FFImpl, trong do thuc hien dang ky cac doi tuong
FFImpl()

IT

{
try{

UnicastRemoteObject.exportObject(a);
UnicastRemoteObject.exportObject(b);

PT

UnicastRemoteObject.exportObject(c);
}catch(Exception
{}
}

e)

//Cai dat cac phuong thu


public AA
return

getRef_A() throws

RemoteException{

a;

}
public BB
return

getRef_B() throws

RemoteException{

b;

}
public CC getRef_C() throws
return

RemoteException{

c;

}
}

Bc 6: Xy dng chng trnh pha server. Chng trnh ny phi thc hin cc nhim v
sau(nh k thut c bn):

To i tng FFImpl

ng k i tng FFImpl vi my o java

Gn cho i tng mt chui URL truy xut i tng trn mng


//FFServer.java
import

java.rmi.*;

import

java.rmi.server.*;

class

FFServer{

public static void main(String[] args) throws

Exception

{
FF

f=new

FFImpl();

UnicastRemoteObject.exportObject(f);
Naming.bind(rmi://localhost/ffObj,f);
System.out.println(Server da san sang...);

IT

}}

Bc 7: Xy dng chng trnh client. Chng trnh ny c nhim v sau:


Tm i tng FFImpl v nhn tham chiu n i tng FFImpl

Gi cc phng thc ca FFImpl ly tham chiu n cc i tng A, B, C

Thng qua tham chiu n A, B, C gi t xa cc phng thc ca cc i tng ny.

PT

//FFClient.java
import
class

java.rmi.*;

FFClient{

public static void main(String[] args ) throws Exception


{

//Lay tham chieu doi tuong Factorry


FF

f=(FF)Naming.lookup(rmi://localhost/ffObj);

//Goi phuong thuc cua Factory tra ve tham chieu toi A, B, C


AA

a=f.getRef_A();

BB

b=f.getRef_B();

CC

c=f.getRef_C();

//Goi cac phuong thuc cuar A, B, C thong qua tham chieu


System.out.println(a.get_A());
System.out.println(b.get_B());
System.out.println(c.get_C());

}}

Bc 8: Dch v chy chng trnh


//Gi s tt c cc tp ngun nm trong th mc d:\RMI\Factory
D:\RMI\Factory>javac

*.java

//Phat sinh cc tp _Stub, _Skel ca FFImp, AAImpl, BBImpl, CCImpl


D:\RMI\Factory>rmic

AAImpl

D:\RMI\Factory>rmic

BBImpl

D:\RMI\Factory>rmic

CCImpl

D:\RMI\Factory>rmic

FFImpl

//Chy chng trnh


//b1: M ca s lnh chy trnh ng k
D:\RMI\Factory>rmiregistry

IT

//b2: M ca s lnh chy chng trnh server


D:\RMI\Factory>java FFServer

//b3: M ca s lnh chy chng trnh client

PT

D:\RMI\Factory>java FFClient

Lu : Nu chy chng trnh server v client trn 2 my tnh ni mng th phi phn b cc tp
server v cc tp pha client tng t nh k thut c bn nhng nhiu i tng. V phi i a
ch trong chui URL pha chng trnh client l a ch ca server(trong lookup()).
VI. CASE STUDY 1: LOGIN T XA DNG RMI
1. Bi ton

Bi ton login t xa dng RMI t ra nh sau:


-

C s d liu c lu tr v qun l trn server RMI, trong c bng users cha t


nht hai ct: ct username v ct password.

Ti pha server, c khai bo, nh ngha, v ng k mt i tng t xa c phng th


kim tra ng nhp, n s tin hnh kim tra trong c s d liu xem c ti khon no
trng vi thng tin ng nhp nhn c hay khng.

Chng trnh pha client phi hin giao din ha, trong c mt text nhp
username, mt text nhp password, v mt nt nhn Login.

Khi nt Login c click, chng trnh client s triu gi lm kim tra login t server
RMI, ly thng tin ng nhp (username/password) trn form giao din kim tra

Sau khi c kt qu kim tra (ng nhp ng, hoc sai), client s hin th thng bo
tng ng vi kt qu nhn c: nu ng nhp ng th thng bo login thnh cng.
Nu ng nhp sai th thng bo l username/password khng ng.

Yu cu kin trc h thng c hai pha client v server RMI u c thit k theo
m hnh MVC

2. Thit k h thng
V h thng c thit k theo m hnh client/server RMI nn mi pha client, server s c mt
s lp ring, cc s ny c thit k theo m hnh MVC.
2.1 S lp pha client
S lp ca pha client c thit k theo m hnh MVC trong Hnh 5.6, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
Lp User: l lp tng ng vi thnh phn model (M), bao gm hai thuc tnh
username v password, cc hm khi to v cc cp getter/setter tng ng vi cc
thuc tnh.

Lp RMILoginClientView: l lp tng ng vi thnh phn view (V), l lp form


nn phi k tha t lp JFrame ca Java, n cha cc thuc tnh l cc thnh phn
ha bao gm text nhp username, text nhp password, nt nht Login.

Lp RMILoginClientControl: l lp tng ng vi thnh phn control (C), n cha


mt lp ni ti l LoginListener. Khi nt Login trn tng view b click th n s
chuyn tip s kin xung lp ni ti ny x l. Tt c cc x l u gi t trong
phng thc actionPerformed ca lp ni ti ny, bao gm: ly thng tin trn form
giao din, triu gi th tc t xa RMI v kim tra ng nhp v yu cu form giao
din hin th.

PT

IT

IT

Hnh 5.6: S lp pha client RMI


2.2 S lp pha server

PT

S lp ca pha server c thit k theo m hnh MVC trong Hnh 5.7, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
-

Lp User: l lp thc th, dng chung thng nht vi lp pha bn client.

Lp RMILoginServerView: l lp tng ng vi thnh phn view (V), l lp dng


hin th cc thng bo v trng thi hot ng bn server RMI.

Giao din RMILoginInterface: l giao din (interface) khai bo i tng t xa, trong
n khai bo th tc checkLogin(): th tc nhn vo mt tham s kiu User, tr kt
qu v dng String.

Lp RMILoginServerControl: l lp tng ng vi thnh phn control (C), n m


nhim vai tr x l ca server RMI, trong n nh ngha c th li phng thc
c khai bo trong RMILoginInterface, sau ng k bn thn n vo server RMI
phc v cc li triu gi t pha cc client.

PT

2.3 Tun t cc bc thc hin

IT

Hnh 5.7: S lp pha server RMI

Hnh 5.8: Tun t cc bc thc hin khi login t xa vi RMI


Tun t cc bc x l nh sau (Hnh 5.8):
1. pha client, ngi dng nhp username/password v click vo giao din ca lp
RMILoginClientView
2. Lp RMILoginClientView s ng gi thng tin username/password trn form
vo mt i tng model User bng phng thc getUser() v chuyn xung cho
lp RMILoginClientControl x l

3. Lp RMILoginClientControl s triu gi lm checkLogin() t pha server RMI


4. Server tr v cho bn client mt skeleton ca phng thc checkLogin().
5. Bn pha client, khi nhn c skeleton, n gi phng thc checkLogin() km
tra thng tin ng nhp.
6. Kt qu kim tra s c lp RMILoginClientControl s chuyn cho lp
RMILoginClientView hin th bng phng thc showMessage()
7. Lp RMILoginClientView hin th kt qu ng nhp ln cho ngi dng
3. Ci t
3.1 Cc lp pha client RMI
Lp User.java
package rmi.client;
import java.io.Serializable;

public User(){
}

IT

public class User implements Serializable{


private String userName;
private String password;

PT

public User(String username, String password){


this.userName = username;
this.password = password;
}
public String getPassword() {
return password;
}

public void setPassword(String password) {


this.password = password;
}
public String getUserName() {
return userName;
}

public void setUserName(String userName) {


this.userName = userName;
}
}

Lp RMILoginClientView.java
package rmi.client;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;

import
import
import
import
import
import
import
import

java.awt.event.WindowEvent;
javax.swing.JButton;
javax.swing.JFrame;
javax.swing.JLabel;
javax.swing.JOptionPane;
javax.swing.JPanel;
javax.swing.JPasswordField;
javax.swing.JTextField;

public class RMILoginClientView extends JFrame implements ActionListener{


private JTextField txtUsername;
private JPasswordField txtPassword;
private JButton btnLogin;
public RMILoginClientView(){
super("RMI Login MVC");
txtUsername = new JTextField(15);
txtPassword = new JPasswordField(15);
txtPassword.setEchoChar('*');
btnLogin = new JButton("Login");

IT

JPanel content = new JPanel();


content.setLayout(new FlowLayout());
content.add(new JLabel("Username:"));
content.add(txtUsername);
content.add(new JLabel("Password:"));
content.add(txtPassword);
content.add(btnLogin);

PT

this.setContentPane(content);
this.pack();

this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

public void actionPerformed(ActionEvent e) {


}
public User getUser(){
User model = new User(txtUsername.getText(), txtPassword.getText());
return model;
}
public void showMessage(String msg){
JOptionPane.showMessageDialog(this, msg);
}
public void addLoginListener(ActionListener log) {
btnLogin.addActionListener(log);
}
}

Lp RMILoginClientControl.java
package rmi.client;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import rmi.server.RMILoginInterface;
public class RMILoginClientControl {
private RMILoginClientView view;
private String serverHost = "localhost";
private int serverPort = 3232;
private RMILoginInterface rmiServer;
private Registry registry;
private String rmiService = "rmiLoginServer";

try{

IT

public RMILoginClientControl(RMILoginClientView view){


this.view = view;
view.addLoginListener(new LoginListener());

PT

// lay the dang ki


registry = LocateRegistry.getRegistry(serverHost, serverPort);
// tim kiem RMI server
rmiServer = (RMILoginInterface)(registry.lookup(rmiService));
}catch(RemoteException e){
view.showMessage(e.getStackTrace().toString());
e.printStackTrace();
}catch(NotBoundException e){
view.showMessage(e.getStackTrace().toString());
e.printStackTrace();
}

class LoginListener implements ActionListener {


public void actionPerformed(ActionEvent e) {
try {
User model = view.getUser();
if(rmiServer.checkLogin(model).equals("ok")){
view.showMessage("Login succesfully!");
}else{
view.showMessage("Invalid username and/or password!");
}
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
ex.printStackTrace();
}
}
}
}

Lp ClientRun.java

package rmi.client;
public class ClientRun {
public static void main(String[] args) {
RMILoginClientView view
= new RMILoginClientView();
RMILoginClientControl control = new RMILoginClientControl(view);
view.setVisible(true);
}
}

3.2 Cc lp pha server RMI


Lp RMILoginServerView.java
package rmi.server;
public class RMILoginServerView {
public RMILoginServerView(){
}

PT

Interface RMILoginInterface.java

IT

public void showMessage(String msg){


System.out.println(msg);
}

package rmi.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
import rmi.client.User;

public interface RMILoginInterface extends Remote{


public String checkLogin(User user) throws RemoteException;
}

Lp RMILoginServerControl.java
package rmi.server;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import rmi.client.User;
public class RMILoginServerControl extends UnicastRemoteObject implements
RMILoginInterface{

private
private
private
private
private

int serverPort = 3232;


Registry registry;
Connection con;
RMILoginServerView view;
String rmiService = "rmiLoginServer";

public RMILoginServerControl(RMILoginServerView view) throws RemoteException{


this.view = view;
getDBConnection("usermanagement", "root", "12345678");
view.showMessage("RMI server is running...");
// dang ki RMI server
try{
registry = LocateRegistry.createRegistry(serverPort);
registry.rebind(rmiService, this);
}catch(RemoteException e){
throw e;
}
}

IT

public String checkLogin(User user) throws RemoteException{


String result = "";
if(checkUser(user))
result = "ok";
return result;
}

PT

private void getDBConnection(String dbName,


String username, String password){
String dbUrl = "jdbc:mysql://localhost:3306/" + dbName;
String dbClass = "com.mysql.jdbc.Driver";
try {
Class.forName(dbClass);
con = DriverManager.getConnection (dbUrl, username, password);
}catch(Exception e) {
view.showMessage(e.getStackTrace().toString());
}

private boolean checkUser(User user) {


String query = "Select * FROM users WHERE username ='"
+ user.getUserName()
+ "' AND password ='" + user.getPassword() + "'";
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
if (rs.next()) {
return true;
}
}catch(Exception e) {
view.showMessage(e.getStackTrace().toString());
}
return false;
}

Lp ServerRun.java
package rmi.server;
public class ServerRun {
public static void main(String[] args) {
RMILoginServerView view
= new RMILoginServerView();
try{
RMILoginServerControl
control = new RMILoginServerControl(view);
}catch(Exception e){
e.printStackTrace();
}
}
}

PT

Login thnh cng:

IT

4. Kt qu

Login li:

VII. CASE STUDY 2: KT HP RMI V TCP/IP


1. Bi ton

Bi ton login t xa dng kt hp TCP/IP v RMI t ra nh sau:


C s d liu c lu tr v qun l trn server RMI, trong c bng users cha t
nht hai ct: ct username v ct password.

Ti pha server RMI, c khai bo, nh ngha, v ng k mt i tng t xa c


phng th kim tra ng nhp, n s tin hnh kim tra trong c s d liu xem c ti
khon no trng vi thng tin ng nhp nhn c hay khng.

Chng trnh pha client TCP phi hin giao din ha, trong c mt text
nhp username, mt text nhp password, v mt nt nhn Login.

Khi nt Login c click, chng trnh client s ly thng tin ng nhp


(username/password) trn form giao din gi snag server TCP kim tra

Ti pha server TCP, khi nhn c yu cu kim tra ang nhp (km theo
username/password), n s triu gi hm kim tra ng nhp t xa ca RMI

Sau khi c kt qu kim tra (ng nhp ng, hoc sai), server TCP s gi li cho
client TCP.

Client TCP s hin th thng bo tng ng vi kt qu nhn c: nu ng nhp


ng th thng bo login thnh cng. Nu ng nhp sai th thng bo l
username/password khng ng.

Yu cu kin trc h thng c hai pha client TCP, server TCP v server RMI u
c thit k theo m hnh MVC

PT

2. Thit k h thng

IT

H thng s bao gm ba pha: client TCP, server TCP, v server RMI. Mi pha u c thit k
theo m hnh MVC.
2.1 S lp pha client TCP

IT

Hnh 5.9 : S lp pha client TCP

PT

S lp ca pha client c thit k theo m hnh MVC trong Hnh 5.9, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
-

Lp User: l lp tng ng vi thnh phn model (M), bao gm hai thuc tnh
username v password, cc hm khi to v cc cp getter/setter tng ng vi cc
thuc tnh.

Lp ClientView: l lp tng ng vi thnh phn view (V), l lp form nn phi k


tha t lp JFrame ca Java, n cha cc thuc tnh l cc thnh phn ha bao gm
text nhp username, text nhp password, nt nht Login.

Lp ClientControl: l lp tng ng vi thnh phn control (C), n cha mt lp ni


ti l LoginListener. Khi nt Login trn tng view b click th n s chuyn tip s
kin xung lp ni ti ny x l. Tt c cc x l u gi t trong phng thc
actionPerformed ca lp ni ti ny, bao gm: ly thng tin trn form giao din, gi
sang server TCP theo giao thc TCP/IP, nhn kt qu v v yu cu form giao din
hin th.

2.2 S lp pha server TCP

Hnh 5.10: S lp pha server TCP


S lp ca pha server c thit k theo m hnh MVC trong Hnh 5.10, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
Lp User: l lp thc th, dng chung thng nht vi lp pha bn client.

Lp ServerView: l lp tng ng vi thnh phn view (V), l lp dng hin th cc


thng bo v trng thi hot ng bn server TCP.

Lp ServerControl: l lp tng ng vi thnh phn control (C), n m nhim vai


tr x l ca server TCP: nhn thng tin ng nhp t cc client TCP, triu gi th tc
t xa ca server RMI v chy kim tra ng nhp, sau gi kt qu kim tra ng
nhp v li pha client TCP.

PT

IT

2.3 S lp pha server RMI

S lp ca pha server c thit k theo m hnh MVC trong Hnh 5.11, bao gm 3 lp chnh
tng ng vi s M-V-C nh sau:
-

Lp User: l lp thc th, dng chung thng nht vi lp pha bn client.

Lp RMILoginServerView: l lp tng ng vi thnh phn view (V), l lp dng


hin th cc thng bo v trng thi hot ng bn server RMI.

Giao din RMILoginInterface: l giao din (interface) khai bo i tng t xa, trong
n khai bo th tc checkLogin(): th tc nhn vo mt tham s kiu User, tr kt
qu v dng String.

Lp RMILoginServerControl: l lp tng ng vi thnh phn control (C), n m


nhim vai tr x l ca server RMI, trong n nh ngha c th li phng thc
c khai bo trong RMILoginInterface, sau ng k bn thn n vo server RMI
phc v cc li triu gi t pha cc server TCP.

PT

2.4 Tun t cc bc thc hin

IT

Hnh 5.11 : S lp pha server RMI

Hnh 5.12 : Tun t cc bc thc hin khi ng nhp kt hp TCP/IP - RMI


Tun t cc bc x l nh sau (Hnh 5.12):
1. pha client, ngi dng nhp username/password v click vo giao din ca lp
ClientView
2. Lp ClientView s ng gi thng tin username/password trn form vo mt i
tng model User bng phng thc getUser() v chuyn xung cho lp
ClientControl x l
3. Lp ClientControl gi thng tin ng nhp sang server TCP

4. Lp ServerControl triu gi lm checkLogin() t pha server RMI ngay khi nhn


c yu cu t pha client TCP
5. Server RMI tr v cho bn server TCP mt skeleton ca phng thc
checkLogin().
6. Bn pha server TCP, khi nhn c skeleton, n gi phng thc checkLogin()
km tra thng tin ng nhp.
7. Kt qu kim tra s c lp ServerControl tr v cho lp Client Control.
8. Lp ClientControl s chuyn cho lp ClientView hin th bng phng thc
showMessage()
9. Lp ClientView hin th kt qu ng nhp ln cho ngi dng
3. Ci t
3.1 Cc lp pha client TCP
package rmi_tcp.tcpClient;
import java.io.Serializable;

IT

Lp User.java

public class User implements Serializable{


private String userName;
private String password;

PT

public User(){
}

public User(String username, String password){


this.userName = username;
this.password = password;
}
public String getPassword() {
return password;
}

public void setPassword(String password) {


this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}

Lp ClientView.java
package rmi_tcp.tcpClient;

import
import
import
import
import
import
import
import
import
import
import
import

java.awt.FlowLayout;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;
java.awt.event.WindowAdapter;
java.awt.event.WindowEvent;
javax.swing.JButton;
javax.swing.JFrame;
javax.swing.JLabel;
javax.swing.JOptionPane;
javax.swing.JPanel;
javax.swing.JPasswordField;
javax.swing.JTextField;

public class ClientView extends JFrame implements ActionListener{


private JTextField txtUsername;
private JPasswordField txtPassword;
private JButton btnLogin;
public ClientView(){
super("TCP-RMI Login MVC");

IT

txtUsername = new JTextField(15);


txtPassword = new JPasswordField(15);
txtPassword.setEchoChar('*');
btnLogin = new JButton("Login");

PT

JPanel content = new JPanel();


content.setLayout(new FlowLayout());
content.add(new JLabel("Username:"));
content.add(txtUsername);
content.add(new JLabel("Password:"));
content.add(txtPassword);
content.add(btnLogin);
this.setContentPane(content);
this.pack();

this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

}
public void actionPerformed(ActionEvent e) {
}
public User getUser(){
User model = new User(txtUsername.getText(), txtPassword.getText());
return model;
}
public void showMessage(String msg){
JOptionPane.showMessageDialog(this, msg);
}
public void addLoginListener(ActionListener log) {

btnLogin.addActionListener(log);
}
}

Lp ClientControl.java
package rmi_tcp.tcpClient;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class ClientControl {
private ClientView view;
private String serverHost = "localhost";
private int serverPort = 8888;

IT

public ClientControl(ClientView view){


this.view = view;
this.view.addLoginListener(new LoginListener());
}

PT

class LoginListener implements ActionListener {


public void actionPerformed(ActionEvent e) {
try {
User user = view.getUser();
Socket mySocket = new Socket(serverHost, serverPort);
ObjectOutputStream oos =
new ObjectOutputStream(mySocket.getOutputStream());
oos.writeObject(user);
ObjectInputStream ois =
new ObjectInputStream(mySocket.getInputStream());
Object o = ois.readObject();
if(o instanceof String){
String result = (String)o;
if(result.equals("ok"))
view.showMessage("Login succesfully!");
else view.showMessage("Invalid username and/or password!");
}
mySocket.close();
} catch (Exception ex) {
view.showMessage(ex.getStackTrace().toString());
}

}
}
}

Lp ClientRun.java
package rmi_tcp.tcpClient;
public class ClientRun {
public static void main(String[] args) {
ClientView view = new ClientView();

ClientControl control = new ClientControl(view);


view.setVisible(true);
}
}

3.2 Cc lp pha server TCP


Lp ServerView.java
package rmi_tcp.tcpServer;
public class ServerView {
public ServerView(){
}
public void showMessage(String msg){
System.out.println(msg);
}

Lp ServerControl.java

IT

PT

package rmi_tcp.tcpServer;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import rmi_tcp.rmiServer.RMILoginInterface;
import rmi_tcp.tcpClient.User;

public class ServerControl {


private ServerView view;
private ServerSocket myServer;
private Socket clientSocket;
private String serverRMIHost = "localhost";
private int serverRMIPort = 3535;
private int serverTCPPort = 8000;
private RMILoginInterface rmiServer;
private Registry registry;
private String rmiService = "rmitcpLoginServer";
public ServerControl(ServerView view){
this.view = view;
openServer(serverTCPPort);
bindingRMI();
view.showMessage("TCP server is running...");
while(true){
listenning();
}

}
private void openServer(int portNumber){
try {
myServer = new ServerSocket(portNumber);
}catch(IOException e) {
view.showMessage(e.toString());
e.printStackTrace();
}
}

IT

private void bindingRMI(){


try{
// lay the dang ki
registry = LocateRegistry.getRegistry(serverRMIHost,
serverRMIPort);
// tim kiem RMI server
rmiServer = (RMILoginInterface)(registry.lookup(rmiService));
}catch(RemoteException e){
view.showMessage(e.getStackTrace().toString());
e.printStackTrace();
}catch(NotBoundException e){
view.showMessage(e.getStackTrace().toString());
e.printStackTrace();
}
}

PT

private void listenning(){


try {
clientSocket = myServer.accept();
ObjectInputStream ois =
new ObjectInputStream(clientSocket.getInputStream());
Object o = ois.readObject();
if(o instanceof User){
User user = (User)o;
String result = rmiServer.checkLogin(user);
ObjectOutputStream oos =
new ObjectOutputStream(clientSocket.getOutputStream());
oos.writeObject(result);
}
}catch (Exception e) {
view.showMessage(e.toString());
e.printStackTrace();
}

}
}

Lp ServerRun.java
package rmi_tcp.tcpServer;
public class ServerRun {
public static void main(String[] args) {
ServerView view
= new ServerView();

ServerControl control = new ServerControl(view);


}
}

3.3 Cc lp pha server RMI


Lp RMILoginServerView.java
package rmi_tcp.rmiServer;
public class RMILoginServerView {
public RMILoginServerView(){
}
public void showMessage(String msg){
System.out.println(msg);
}

Interface RMILoginInterface.java
package rmi_tcp.rmiServer;
import java.rmi.Remote;
import java.rmi.RemoteException;
import rmi_tcp.tcpClient.User;

IT

PT

public interface RMILoginInterface extends Remote{


public String checkLogin(User user) throws RemoteException;
}

Lp RMILoginServerControl.java

package rmi_tcp.rmiServer;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import rmi.client.User;

public class RMILoginServerControl extends UnicastRemoteObject implements


RMILoginInterface{
private int serverPort = 3535;
private Registry registry;
private Connection con;
private RMILoginServerView view;
private String rmiService = "rmitcpLoginServer";
public RMILoginServerControl(RMILoginServerView view) throws RemoteException{

this.view = view;
getDBConnection("usermanagement", "root", "12345678");
view.showMessage("RMI server is running...");
// dang ki RMI server
try{
registry = LocateRegistry.createRegistry(serverPort);
registry.rebind(rmiService, this);
}catch(RemoteException e){
throw e;
}
}
public String checkLogin(User user) throws RemoteException{
String result = "";
if(checkUser(user))
result = "ok";
return result;
}

IT

private void getDBConnection(String dbName,


String username, String password){
String dbUrl = "jdbc:mysql://localhost:3306/" + dbName;
String dbClass = "com.mysql.jdbc.Driver";

PT

try {
Class.forName(dbClass);
con = DriverManager.getConnection (dbUrl, username, password);
}catch(Exception e) {
view.showMessage(e.getStackTrace().toString());
}

private boolean checkUser(User user) {


String query = "Select * FROM users WHERE username ='"
+ user.getUserName()
+ "' AND password ='" + user.getPassword() + "'";
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
if (rs.next()) {
return true;
}
}catch(Exception e) {
view.showMessage(e.getStackTrace().toString());
}
return false;
}
}

Lp ServerRun.java
package rmi_tcp.rmiServer;

public class ServerRun {


public static void main(String[] args) {
RMILoginServerView view
= new RMILoginServerView();
try{
RMILoginServerControl
control = new RMILoginServerControl(view);
}catch(Exception e){
e.printStackTrace();
}
}
}

Login li:

PT

Login thnh cng:

IT

4. Kt qu

VIII. KT LUN
Qua cc mc ca chng ny, chng ta lm sng t k thut lp trnh, c ch truyn thng v
bn cht ca lp trnh phn tn i tng ca RMI. Thng qua , sinh vin c th hiu oc cc
k thut lp trnh khc nh RPC, DCOM, CORBA, EJB, WebService... vi cc k thut lp trnh
OOP, SOP v kin trc nhiu tng. Ngoi cc vn nu trong chng, cn mt s k thut khc
ca RMI khng km phn quan trng m s c cp n trong bi ging v thng qua bi tp
ca sinh vin nh: Vn nh ngha b ng k, vn tun t ho i tng, K thut gi i

PT

IT

tng t xa bng phng thc ng, k thut kch hot i tng t xa t ng, chnh sch bo
mt t pha client.v.v..

PHN IV.
LP TRNH TRUYN THNG QUA MNG PSTN&ET
CHNG 5
LP TRNH NG DNG TRUYN THNG
QUA MNG IN THOI CNG CNG (PSTN)

PT

IT

I. K THUT LP TRNH VI JTAPI


1. Gii thiu th vin JTAPI
JTAPI l mt giao din lp trnh ng dng hng i tng cho nhng ng dng my tnh-in
thoi trn nn Java. Tng t nh nhng giao din lp trnh ng dng cho cc nn tng khc nh
TAPI (Telephony API) trn Microsoft Windows v TSAPI trn Novell Netware. Cu trc ca th
vin JTAPI c th hin nh hnh sau: N gm b ct li v cc gi m rng chun.

Hnh 6.1. Cu trc th vin JTAPI


Ti trung tm ca JTAPI l gi "ct li ". Gi ct li cung cp khung c bn cho m hnh gi
in thoi v nhng c trng in thoi s khai ban u . Nhng c tnh ny bao gm nh v
mt cuc gi, tr li mt gi, v hu mt cuc gi. Nhng ng dng k thut in thoi n gin
s ch cn s dng li thc hin cc tc v ca chng m khng cn quan tm ti nhng chi
tit ca nhng gi khc. Chng hn, gi li cho php ngi s dng d dng thit k thm c
tnh in thoi vo mt trang Web.
Phn tng xung quanh gi li JTAPI l mt s gi "m rng chun ". Nhng gi m rng ny b
sung thm cc chc nng in thoi cho API. Cc gi m rng chun trong API bao gm cc gi
sau:callcontrol, callcenter, media, phone, privatepackages v gi capabilities.
Gi iu khin gi call control.
Gi javax.telephony.callcontrol: M rng li bng vic cung cp cc cuc gi mc cao hn bao
gm cc c tnh iu khin in thoi nh gi cuc gi, chuyn cuc gi... Gi ny cng
cung cp mt m hnh trng thi chi tit hn ca nhng cuc gi. Cc lp tiu biu ca
gi gm cc giao din sau:
CallControlAddress
CallControlAddressObserver

PT

IT

CallControlCall
CallControlCallObserver
CallControlConnection
CallControlTerminal
CallControlTerminalConnection
CallControlTerminalObserver
Gi callcenter
Gi javax.telephony.callcenter cung cp kh nng thc hin qun l cc trung tm cuc
gi ln mc cao. V d nh: nh tuyn, phn b cuc gi t ng ACD, d bo cuc gi v
lin kt d liu ng dng vi i tng in thoi. Gi ny gm cc lp sau:
ACDAddress
ACDAddressObserver
ACDConnection
ACDManagerAddress
ACDManagerConnection
AgentTerminal
AgentTerminalObserver
CallCenterAddress
CallCenterCall
CallCenterCallObserver
CallCenterProvider
RouteAddress
RouteCallback
RouteSession
Gi Media.
Gi javax.telephony.media cho php truy nhp ti cc lung(stream) phng tin truyn
thng lin quan n cuc gi. Chng cho php c v vit d liu t nhng lung phng
tin truyn thng ny. Gi ny gm cc lp:
MediaCallObserver
MediaTerminalConnection
Gi Phone:
Gi javax.telephony.phone cho php cc ng dng iu khin cc c tnh vt l ca
phn cng in thoi.
Gi Phone gm cc lp:
Component
ComponentGroup
PhoneButton
PhoneDisplay
PhoneGraphicDisplay
PhoneHookswitch
PhoneLamp

PT

IT

PhoneMicrophone
PhoneRinger
PhoneSpeaker
PhoneTerminal
PhoneTerminalObserver
Gi capabilities :
Gi javax. telephony.capabilities l gi cung cp cho cc ng dng kh nng truy vn ti
hot ng xc nh mt khi n c thc hin. V n gm cc lp sau :
AddressCapabilities
CallCapabilities
ConnectionCapabilities
ProviderCapabilities
TerminalCapabilities
TerminalConnectionCapabilities
Gi Private Data
Gi javax.telephony.privatedata cho php cc ng dng truyn trc tip d liu trn cc
chuyn mch cng. D liu ny c s dng ch dn chuyn mch thc hin mt thao
tc chuyn mch c.
2. C s ca JTAPI.
Mc ch ca th vin JTAPI c xy dng to ra mt giao din cho php trnh ng dng
Java giao tip vi h thng in thoi. im giao tip ny xc nh mc iu khin m mt
ng dng phi c. JTAPI h tr c 2 kiu ng dng: first-party v third-party.
Trong ng dng first- party, giao din c nh v ti thit b u cui. ng dng c cng mc
iu khin nh cuc gi in thoi bnh thng ca ngi dng. Trong kch bn iu khin
third party, giao din c xc nh bn trong h thng in thoi v ph thuc vo h thng
in thoi. S truy cp bn trong ny thng cung cp cho ng dng nhiu kh nng iu khin
hn kch bn first- party.

Hnh 6.2. iu khin cuc gi


JTAPI trong thc t, thc cht l mt tp API. B ct li ca API cung cp m hnh cuc gi c
bn v nhng c trng in thoi c s nht nh: nh v cuc gi v tr li cc cuc gi
telephone.
Cc c trng ca in thoi Java l:

Lm n gin hu ht cc ng dng in thoi c bn


Cung cp mt khung lm vic m tri khp cc ng dng desktop i vi cc ng dng
in thoi trung tm gi phn tn.
Giao tip cc ng dng trc tip vi cc ni cung cp dch v hoc thc hin giao tip vi
cc API in thoi tn ti sn nh SunXTL, TSAPI, and TAPI.
Da trn b li n gin, gia tng thm cc gi m rng chun.
Chy c trn mt phm vi rng cc cu hnh phn cng mt khi Java run-time c s
dng.

3. Cc cu hnh cuc gi tiu biu

PT

IT

Mc ny trnh by nhng v d cu hnh cuc gi c la chn gii thch m hnh gi. N


c bt u vi mt cuc gi 2 pha c bn, sau m rng v d vi cuc gi, ngi s dng
v cc thit b u cui khc.
Cu c g i 2 pha(two- party call):
Mt v d cuc gi vi hai ngi tham gia c biu din trong hnh 6.3. Nhng ngi cha c
kinh nghim c th rt ngc nhin trong trng hp n gin ny: hai i tng kt ni
(Connection object) gn vo i tng cuc gi (Call object), mi i tng kt ni cho mi
ngi tham gia. Cu hnh ny cho php m rng thc hin cho cuc gi hi tho vi ba hoc
nhiu ngi tham gia hn. Cn ch rng m hnh ny hon ton cn i (N khng phn bit
gia thc th cc b v thc th xa) bi v n cung cp cch nhn third-party

Hnh 6.3.. M hnh two- party call


Hai cuc gi ng thi:
Mt v d v mt ngi s dng m c hai cuc gi ng lot trn cng thit b u cui c
a vo hnh 6.4. Mi i tng lin quan cuc gi gp i s ca h. i tng a ch
(Address object) v i tng thit b u cui (Terminal object) ca ngi s dng c hai cuc
gi ch sinh ra mt ln nhng c gn cho hai i tng kt ni (Connection object) v hai i
tng kt ni u cui (TerminalConnection).

PT

IT

Hnh6.4. M hnh Two simultaneous calls.


Ci t cuc gi vi hai thit b u cui:
Mt v d cuc gi hai ngi vi thit b u cui c chung bo c trnh by trong hnh 6.5.
Trong v d trn, Bob thc hin nhiu lung, c ngha rng khi Bob c gi th vi thit b u
cui s chunng th hin nhiu lung c i din bi hai i tng kt ni u cui gn
cho kt ni i tng ca Bob, mi i tng cho mi thit b u cui. Khi mt trong nhng
thit b u cui tr li cuc gi th thit b u cui khc s b loi ra( trong gii hn ca m
hnh cuc gi ny, i tng kt ni u cui c t vo trong mt trng thi cm hot ng)

Hnh 6.5. M hnh Two alerting terminal calls.


Cuc gi 3 thnh vin:
Mt v d tiu biu cho cuc gi ba thnh vin l cuc gi hi ngh vi ba ngi tham gia c
th hin nh hnh 6.6. M hnh cuc gi l mt s m rng trc tip t m hnh cuc gi c bn

IT

vi hai ngi tham gia. M hnh n gin thm mt thnh vin th ba vi cc i tng kt ni,
a ch, kt ni u cui v thit b u cui cho ngi th ba tham gia.

Hnh 6.6. M hnh Third-party call.

PT

4. M hnh cuc gi Java


4.1. Nguyn tc
JTAPI l mt m hnh tru tng ha mc cao v c lp v cng ngh. N m t cuc gi
nh l mt tp hu hn trng thi my m phi tri qua trng thi chuyn tip khi cuc gi
c thc hin.
M hnh cuc gi c xy dng tng qut, bao trm nhiu kch bn cuc gi khc nhau. N c
th c m t bng v d chng hn :
Cuc gi gia hai i tc.
Nhiu cuc gi ng lot xy ra trn cng thit b u cui.
Mt cuc hi tho nhiu i tc.
Ci t cuc gi thng bo nhiu thit b u cui.
M hnh cuc gi m t vic gi cng nh nhng thnh phn tham gia cuc gi. Tt c n nh
ngha trong 5 lp c s. Hai lp m t nhng thnh phn tham gia cuc gi. Nhng i tng
duy tr v c lp ca cuc gi:
Mt ngi s dng (user) c i din bi mt i tng a ch (Address). Thuc tnh
chnh ca i tng a ch l nh danh ngi s dng (user identifier).
Mt in thoi u cui c i din cho bi i tng u cui (Terminal). Thuc tnh
chnh ca i tng thit b u cui l a ch ca thit b .
Ba lp khc m t mt cuc gi. Nhng i tng th hin ca cc lp ny khng duy tr m
c to ra ng trong khi cuc gi xy ra. Mi i tng bao gm mt trng thi my hu hn:
Mt i tng gi (Call) c to ra cho mi cuc gi.

PT

IT

Mt i tng kt ni (Connection) c to ra cho mi ngi s dng tham gia vo cuc


gi. N kt ni i tng a ch ca ngi s dng vi i tng gi.
Mt i tng kt ni u cui (TerminalConnection) c to ra cho mi thit b u
cui tham gia vo cuc gi. N kt ni i tng (Terminal) thit b u cui vi i
tng kt ni (Connection).
4.2. Cc i tng trong m hnh gi thoi java
Cc i tng trong m hnh gi thoi Java c th hin nh hnh 6.7.
i tng Provider: l mt s tru tng ca phn mm service-provider telephone.
Provider c th qun l kt ni gia PBX vi server, mt card telephony/fax trong my
desktop hoc mt cng ngh mng my tnh nh IP. Provider n tt c cc chi tit dch v
c th ca cc h thng con telephone v cho php ng dng Java hoc Applet tng tc
vi cc h thng con telephone trong c ch c lp thit b.

i tng Call: i tng ny th hin mt cuc gi in thoi l lung thng tin gia
ngi cung cp dch v v cc thnh vin ca cuc gi. Mt cuc gi in thoi bao gm
mt i tng Call v khng hoc nhiu kt ni. Trong kiu gi two-party gm mt i
tng Call v 2 kt ni, cn trong kiu hi tho th c 3 hoc nhiu hn s kt ni vi mt
i tng Call.
i tng Address: i tng ny biu din mt s in thoi. N l s tru tng i
vi mt im cui logic ca mt cuc gi in thoi. Trong thc t mt s in thoi c
th tng ng vi mt s im cui vt l.
i tng Connection: Mt i tng Connection m hnh ho lin kt truyn thng
gia i tng Call v i tng Address. i tng Connection c th trong mt trong
cc trng thi khc nhau ch th trng thi quan h hin thi gia Call v Address.

IT
PT

Hnh 6.7. M hnh cuc gi thoi Java

i tng Terminal: Biu din mt thit b vt l nh in thoi v cc thuc tnh gn


vi n. Mi i tng Terminal c mt hoc nhiu i tng Address( s in thoi) gn
kt vi n. Terminal cng c xem nh l im cui vt l ca mt cuc gi v n
tng ng vi mt phn cng vt l.
i t ng TerminalConnection: Th hi n m i quan h gi a m t k t n i v m t i m cu i
v t l c a m t cu c g i m
c bi u di n b i i t
ng Terminal. i tu ng ny
m t tr ng thi hi n th i c a m i quan h gi a i t
ng Connection v Terminal
c th .

4.3. Cc ph ng th c gi c t li JTAPI
Gi c t li c a JTAPI nh ngha 3 ph
ng th c h tr cc c tr ng c b n: Thi t t
m t cu c g i, tr l i cu c g i v hu k t n i c a m t cu c g i. Cc ph
ng th c
t
ng ng v i cc tc v ny l Call.connect(), TerminalConnection.answer(),
Connection.disconnect().

Ph ng th c Call.connect():Khi m t ng d ng c i t
ng r i( thu
c thng qua
ph
ng th c Provider.createCall()), n c th thi t l p m t cu c g i i n tho i

b ng cch s d ng ph
ng th c Call.connect(). ng d ng ph i ch ra ddoois t
ng
Terminal ngu n( i m cu i v t l) v i t
ng Address ngu n( i m cu i logic) trn
Terminal . N cng cung c p m t chu i s i n tho i ch. Hai i t
ng
Connection
c tr v t ph
ng th c Call.connect() bi u di n cc u cu i
ngu n v ch c a m t cu c g i i n tho i.
TerminalConnection.answer(): Khi m t cu c g i i t i m t Terminal, n s
c ch
th b i i t
ng TerminalConnection i v i Terminal trong tr ng thi RINGING.
T i th i i m , ng d ng s g i ph
ng th c TerminalConnection.answer()
tr l i cu c g i t i .
Connection.disconnect(): Ph
ng th c ny
c g i lo i b Address t m t cu c
tho i. i t
ng Connection bi u di n quan h i t
ng Address v i cu c g i
i n tho i. ng d ng s g i ph
ng th c ny khi i t
ng Connection ang
tr ng thi CONNECTED v tr v k t qu l i t
ng Connetction chuy n n
tr ng thi DISCONNECTED.

PT

IT

4.4. Nhng trng thi my hu hn


4.4.1.i tng cuc gi
Mi i tng cuc gi c to ra mi khi thc hin cuc gi. Trng thi ca i tng cuc
gi ph thuc vo m s ca i tng kt ni v n gm cc trng thi th hin nh hnh 6.8.

Hnh 6.8. i tng gi.


Trng thi nhn ri(IDLE): y l trng thi khi u cho mi cuc gi. Trong trng thi ny,
cuc gi khng c kt ni no.
Hot ng(Active):y trng thi khi mt cuc gi ang xy ra.Cc cuc gi vi mt hoc nhiu
kt ni u phi trong trng thi ny.
V hiu ha(Invalid):y l trng thi cui cng cho mi cuc gi. Cuc gi m mt tt c cc
i tng kt ni (thng qua mt s chuyn tip ca i tng kt ni vo trong kt ni - trng
thi ngng kt ni) s chuyn vo trong trng thi ny. Cc cuc gi khi trong trng thi ny s
khng c kt ni no v nhng i tng cuc gi ny c th khng c s dng cho bt k
hot ng no trong tng lai.
2.4.1. Cc trng thi i tng Connection

4.4.2. Cc tr ng thi i t ng Connection v i t ng TerminalConnection


L
c d ch chuy n tr ng thi c a i t
ng Connection c th
hnh 6.9. N g m cc tr ng thi sau:

c bi u di n nh

IDLE: y l tr ng thi kh i t o ban u c a t t c cc i t


ng Connection m i.
INPROGRESS: Ch th cu c g i i n tho i hi n th i thi t t t i i m cu i
ch.
ALERTING: Ch th pha ch c a cu c g i c nh bo m t cu c g i t i.
CONNECTED: Ch th tr ng thi wcj k t n i c a m t cu c i n tho i
DISCONNECTED: Ch th tr ng thi k t thc cu c g i.
FAILED: Ch th m t cu c g i thi t t t i i m cu i b l i, v d k t n i t i m t
pha ang b n.
UNKNOWN: Ch th r ng i t
ng Provider khng th xc nh
c it
ng
Connection t i th i i m hi n th i.

PT

IT

Hnh 6.9. L
c d ch chuy n tr ng thi c a Connection
4.4.3. Cc tr ng thi i t ng TerminalConnection
L
c d ch chuy n tr ng thi c a i t
ng TerminalConnection th hi n nh hnh 6.10.

IDLE: Tr ng thi kh i t o ban u c a m i i t


ng TerminalConnection
ACTIVE: Ch th Terminal l ph n kch ho t c a m t cu c g i i n tho i.
RINGING: Ch th r ng m t Terminal bo tn hi u cho ng
i s d ng c cu c g i
t i t i Terminal hi n th i.
DROPPED: Ch th tr ng thi b d t cu c g i
PASSIVE: Ch th tr ng thi khng kch ho t c a Terminal.
UNKNOWN: Ch th provider khng cho php xc nh tr ng thi hi n th i c a
TerminalConnection.

PT

IT

Hnh 6.10. L
c d ch chuy n tr ng thi c a TerminalConnection
4.5. Thi t t m t cu c g i i n tho i
Ph n ny s m t s thay i tr ng thi c a ton b m hnh g i ph i tr i qua khi thi t t
m t cu c g i i n tho i n gi n. Qu trnh ny c th
c th hi n b ng m t l
c
nh th i m hnh g i nh hnh 6.11.

Hnh 6.11. L
c nh th i m hnh cu c g i
Trong l
c trn, cc b
c th i gian r i r c b i cc s nguyn h
ng xu ng theo tr c tung.
L
c ny bi u di n m t cu c g i n gi n ki u two-party. L
c ny chia lm 2
ph n, n a tri v n a ph i. N a tri bi u di n i m cu i ngu n c a cu c g i v n a
ph i bi u di n i m cu i ch c a cu c g i.
II. CU HNH H THNG

PT

IT

JTAPI chy trn nhiu cu hnh h thng khc nhau, bao gm trung tm phc v v my tnh
mng t xa truy nhp ti nguyn in thoi qua mng. Trong cu hnh u tin, mt my tnh
mng ang chy ng dng JTAPI v ang truy nhp nhng ti nguyn in thoi qua mt mng
c minh ha trong hnh 6.12. Cu hnh th hai ng dng ang chy trn mt my tnh vi
nhng ti nguyn in thoi ring c minh ha trong hnh 6.13.
1. Cu hnh my tnh mng
Trong cu hnh ny, ng dng JTAPI hay Java applet chy trn mt trm t xa. Trm lm vic
ny c th l mt my tnh ni mng. N truy nhp ti nguyn mng, s dng mt trung tm
qun l k thut in thoi. JTAPI giao tip vi b phn phc v ny qua mt c ch truyn
thng t xa, nh RMI ca Java, JOE hay mt giao thc in thoi no . Cu hnh ny wcj
th hin nh hnh 6.10.

Hnh 6.12. Cu hnh my tnh mng

2. Cu hnh desktop
Trong cu hnh my bn, ng dng JTAPI hay Java applet chy trn cng trm lm vic.
Cu hnh desktop th hin nh hnh 6.13.

Hnh 6.13: Cu hnh My bn

III. MT S V D LP TRNH VI JTAPI

1. V d thit lp mt cuc gi in thoi s dng phng thc Call.connect()


import javax.telephony.*;
import javax.telephony.events.*;
/*
* The MyOutCallObserver class implements the CallObserver
* interface and receives all events associated with the Call.
*/
public class MyOutCallObserver implements CallObserver {
public void callChangedEvent(CallEv[] evlist) {
for (int i = 0; i < evlist.length; i++) {
if (evlist[i] instanceof ConnEv) {

PT

IT

String name = null;


try {
Connection connection = ((ConnEv)evlist[i]).getConnection();
Address addr = connection.getAddress();
name = addr.getName();
} catch (Exception excp) {
// Handle Exceptions
}
String msg = "Connection to Address: " + name + " is ";
if (evlist[i].getID() == ConnAlertingEv.ID) {
System.out.println(msg + "ALERTING");
}
else if (evlist[i].getID() == ConnInProgressEv.ID) {
System.out.println(msg + "INPROGRESS");
}
else if (evlist[i].getID() == ConnConnectedEv.ID) {
System.out.println(msg + "CONNECTED");
}
else if (evlist[i].getID() == ConnDisconnectedEv.ID) {
System.out.println(msg + "DISCONNECTED");
}

}
}
}
}

2. Thc hin cuc gi in thoi t mt s ti mt s


import javax.telephony.*;
import javax.telephony.events.*;

PT

IT

import MyOutCallObserver;
public class Outcall {
public static final void main(String args[]) {
/*
* Create a provider by first obtaining the default implementation of
* JTAPI and then the default provider of that implementation.
*/
Provider myprovider = null;
try {
JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
myprovider = peer.getProvider(null);
} catch (Exception excp) {
System.out.println("Can't get Provider: " + excp.toString());
System.exit(0);
}
/*
* We need to get the appropriate objects associated with the
* originating side of the telephone call. We ask the Address for a list
* of Terminals on it and arbitrarily choose one.
*/
Address origaddr = null;
Terminal origterm = null;
try {
origaddr = myprovider.getAddress("4761111");
/* Just get some Terminal on this Address */
Terminal[] terminals = origaddr.getTerminals();
if (terminals == null) {
System.out.println("No Terminals on Address.");
System.exit(0);
}
origterm = terminals[0];
} catch (Exception excp) {
// Handle exceptions;
}
/*
* Create the telephone call object and add an observer.
*/
Call mycall = null;
try {
mycall = myprovider.createCall();
mycall.addObserver(new MyOutCallObserver());
} catch (Exception excp) {
// Handle exceptions
}
/*
* Place the telephone call.
*/
try {
Connection c[] = mycall.connect(origterm, origaddr, "5551212");
} catch (Exception excp) {

// Handle all Exceptions


}
}
}

3. V d minh ho cuc gi in thoi ti


import javax.telephony.*;
import javax.telephony.events.*;
import javax.telephony.*;
import javax.telephony.events.*;
/*
* The MyInCallObserver class implements the CallObserver and
* recieves all Call-related events.
*/
public class MyInCallObserver implements CallObserver {

IT

public void callChangedEvent(CallEv[] evlist) {


TerminalConnection termconn;
String name;
for (int i = 0; i < evlist.length; i++) {

PT

if (evlist[i] instanceof TermConnEv) {


termconn = null;
name = null;

try {
TermConnEv tcev = (TermConnEv)evlist[i];
Terminal term = termconn.getTerminal();
termconn = tcev.getTerminalConnection();
name = term.getName();
} catch (Exception excp) {
// Handle exceptions.
}
String msg = "TerminalConnection to Terminal: " + name + " is ";
if (evlist[i].getID() == TermConnActiveEv.ID) {
System.out.println(msg + "ACTIVE");
}
else if (evlist[i].getID() == TermConnRingingEv.ID) {
System.out.println(msg + "RINGING");
/* Answer the telephone Call using "inner class" thread */
try {
final TerminalConnection _tc = termconn;
Runnable r = new Runnable() {
public void run(){
try{

_tc.answer();
} catch (Exception excp){
// handle answer exceptions
}
};
};
Thread T = new Thread(r);
T.start();
} catch (Exception excp) {
// Handle Exceptions;
}
} else if (evlist[i].getID() == TermConnDroppedEv.ID) {
System.out.println(msg + "DROPPED");
}
}
}

IT

}
}
import javax.telephony.*;
import javax.telephony.events.*;
import MyInCallObserver;

PT

/*
* Create a provider and monitor a particular terminal for an incoming call.
*/
public class Incall {
public static final void main(String args[]) {
/*
* Create a provider by first obtaining the default implementation of
* JTAPI and then the default provider of that implementation.
*/
Provider myprovider = null;
try {
JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
myprovider = peer.getProvider(null);
} catch (Exception excp) {
System.out.println("Can't get Provider: " + excp.toString());
System.exit(0);
}
/*
* Get the terminal we wish to monitor and add a call observer to that
* Terminal. This will place a call observer on all call which come to
* that terminal. We are assuming that Terminals are named after some
* primary telephone number on them.
*/
try {
Terminal terminal = myprovider.getTerminal("4761111");
terminal.addCallObserver(new MyInCallObserver());
} catch (Exception excp) {
System.out.println("Can't get Terminal: " + excp.toString());
System.exit(0);
}

}
}

4. V d xy dng dch v RAS vi th vin JTAPI

PT

IT

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import com.jpackages.jdun.*;
import javax.swing.border.*;
public class Do_an extends JFrame {
public class DialNotify implements DialingNotification {
// Phuong thuc goi lai
public void notifyDialingState(String name, int state, int error) {
// Hien thi y nghia cua trang thai quay so moi
System.out.println("Tien trinh - " + name + ": (" + state + ") " +
DialingState.getDialingStateString(state));
// Neu co loi thi hien thi y nghia cua ma loi
if (error != 0) {
System.out.println("Loi:"+error+""+
dum.getErrorMessageForCode(error));
}
}
}
// handle cho minh hoa ve quan ly quay so (DialUpManager)
DialUpManager dum;
// Minh hoa lop DialNotify (da dinh nghia o tren) ma co phuong thuc goi lai
DialNotify dnot = new DialNotify();
// Dinh nghia giao dien do hoa
JPanel contentPane;
BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JScrollPane jScrollPane1 = new JScrollPane();
DefaultListModel lm = new DefaultListModel();
JList jList1 = new JList(lm);
JPanel jPanel3 = new JPanel();
BorderLayout borderLayout2 = new BorderLayout();
JButton jButtonConnect = new JButton();
JButton jButtonDisconnect = new JButton();
BorderLayout borderLayout3 = new BorderLayout();
JPanel jPanel4 = new JPanel();
JLabel jLabel1 = new JLabel();
JButton jButtonRefresh = new JButton();
JPanel jPanel5 = new JPanel();
FlowLayout flowLayout1 = new FlowLayout();
JButton jButtonDelete = new JButton();
JButton jButtonRename = new JButton();
JPanel jPanel6 = new JPanel();

PT

IT

JCheckBox jCheckBox1 = new JCheckBox();


BorderLayout borderLayout4 = new BorderLayout();
JPanel jPanel9 = new JPanel();
JPanel jPanel7 = new JPanel();
JTextField jTextFieldUsername = new JTextField();
JLabel jLabel2 = new JLabel();
JPasswordField jPasswordField1 = new JPasswordField();
JPanel jPanel8 = new JPanel();
JLabel jLabel3 = new JLabel();
BorderLayout borderLayout5 = new BorderLayout();
BorderLayout borderLayout6 = new BorderLayout();
BorderLayout borderLayout7 = new BorderLayout();
JPanel jPanel10 = new JPanel();
JRadioButton jRadioButtonOverride = new JRadioButton();
JRadioButton jRadioButtonDefault = new JRadioButton();
JTextField jTextFieldPhoneNumber = new JTextField();
JLabel jLabel4 = new JLabel();
//Constructor
public Do_an() {
try {
// minh hoa lop quan ly quay so (DialUpManager)
dum = new DialUpManager(dnot);
}
catch (LibraryLoadFailedException e) {
if (e instanceof JDUNLibraryLoadFailedException)
System.out.println("Khong the tai duoc thu vien JDUN...");
else if (e instanceof RASLibraryLoadFailedException)
System.out.println("Khong the tai duoc thu vien RAS... ");
System.exit(0);
}
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
initialize();
}
catch(Exception e) {
e.printStackTrace();
}
}
// kich hoat kha nang ghi de username/password
public void enableParams(boolean b) {
this.jTextFieldUsername.setEnabled(b);
this.jTextFieldUsername.setEditable(b);
this.jPasswordField1.setEnabled(b);
this.jPasswordField1.setEditable(b);
}
// khoi tao he thong
public void initialize() {
this.enableParams(false);
System.out.println("Dang khoi tao...");

ButtonGroup bg = new ButtonGroup();


bg.add(this.jRadioButtonDefault);
bg.add(this.jRadioButtonOverride);
this.refreshList();

PT

IT

}
// Danh sach JList
public void refreshList() {
lm.clear();
try {
// Tim nap ten
String[] names = dum.getEntryNames();
for (int i=0; i < names.length; i++) {
lm.addElement(names[i]);
}
this.jList1.repaint();
}
catch (Exception e) {}
}
//Khoi tao cac thanh phan
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(500, 400));
this.setTitle("Chuong trinh minh hoa JDUNPhamHienTN2008@yahoo.com");
jPanel1.setLayout(borderLayout2);
jScrollPane1.setPreferredSize(new Dimension(660, 80));
jPanel1.setPreferredSize(new Dimension(260, 100));
jButtonConnect.setPreferredSize(new Dimension(105, 24));
jButtonConnect.setText("Ket noi");
jButtonConnect.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButtonConnect_actionPerformed(e);
}
});
jButtonDisconnect.setPreferredSize(new Dimension(105, 24));
jButtonDisconnect.setText("Ngat ket noi");
jButtonDisconnect.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButtonDisconnect_actionPerformed(e);
}
});
jPanel2.setLayout(borderLayout3);
jLabel1.setText("Nhap ten quay so");
jButtonRefresh.setPreferredSize(new Dimension(79, 24));
jButtonRefresh.setText("Lam lai");
jButtonRefresh.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButtonRefresh_actionPerformed(e);
}
});

PT

IT

jPanel5.setPreferredSize(new Dimension(70, 28));


jPanel5.setLayout(flowLayout1);
flowLayout1.setVgap(2);
jButtonDelete.setPreferredSize(new Dimension(60, 24));
jButtonDelete.setMargin(new Insets(0, 0, 0, 0));
jButtonDelete.setText("Xoa");
jButtonDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButtonDelete_actionPerformed(e);
}
});
jButtonRename.setPreferredSize(new Dimension(70, 24));
jButtonRename.setMargin(new Insets(0, 0, 0, 0));
jButtonRename.setText("Doi ten");
jButtonRename.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButtonRename_actionPerformed(e);
}
});
jPanel6.setBorder(BorderFactory.createEtchedBorder());
jPanel6.setLayout(borderLayout4);
jCheckBox1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jCheckBox1_actionPerformed(e);
}
});
jList1.addListSelectionListener(new
javax.swing.event.ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
jList1_valueChanged(e);
}
});
jTextFieldUsername.setPreferredSize(new Dimension(200, 24));
jLabel2.setPreferredSize(new Dimension(65, 17));
jLabel2.setText("Nguoi dung");
jPasswordField1.setPreferredSize(new Dimension(200, 24));
jLabel2.setPreferredSize(new Dimension(65, 17));
jLabel2.setText("Mat khau");
jPanel9.setLayout(borderLayout5);
jPanel8.setLayout(borderLayout7);
jPanel7.setLayout(borderLayout6);
jRadioButtonOverride.setText("Ghi de");
jRadioButtonOverride.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jRadioButtonOverride_actionPerformed(e);
}
});
jRadioButtonDefault.setSelected(true);
jRadioButtonDefault.setText("Mac dinh");

jRadioButtonDefault.addActionListener(new

java.awt.event.ActionListener()

PT

IT

public void actionPerformed(ActionEvent e) {


jRadioButtonDefault_actionPerformed(e);
}
});
jTextFieldPhoneNumber.setPreferredSize(new Dimension(120, 24));
jTextFieldPhoneNumber.setEditable(false);
jLabel3.setText("So dien thoai");
contentPane.add(jPanel1, BorderLayout.CENTER);
jPanel1.add(jScrollPane1, BorderLayout.CENTER);
jPanel1.add(jPanel3, BorderLayout.NORTH);
jPanel2.add(jPanel4, BorderLayout.CENTER);
jPanel3.add(jLabel1, null);
jPanel3.add(jButtonRefresh, null);
jPanel2.add(jPanel5, BorderLayout.SOUTH);
jPanel5.add(jButtonDelete, null);
jPanel5.add(jButtonRename, null);
jPanel1.add(jPanel6, BorderLayout.SOUTH);
jPanel6.add(jCheckBox1, BorderLayout.WEST);
jPanel6.add(jPanel9, BorderLayout.CENTER);
jPanel8.add(jLabel3, BorderLayout.WEST);
jPanel8.add(jPasswordField1, BorderLayout.CENTER);
jPanel9.add(jPanel8, BorderLayout.SOUTH);
jPanel9.add(jPanel7, BorderLayout.NORTH);
jPanel7.add(jLabel2, BorderLayout.WEST);
jPanel7.add(jTextFieldUsername, BorderLayout.CENTER);
jPanel6.add(jPanel10, BorderLayout.SOUTH);
jPanel10.add(jLabel4, null);
jPanel10.add(jRadioButtonDefault, null);
jPanel10.add(jRadioButtonOverride, null);
jPanel10.add(jTextFieldPhoneNumber, null);
jScrollPane1.getViewport().add(jList1, null);
contentPane.add(jPanel2, BorderLayout.SOUTH);
jPanel2.add(jButtonConnect, null);
jPanel2.add(jButtonDisconnect, null);
}
//Kha nang ghi de nho the ta co the thoat khi cua so duoc dong
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
// Cap nhat lai JList
void jButtonRefresh_actionPerformed(ActionEvent e) {
this.refreshList();
}
// Ket noi toi doi tuong da chon
void jButtonConnect_actionPerformed(ActionEvent e) {

PT

IT

String entryName = (String) this.jList1.getSelectedValue();


if (entryName == null)
return;
// Tim nap so dien thoai ghi de
String phonenum = null;
if (this.jRadioButtonOverride.isSelected()) {
phonenum = this.jTextFieldPhoneNumber.getText();
}
if (!jCheckBox1.isSelected()) {
// Quay so voi username/password mac dinh
if (phonenum == null) {
dum.dialEntryAsynchronous(entryName);
}
else {
dum.dialEntryAsynchronous(entryName, phonenum);
}
}
else {
// Lay username/password ghi de va su dung chung de quay so
String username = this.jTextFieldUsername.getText();
String password = new String(this.jPasswordField1.getPassword());
if (phonenum == null) {
dum.dialEntryAsynchronous(entryName, username, password);
}
else {
dum.dialEntryAsynchronous(entryName,username,password,"",phonenum);
}
}
}
// Ket thuc cuoc goi da chon
void jButtonDisconnect_actionPerformed(ActionEvent e) {
final String entryName = (String) this.jList1.getSelectedValue();
if (entryName == null)
return;
dum.hangUpEntry(entryName);
}
// Xoa doi tuong duoc chon
void jButtonDelete_actionPerformed(ActionEvent e) {
String entryName = (String) this.jList1.getSelectedValue();
if (entryName == null)
return;
// Xac nhan xoa
Int
eply=JOptionPane.showConfirmDialog(this,"Ban
co
chac
chan
muonxoa"+entryName+"khong?"Chuy...",JOptionPane.YES_NO_OPTION,JOptionPane.PLAI
N_MESSAGE);
if (reply == JOptionPane.NO_OPTION) {
return;
}
// Da xac nhan vi the xoa doi tuong
dum.deleteEntry(entryName);

// Cap nhat danh sach(JList) sau khi doi tuong da duoc xoa
this.refreshList();

PT

IT

}
// Doi ten doi tuong duoc chon
void jButtonRename_actionPerformed(ActionEvent e) {
String entryName = (String) this.jList1.getSelectedValue();
if (entryName == null)
return;
// Doi ten moi
String message = "Nhap ten moi '" + entryName + "'";
String newname = (String) JOptionPane.showInputDialog(this, message, "Doi
ten", JOptionPane.PLAIN_MESSAGE, null, null, entryName);
if (newname == null)
return;
if (newname.equals(entryName))
return;
// DOi ten bat ky doi tuong nao sang ten moi
dum.renameEntry(entryName, newname);
// Cap nhat lai danh sac (JList) sau khi doi tuong duoc chon da duoc doi
ten
this.refreshList();
}
void jCheckBox1_actionPerformed(ActionEvent e) {
if (jCheckBox1.isSelected())
this.enableParams(true);
else
this.enableParams(false);
}
// Khi mot danh sach cac lua chon duoc tao ra thi nap username/password
thich hop.
void jList1_valueChanged(ListSelectionEvent e) {
String entryName = (String) this.jList1.getSelectedValue();
if (entryName == null)
return;
// Tim nap username/password
String password = dum.getPassword(entryName);
String username = dum.getUsername(entryName);
// Hien thi username/password
this.jTextFieldUsername.setText(username);
this.jPasswordField1.setText(password);
// Tim nap cac thuoc tinh doi tuong
DialUpEntryProperties props = dum.getDialUpEntryProperties(entryName);
// Hien thi so dien thoai
if (props.getUseCountryAndAreaCodes()) {
String areacode = props.getAreaCode();
String phonenum = props.getLocalPhoneNumber();
this.jTextFieldPhoneNumber.setText(areacode + phonenum);
}
else {
this.jTextFieldPhoneNumber.setText(props.getLocalPhoneNumber());

PT

IT

}
}
void phoneButtonChange() {
if (this.jRadioButtonDefault.isSelected()) {
this.jTextFieldPhoneNumber.setEditable(false);
}
else {
this.jTextFieldPhoneNumber.setEditable(true);
}
}
void jRadioButtonDefault_actionPerformed(ActionEvent e) {
phoneButtonChange();
}
void jRadioButtonOverride_actionPerformed(ActionEvent e) {
phoneButtonChange();
}
//Phuong thuc chinh
public static void main(String[] args) {
Do_an frame = new Do_an();
//Can giua cho cua so
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width
-frameSize.width)
/
(screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
}
}

2,

V. KT LUN
Trong chng nay chng ta kho st gi th vin JTAPI v k thut lp trnh vi n. Qua
chng ny sinh vin nm c cu trc ca th vin JTAPI, cc khi nim, m hnh v cch ci
t chng trnh vi cc cuc gi in thoi n gin. Trn c s sinh vin c th pht trin
cc chng trnh ng dng thc t nh dch v truy cp t xa RAS, hi tho trc tuyn v cc
cng ngh lin qua n IP khc, nht l cc dch v trn h thng in thoi doanh nghip(ET:
Enterprise Telephony).

PHN IV. LP TRNH MNG AN TON BO MT


CHNG VII
LP TRNH MNG AN TON BO MT VI SSL
I. GII THIU SSL V MT S KHI NIM

1. Gii thiu SSL


SSL (Secure Socket Layer) l giao thc a mc ch c thit k to ra cc
giao tip gia hai chng trnh ng dng trn mt cng nh trc (socket 443)
nhm m ho ton b thng tin i/n, c s dng trong giao dch in t nh
truyn s liu th tn dng, mt khu, s b mt c nhn (PIN) trn Internet.
Trong cc giao dch in t trn mng v trong cc giao dch thanh ton trc tuyn,

IT

thng tin/d liu trn mi trng mng Internet khng an ton thng c bo
m bi c ch bo mt thc hin trn tng vn ti c tn Lp cng bo mt SSL
(Secure Socket Layer) - mt gii php k thut hin nay c s dng kh ph bin
trong cc h iu hnh mng my tnh trn Internet. Giao thc SSL c hnh
thnh v pht trin u tin nm 1994 bi nhm nghin cu Netscape dn dt bi

PT

Elgammal, v ngy nay tr thnh chun bo mt thc hnh trn mng Internet.
Phin bn SSL hin nay l 3.0 v vn ang tip tc c b sung v hon thin.
Tng t nh SSL, mt giao thc khc c tn l Cng ngh truyn thng ring t
PCT (Private Communication Technology) c xng bi Microsoft, hin nay
cng c s dng rng ri trong cc mng my tnh chy trn h iu hnh
Windows NT. Ngoi ra, mt chun ca Nhm c trch k thut Internet IETF
(Internet Engineering Task Force) c tn l Bo mt lp giao vn TLS (Transport
Layer Security) da trn SSL cng c hnh thnh v xut bn di khun kh
nghin cu ca IETF Internet Draft c tch hp v h tr trong sn phm ca
Netscape.
2. Kha Key
nh ngha kha

Kha (key) l mt thng tin quan trng dng m ha thng tin hoc gii m
thng tin b m ha. C th hiu nm na kha ging nh l mt khu(password).

di kha Key Length

di kha c tnh theo bit: 128 bits, 1024 bits hay 2048 bits,...
Kha cng di th cng kh ph. Chng hn nh kha RSA 1024 bits
ng ngha vi vic chn 1 trong 21024 kh nng.
Password v PassParse

Password v passparse gn ging nhau. Password khng bao gi ht


hn(expire). Passparse ch c hiu lc trong mt khong thi gian nht
nh c th l 5 nm, 10 nm hay ch l vi ba ngy. Sau thi gian ,
phi thay i li mt khu mi. Ni chung, mi th trong SSL nh
passparse, kha, giy chng nhn, ch k s (s ni sau), ... u ch c
thi hn s dng nht nh. Passparse c dng m (m ha/gii
m) kha ring.

IT

3. Thut ton m ha

PT

M ha (encrypt) v gii m (decrypt) thng tin dng cc hm ton hc t


bit. c bit n vi ci tn l thut ton m ha (cryptographic
algorithm) v thng c gi tt l cipher. Cc thut ton m ho v xc
thc ca SSL c s dng bao gm (phin bn 3.0):
(1) DES - Chun m ho d liu (ra i nm 1977), pht minh v s
dng ca chnh ph M.
(2) DSA - Thut ton ch k in t, chun xc thc in t, pht
minh v s dng ca chnh ph M.
(3) KEA - Thut ton trao i kho, pht minh v s dng ca chnh
ph M.
(4) MD5 - Thut ton to gi tr "bm" (message digest), pht minh
bi Rivest.
(5) RC2, RC4 - M ho Rivest, pht trin bi cng ty RSA Data
Security.
(6) RSA - Thut ton kho cng khai, cho m ho v xc thc, pht
trin bi Rivest, Shamir v Adleman.
(7) RSA key exchange - Thut ton trao i kho cho SSL da trn
thut ton RSA.

(8) SHA-1 - Thut ton hm bm an ton, pht trin v s dng bi


chnh ph M.
(9) SKIPJACK - Thut ton kho i xng phn loi c thc hin
trong phn cng Fortezza, s dng bi chnh ph M;
(10) Triple-DES - M ho DES ba ln.
Cc phng php m ha

C hai phng php m ha c s dng ph bin hin nay l m ha bng


kha i xng v m ha dng cp kha chung - kha ring..

PT

IT

M ha bng kha i xng (symmetric-key)

Hnh 7.1. M ho bng kho i xng


Kha dng m ha cng l kha dng gii m.
Mt khe h trong m ha i xng l bn phi chuyn kha cho ngi nhn h
c th gii m. Vic chuyn kha khng c m ha qua mng l mt iu cc k
mo him. Nh nh kha ny ri vo tay ngi khc th l h c th gii m c
thng tin m chuyn i. Phng php m ha bng kha chung - kha ring ra
i nhm gii quyt vn ny.
Thay v ch c mt kha duy nht dng chung cho m ha v gii m, s c mt
cp kha gm kha chung ch dng m ha v kha ring ch dng gii m.

Khi ngi A mun gi thng ip cho ngi B th ngi B cn bit kha chung
ca ngi A. (Kha ny c ngi A cng b cng khai). Ngi B m ha cc
thng tin gi n ngi A bng kha chung ca ngi A. Ch c ngi A mi c
kha ring gii m cc thng tin ny. Nh nh thng tin ny c ri vo tay
ngi khc th h cng khng th gii m c v ch c ngi A mi c kha
ring dnh cho vic gii m ng thng ip trn.

PT

IT

M ha dng c p kha chung kha ring

Hnh 7.2. M ho cng khai

4. C ch lm vic ca SSL SSL Protocol

im c bn ca SSL l c thit k c lp vi tng ng dng m bo tnh


b mt, an ton v chng gi mo lung thng tin qua Internet gia hai ng dng
bt k, th d nh webserver v cc trnh duyt (browser), do c s dng
rng ri trong nhiu ng dng khc nhau trn mi trng Internet. Ton b c ch
hot ng v h thng thut ton m ho s dng trong SSL c ph bin cng
khai, tr kha chia s tm thi c sinh ra ti thi im trao i gia hai ng
dng l to ngu nhin v b mt i vi ngi quan st trn mng my tnh. Ngoi
ra, giao thc SSL cn i hi ng dng ch phi c chng thc bi mt i
tng lp th ba (CA) thng qua chng ch in t (digital certificate) da trn
mt m cng khai (th d RSA).

Sau y ta xem xt mt cch khi qut c ch hot ng ca SSL phn tch cp


an ton ca n v cc kh nng p dng trong cc ng dng nhy cm, c bit
l cc ng dng v thng mi v thanh ton in t.
Giao thc SSL da trn hai nhm con giao thc l giao thc "bt tay" (handshake
protocol) v giao thc "bn ghi" (record protocol). Giao thc bt tay xc nh cc
tham s giao dch gia hai i tng c nhu cu trao i thng tin hoc d liu,
cn giao thc bn ghi xc nh khun dng cho tin hnh m ho v truyn tin hai
chiu gia hai i tng . Khi hai ng dng my tnh, th d gia mt trnh
duyt web v my ch web, lm vic vi nhau, my ch v my khch s trao i
"li cho" (hello) di dng cc thng ip cho nhau vi xut pht u tin ch
ng t my ch, ng thi xc nh cc chun v thut ton m ho v nn s liu
c th c p dng gia hai ng dng. Ngoi ra, cc ng dng cn trao i "s

IT

nhn dng/kho theo phin" (session ID, session key) duy nht cho ln lm vic
. Sau ng dng khch (trnh duyt) yu cu c chng ch in t (digital
certificate) xc thc ca ng dng ch (web server).

PT

Chng ch in t thng c xc nhn rng ri bi mt c quan trung gian


(Thm quyn xc nhn CA - Certificate Authority) nh RSA Data Sercurity hay
VeriSign Inc., mt dng t chc c lp, trung lp v c uy tn. Cc t chc ny
cung cp dch v "xc nhn" s nhn dng ca mt cng ty v pht hnh chng ch
duy nht cho cng ty nh l bng chng nhn dng (identity) cho cc giao dch
trn mng, y l cc my ch webserver.
Sau khi kim tra chng ch in t ca my ch (s dng thut ton mt m cng
khai, nh RSA ti trnh my trm), ng dng my trm s dng cc thng tin trong
chng ch in t m ho thng ip gi li my ch m ch c my ch c
th gii m. Trn c s , hai ng dng trao i kho chnh (master key) - kho b
mt hay kho i xng - lm c s cho vic m ho lung thng tin/d liu qua
li gia hai ng dng ch khch. Ton b cp bo mt v an ton ca thng
tin/d liu ph thuc vo mt s tham s:
(i) S nhn dng theo phin lm vic ngu nhin.
(ii) Cp bo mt ca cc thut ton bo mt p dng cho SSL.
(iii) di ca kho chnh (key length) s dng cho lc m ho thng tin.
5. Bo mt ca giao thc SSL

Mc bo mt ca SSL nh trn m t ph thuc chnh vo di kho hay ph


thuc vo vic s dng phin bn m ho 40 bits v 128bits. Phng php m ho
40 bits c s dng rng ri khng hn ch ngoi nc M v phin bn m ho
128 bits ch c s dng trong nc M v Canada. Theo lut php M, cc mt
m "mnh" c phn loi vo nhm "v kh" (weapon) v do khi s dng
ngoi M (coi nh l xut khu v kh) phi c php ca chnh ph M hay phi
c cp giy php ca B Quc phng M (DoD). y l mt li im cho qu
trnh thc hin cc dch v thng mi v thanh ton in t trong M v cc nc
ng minh phng Ty v l im bt li cho vic s dng cc sn phm cn c c
ch bo mt v an ton trong giao dch in t ni chung v thng mi in t ni
ring trong cc nc khc.
Cc phng thc tn cng (hay b kho) ca cc thut ton bo mt thng dng

IT

da trn phng php "tn cng vt cn" (brute-force attack) bng cch th-sai
min khng gian cc gi tr c th ca kho. S php th-sai tng ln khi di
kho tng v dn n vt qu kh nng v cng sut tnh ton, k c cc siu my

PT

tnh hin i nht. Th d, vi di kho l 40 bits, th s php th s l


240=1,099,511,627,776 t hp. Tuy nhin di kho ln ko theo tc tnh ton
gim (theo lu tha nghch o) v dn n kh c kh nng p dng trong thc
tin. Mt khi kho b ph, ton b thng tin giao dch trn mng s b kim sot
ton b. Tuy nhin do di kho ln (th d 128 bits, 256 bits), s php th-sai
tr nn "khng th thc hin" v phi mt hng nm hoc thm ch hng nghn nm
vi cng sut v nng lc tnh ton ca my tnh mnh nht hin nay.
Ngay t nm 1995, bn m ho 40 bits b ph bi s dng thut ton vt cn.
Ngoi ra, mt s thut ton bo mt (nh DES 56 bits, RC4, MD4,...) hin nay
cng b coi l khng an ton khi p dng mt s phng php v thut ton tn
cng c bit. c mt s ngh thay i trong lut php M nhm cho php s
dng rng ri cc phn mm m ho s dng m ho 56 bits song hin nay vn
cha c chp thun.
II. LP TRNH MNG AN TON BO MT VI SSL
1. Th vin java h tr lp trnh SSL

Hnh 7.3. Kin trc JDK


Java security bao gm tp hp rt nhiu APIs, cng c, v ci t ca cc thut

IT

ton bo mt thng dng (commonly-used security algorithms), cc c ch


(mechanisms) v cc giao thc (protocols). Java security APIs c s dng rng
ri. Bao gm m ha (cryptography), h tng kha chung (public key
infrastructure), trao i bo mt (secure communication), xc thc (authentication),

PT

v iu khin truy cp (access control). Bao gm rt nhiu lp th vin nh Java


Authentication and Authorization Service (JAAS), Java Cryptography Extension
(JCE), Java Secure Socket Extension (JSSE) Tuy nhin trong bo co ny ch tp
trung vo JSSE. V c th hn l JSSE h tr SSL. Cc gi th vin h tr lp
trnh vi SSL:

Gi javax.net.ssl (JSSE)
Gi javax.rmi.ssl (SSL/TLS-based RMI Socket Factories)

1.1. Lp SSL

truyn thng an ton, c 2 pha ca kt ni u phi s dng SSL. Trong java,


cc lp im cui ca kt ni l SSLSocket v SSLEngine. Hnh 7.4. cho thy cc lp
chnh c s dng to ra SSLSocket/SSLEngines.

IT

PT

Hnh 7.4. Cc lp java SSL


2. V d v s dng cc lp SSL

Chng trnh v d c m lnh cho php server v client c th xc thc nhau.


Mun vy th client phi c chng ch ca server ( thc t l mt tp (chain) chng
ch). Trng hp v d chng ch ca server l chng ch t k (self-certificate).
Sau khi chy chng trnh th tr ti n.
Sau khi nh lnh trn th s hin ra cc thng tin in vo nh mt khu, tn c
nhn, tn t chc, thnh ph,
Server source code (EchoServer.java)
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class EchoServer {
public
static
void
main(String[] arstring) {
try {

PT

IT

SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory)
SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket)
sslserversocketfactory.createServerSocket(9999);
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader
inputstreamreader
=
new
InputStreamReader(inputstream);
BufferedReader
bufferedreader
=
new
BufferedReader(inputstreamreader);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
System.out.println(string);
System.out.flush();
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
Client source code (EchoClient.java)
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
public class EchoClient {
public
static
void
main(String[] arstring) {
try {
SSLSocketFactory
sslsocketfactory
=
(SSLSocketFactory)
SSLSocketFactory.getDefault();
SSLSocket
sslsocket
=
(SSLSocket)
sslsocketfactory.createSocket("localhost", 9999);
InputStream inputstream = System.in;
InputStreamReader
inputstreamreader
=
new
InputStreamReader(inputstream);
BufferedReader
bufferedreader
=
new
BufferedReader(inputstreamreader);
OutputStream outputstream = sslsocket.getOutputStream();
OutputStreamWriter
outputstreamwriter
=
new
OutputStreamWriter(outputstream);
BufferedWriter
bufferedwriter
=
new
BufferedWriter(outputstreamwriter);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
bufferedwriter.write(string + '\n');

bufferedwriter.flush();
}
} catch (Exception exception) {
exception.printStackTrace();
}
}

PT

IT

Sau khi dch chy chng trnh , oc kt qu sau:

Gii thch:
-genkey: Lnh to key
-keystore mySrvKeystore: Tn key l mySrvKeystore
-keyalg RSA: Thut ton dng m ha l RSA
V phn ng dng qua giao din dng lnh th s dng chng trnh mu
ging nh trn. Chy nh sau:
To chng nhn:
keytool -genkey -keystore mySrvKeystore -keyalg RSA
Mt khu s in l 123456
Sau khi to xong chng ch th copy file key vo trong th mc cha file
Pha server th chng ch c lu trong keyStore
Chy chng trnh:
java
-Djavax.net.ssl.keyStore=mySrvKeystore
Djavax.net.ssl.keyStorePassword=123456 EchoServer

Pha Client th chng ch c lu trong trustStore


Chy chng trnh:
java
-Djavax.net.ssl.trustStore=mySrvKeystore
Djavax.net.ssl.trustStorePassword=123456 EchoClient

III. KT LUN
Chng ny bc u cp n vn lp trnh mng an ton bo mt m ch
yu vi SSL, l giao thc c s dng rng ri nht cho vic ci t m ho trong

PT

IT

Web. Vi cch tip cn ny, sinh vin c th t nghin cu khai thc cc k thut
lp trnh mng an ton bo mt khc nhau, khai thc cc h tr khc nhau ca cc
mi trng Java, .NET...(bo mt trong java, phng thc SOCKS, JCA, JCE...).

TI LIU THAM KHO


[1] Behrouz A Forouzan, TCP/IP protocol suite, McGraw-Hill , 2 edition (June 27, 2002)
[2] Elliotte Rusty Harold, Java Network Programming, 3rd Edition, Publisher: O'Reilly, 2004.
[3] Nguyn Hng Sn at. al., K thut in thoi qua IP v Internet, Nh XBXH, nm 2002.
[4] Nguyn Phng Lan at al., Gio trnh Java 1,2,3, NXB Minh Khai, Nm 2001
[5] Nguyn Hng Sn...K thut in thoi qua IP & Internet, NXB Lao ng X hi, 2002

PT

IT

[6] jtapi12-doc-html, Copyright 1996 Sun Microsystems, Inc

IT

PT

You might also like