You are on page 1of 201

B GIO DC V O TO

TRNG I HC K THUT CNG NGH TP HCM

GIO TRNH

LP TRNH MNG
Lu hnh ni b

Ths. VN THIN HONG

Thnh ph H Ch Minh 2009

MC LC
M U................................................................................................9 Chng 1 . TNG QUAN V LP TRNH MNG............................12
1.1 Chc nng ca mt chng trnh mng.........................................................12 1.2 Mng my tnh...............................................................................................12 1.3 M hnh phn tng.........................................................................................13 1.3.1 M hnh OSI...........................................................................................13 1.3.2 M hnh TCP/IP......................................................................................15 1.4 Cc giao thc mng.......................................................................................16 1.4.1 TCP-Transmission Control Protocol.......................................................16 1.4.2 UDP-User Datagram Protocol.................................................................17 1.4.3 IP-Internet Protocol ................................................................................19 1.5 M hnh khch/ch (client/server).................................................................22 1.6 Socket............................................................................................................22 1.7 Dch v tn min............................................................................................22 1.7.1 Cc server tn min.................................................................................23 1.7.2 Nslookup.................................................................................................24 1.8 Cc vn lin quan Internet.........................................................................25 1.8.1 Intranet v Extranet................................................................................25 1.8.2 Firewall...................................................................................................25 1.8.3 Proxy Server............................................................................................25 1.9 Bi tp............................................................................................................26

Chng 2 . NGN NG LP TRNH JAVA.......................................27


2.1 Gii thiu.......................................................................................................27 2.2 Mi trng lp trnh Java...............................................................................27 2.3 Mt s v d m u......................................................................................28 2.4 Cc thnh phn c bn ca ngn ng lp trnh Java......................................30 2.4.1 nh danh................................................................................................30

- ii -

2.4.2 Cc kiu d liu nguyn thy (primitive datatype)..................................30 2.4.3 Khai bo cc bin....................................................................................31 2.4.4 Cc cu lnh c bn.................................................................................32 2.5 Lp i tng................................................................................................37 2.5.1 C php nh ngha mt lp i tng....................................................37 2.5.2 C php nh ngha phng thc ...........................................................38 2.5.3 Hm khi to - Constructor.....................................................................38 2.5.4 Tham chiu this.......................................................................................40 2.5.5 Tha k ...................................................................................................40 2.5.6 T kha super..........................................................................................41 2.5.7 Truyn tham s trong Java......................................................................42 2.5.8 a hnh....................................................................................................42 2.5.9 Thnh phn tnh.......................................................................................43 2.5.10 Cc thnh phn hng (final)...................................................................45 2.6 Lp tru tng...............................................................................................46 2.7 Giao din (Interface).....................................................................................48 2.8 Gi (Package)................................................................................................50 2.9 Qun l ngoi l (Exception Handling)..........................................................51 2.9.1 Lnh kim sot ngoi l c bn...............................................................51 2.9.2 T chc lp biu din ngoi l................................................................53 2.9.3 Pht sinh ngoi l....................................................................................54 2.9.4 S lan truyn ngoi l..............................................................................59 2.9.5 Cc phng thc chnh ca lp Exception..............................................60 2.9.6 Lp ngoi l t nh ngha.......................................................................61 2.9.7 Overriding vi exception ........................................................................63 2.10 Bi tp..........................................................................................................64

Chng 3 . QUN L CC LUNG VO RA...................................66


3.1 Gii thiu.......................................................................................................66 3.2 Cc lung Byte...............................................................................................67

- iii -

3.2.1 Cc lung byte tng qut.........................................................................68 3.2.2 Cc lung c byte hin thc..................................................................69 3.2.3 Cc v d.................................................................................................71 3.3 Cc lung k t..............................................................................................75 3.3.1 Cc lung k t tng qut.......................................................................76 3.3.2 Cc lung k t hin thc........................................................................78 3.3.3 Cc v d.................................................................................................80 3.4 Cc lung lc d liu (Filter Stream).............................................................81 3.4.1 Cc lung lc tng qut...........................................................................82 3.4.2 Cc lung lc hin thc...........................................................................82 3.5 Cc lung m d liu...................................................................................84 3.6 Cc lp nh dng lung d liu nhp/xut....................................................88 3.7 Tun t ha i tng (object serialization)..................................................91 3.8 Lung vit i tng......................................................................................91 3.9 Bi tp ...........................................................................................................94

Chng 4 . LP TRNH A TUYN...................................................95


4.1 Gii thiu.......................................................................................................95 4.1.1 n tuyn trnh.......................................................................................95 4.1.2 a tin trnh.............................................................................................95 4.2 Tin trnh.......................................................................................................96 4.3 Lp Thread....................................................................................................96 4.4 Qun l Thread..............................................................................................97 4.4.1 To Thread..............................................................................................97 4.4.2 Chnh u tin......................................................................................98 4.4.3 Thc thi thread........................................................................................98 4.4.4 Dng thread.............................................................................................98 4.4.5 Mt s phng thc qun k khc ca lp Thread.................................99 4.5 Interface Runnable.........................................................................................99 4.6 ng b.......................................................................................................101

- iv -

4.6.1 ng b ha s dng cho phng thc.................................................101 4.6.2 Lnh synchronized................................................................................103 4.7 Trao i d liu gia cc thread...................................................................104 4.8 Nhm cc tuyn trnh ThreadGroup...........................................................105 4.8.1 To mt nhm tuyn trnh....................................................................106 4.8.2 S dng mt nhm tuyn trnh..............................................................106 4.8.3 Minh ha v lp ThreadGroup..............................................................107 4.9 Bi tp..........................................................................................................109

Chng 5 . QUN L A CH KT NI MNG VI CC LP INETADDRES, URL V URLCONNECTION.................................110


5.1 Lp InetAddress...........................................................................................110 5.1.1 To cc i tng InetAddress..............................................................111 5.1.2 Cc thao tc i d liu ca mt i tng InetAddress.......................112 5.1.3 Cc phng thc kim tra a ch IP ....................................................113 5.2 Lp URL......................................................................................................114 5.2.1 To cc URL.........................................................................................115 5.2.2 Nhn thng tin cc thnh phn ca URL...............................................116 5.2.3 Nhn d liu t my ch trong URL....................................................119 5.3 Lp URLConnection....................................................................................121

Chng 6 . LP TRNH SOCKET CHO THC TCP........................125


6.1 M hnh client/server...................................................................................125 6.2 M hnh truyn tin socket............................................................................126 6.3 TCP client - Socket ....................................................................................128 6.3.1 Cc hm khi to ca lp Socket..........................................................128 6.3.2 Cc phng thc phc v giao tip gia cc Socket.............................130 6.3.3 Cc phng thc ng Socket...............................................................131 6.3.4 Cc phng thc thit lp cc ty chn cho Socket..............................132 6.3.5 Mt s v d chng trnh client giao tip trn mt s dch v chun...133 6.4 Lp ServerSocket.........................................................................................133

-v-

6.4.1 Cc constructor......................................................................................134 6.4.2 Chp nhn v ngt lin kt....................................................................135 6.5 Cc bc ci t chng trnh pha Client bng Java..................................138 6.6 Cc bc ci t chng trnh Server bng Java.....................................140 6.7 ng dng a tuyn on trong lp trnh Java...............................................143 6.8 Kt lun........................................................................................................147

Chng 7 . LP TRNH NG DNG CHO GIAO THC UDP.......148


7.1 Tng quan v giao thc UDP.......................................................................148 7.1.1 Mt s thut ng UDP...........................................................................149 7.1.2 Hot ng ca giao thc UDP...............................................................151 7.1.3 Cc nhc im ca giao thc UDP......................................................151 7.1.4 Cc u im ca UDP...........................................................................152 7.1.5 Khi no th nn s dng UDP................................................................152 7.2 Lp DatagramPacket....................................................................................153 7.2.1 Cc constructor nhn datagram.........................................................154 7.2.2 Constructor gi cc datagram...........................................................155 7.2.3 Cc phng thc nhn cc thng tin t DatagramPacket......................156 7.3 Lp DatagramSocket...................................................................................158 7.4 Nhn cc gi tin ..........................................................................................159 7.5 Gi cc gi tin .............................................................................................160 7.6 V d minh ha giao thc UDP....................................................................161 7.7 Kt lun........................................................................................................171

Chng 8 . TUN T HA I TNG V NG DNG TRONG LP TRNH MNG............................................................................ 172


8.1 Tun t ha i tng..................................................................................172 8.1.1 Khi nim..............................................................................................172 8.1.2 1.2. Kh tun t (Serializable)...............................................................173 8.1.3 Xy dng lp mt lp kh tun t.........................................................174 8.1.4 C ch c v ghi i tng trn thit b lu tr ngoi.........................174

- vi -

8.2 Truyn cc i tng thng qua Socket.......................................................176 8.2.1 Lp Socket............................................................................................176 8.2.2 Lp ServerSocket..................................................................................176 8.2.3 Truyn v nhn d liu trong m hnh lp trnh Socket........................177 8.2.4 V d minh ha......................................................................................178 8.3 Truyn cc i tng thng qua giao thc UDP..........................................182 8.4 Kt lun........................................................................................................184

Chng 9 . PHN TN I TNG TRONG JAVA BNG RMI. 185


9.1 Tng quan....................................................................................................185 9.2 Mc ch ca RMI.......................................................................................186 9.3 Mt s thut ng .........................................................................................186 9.4 Cc lp trung gian Stub v Skeleton............................................................187 9.5 C ch hot ng ca RMI..........................................................................187 9.6 Kin trc RMI..............................................................................................191 9.7 Ci t chng trnh.....................................................................................192 9.7.1 Ci t chng trnh pha Server...........................................................193 9.8 Trin khai ng dng.....................................................................................195 9.9 Cc lp v cc giao tip trong gi java.rmi..................................................196 9.9.1 Giao tip Remote ..................................................................................196 9.9.2 Lp Naming..........................................................................................196 9.10 Cc lp v cc giao tip trong gi java.rmi.registry...................................197 9.10.1 Giao tip Registry...............................................................................198 9.10.2 Lp LocateRegistry.............................................................................198 9.11 Cc lp v cc giao tip trong gi java.rmi.server.....................................199 9.11.1 Lp RemoteObject..............................................................................199 9.11.2 Lp RemoteServer...............................................................................199 9.11.3 Lp UnicastRemoteObject.................................................................200 9.12 Kt lun......................................................................................................200

TI LIU THAM KHO...................................................................201

- vii -

- viii -

M U
Hin nay, mng my tnh l cng ngh ca ca thi i. Cc ng dng mng ng vai tr khng th thiu khai thc tim nng ca mng my tnh, t bit l mng Internet. Do vy, lp trnh mng l mn hc khng th thiu ca sinh vin ngnh cng ngh thng tin ni chung v sinh vin chuyn ngnh mng ni ring. Mc ch ca mn hc lp trnh mng l cung cp cho sinh vin bit kin thc mng lin quan cng nh c ch hot ng v kin trc ca cc phn mm mng. T , sinh vin hiu v bit cch vit cc chng trnh ng dng trong mt h thng mng quy m nh cng nh mng Internet. Java l ngn ng lp trnh hng i tng thun ty vi nhiu c trng u vit so vi cc ngn ng lp trnh hng i tng khc nh tnh c lp vi nn, tnh bo mt, Java cung cp b th vin h tr lp trnh mng n gin v rt hiu qu. Gio trnh ny c thit k cung cp cho sinh vin nhng kin c bn bit pht trin nhng ng dng theo m hnh khch/ch da vo TCP/IP Socket. ng thi, mt s kin thc h tr lp trnh phn tn cng c trang b. Gio trnh bao gm 10 chng: Chng 1: Gii thiu vai tr ca chng trnh mng, nhng khi nim cn bn v mng my tnh, cng nh kin thc lin quan ngi c c th tip cn vi cc chng tip theo. Chng 2: Gii thiu ngn ng lp trnh Java. Trnh by cc thnh phn c bn, cc th vin h tr c sn v cc c ch x l ngoi l. Sinh vin mi tip cn cng nh hc ngn ng lp trnh Java c th hc v n tp c th hiu v vit cc ng dng Java c bn. Chng 3: Cc lung vo ra. Chng ny gii thiu khi nim vo ra bng cc lung d liu. Trc tin ta s tm hiu v cc lung v ngha ca lung trong chng trnh Java. Tip n chng ta s ln lt tm hiu cc lung vo ra chun trong gi lm vic vi console. Cc lung tru tng java.io.InputStream, java.io.OutputStream l cc lung c bn t xy dng nn cc lung c th. Lung c chia thnh cc nhm nh lung byte v lung k t. T phin bn Java 1.4 mt c trng vo ra mi trong Java c a vo cng c gii thiu

-9-

trong chng ny. Vic nm vng kin thc chng ny cng gip cho vic lp trnh ng dng mng tr nn n gin hn v thc cht ca vic truyn v nhn d liu gia cc ng dng mng l vic c v ghi cc lung. Chng 4: Lp trnh a tuyn on. Trong cc ngn ng lp trnh trc y cc ng dng hu ht l cc ng dng n tuyn on. tng tc x l v gii quyt vn tng tranh ca cc ng dng ni chung v ng dng mng ni ring ta cn s dng khi nim a tuyn on. Phn u ca chng ny trnh by cc khi nim cn bn v tin trnh, tuyn on. Tip n chng ta s xem xt cc cch ci t mt ng dng tuyn on trong Java bng lp Thread v thc thi giao tip Runnable. Sau ta s i vo tm hiu cc phng thc ca lp Thread. S ng b ha v cch ci t mt chng trnh ng b ha cng c gii thiu trong chng ny. Chng 5: Lp trnh mng vi cc lp InetAddress, URL v URLConnection. Lp InetAddress l lp cn bn u tin trong lp trnh mng m ta cn tm hiu. N ch ra cch mt chng trnh Java tng tc vi h thng tn min. Tip n ta s i vo tm hiu cc khi nim v URI, URL,URN v lp biu din URL trong Java. Cch s dng URL ti v thng tin v tp tin t cc server. Sau ta i vo tm hiu lp URLConnection, lp ny ng vai tr nh mt ng c cho lp URL. Chng 6: Lp trnh Socket cho giao thc TCP. Trong chng ny chng ta s tm hiu cch lp trnh cho m hnh client/server v cc kiu kin trc client/server. Cc lp Socket v ServerSocket c trnh by chi tit trong chng ny lp cc chng trnh cho giao thc TCP. Chng 7: Lp trnh ng dng cho giao thc UDP. Chng ny gii thiu giao thc UDP v cc c trng ca giao thc ny. Tip n ta i vo tm hiu cc lp DatagramPacket v DatagramSocket vit cc chng trnh ng dng mng cho giao thc UDP. Chng 8: Tun t ha i tng v ng dng trong lp trnh mng. Trnh by cc vn v tun t ha v ng dng ca tun t ha trong lp trnh mng.

- 10 -

Chng 9: Phn tn i tng bng Java RMI. Chng ny tm hiu ch v lp trnh phn tn i tng bng k thut gi phng thc RMI (Remote Method Invocation).

- 11 -

CHNG 1 . TNG QUAN V LP TRNH MNG

Chng ny trnh by cc vn , cc khi nim c bn lin quan n lp trnh mng bng ngn ng Java bao gm: chc nng ca mt chng trnh mng, cc nh ngha v mng, m hnh phn tng TCP/IP, m hnh OSI, cc giao thc IP, TCP, UDP, m hnh khch /ch (Client/Server), Socket v mt s vn lin quan Internet khc.

1.1

Chc nng ca mt chng trnh mng

Cc chng trnh mng cho php ngi s dng khai thc thng tin c lu tr trn cc my tnh trong h thng mng (t bit cc chng trnh chy trn mng Internet vi hng triu my vi tnh c nh v khp ni trn th gii.), trao i thng tin gia cc my tnh trong h thng mng, cho php huy ng nhiu my tnh cng thc hin gii quyt mt bi ton hoc gim st hot ng mng. V d nh cc chng trnh cho php truy xut d liu. Cc chng trnh ny cho php my khch (client) truy xut d liu lu trn my ch (server) v nh dng d liu v trnh by ngi s dng. Cc chng trnh ny s dng cc giao thc chun nh HTTP (gi d liu Web), FTP (gi/nhn tp tin), SMTP (gi mail) hoc thit k nhng giao thc mi phc v cho vic truy xut d liu. Cc chng trnh ny hot ng theo m hnh Client/Server. Hoc chng trnh cho php ngi dng tng tc vi nhau nh Game online, Chat, ...

1.2

Mng my tnh

Mng my tnh l tp hp cc my tnh hoc cc thit b c ni vi nhau bi cc ng truyn vt l v theo mt kin trc no . Mng my tnh c th phn loi theo qui m nh sau: Mng LAN (Local Area Network)-mng cc b: kt ni cc nt trn mt phm vi gii hn. Phm vi ny c th l mt cng ty, hay mt ta nh. Mng WAN (Wide Area Network): nhiu mng LAN kt ni vi nhau to thnh mng WAN.

- 12 -

MAN (Metropolitan Area Network), tng t nh WAN, n cng kt ni nhiu mng LAN. Tuy nhin, mt mng MAN c phm vi l mt thnh ph hay mt th nh. MAN s dng cc mng tc cao kt ni cc mng LAN ca trng hc, chnh ph, cng ty, ..., bng cch s dng cc lin kt nhanh ti tng im nh cp quang.

Trong mt h thng mng, mng xng sng (Backbone) ng vai tr quan trng. Mng Backbone l mt mng tc cao kt ni cc mng c tc thp hn. Mt cng ty s dng mng Backbone kt ni cc mng LAN c tc thp hn. Mng Backbone Internet c xy dng bi cc mng tc cao kt ni cc mng tc cao. Nh cung cp Internet hoc kt ni trc tip vi mng backbone Internet, hoc mt nh cung cp ln hn.

1.3

M hnh phn tng Hot ng gi d liu i trong mt mng t my trm n my ch l ht sc phc

tp c mc vt l ln logic. Cc nhiu vn t ra nh vn bin i tn hiu s sang tn hiu tng t, trnh xung t gia cc gi tin (phn bit cc gi tin), pht hin v kim tra li gi tin, nh tuyn gi tin i ti ch, ... Nhm qun l c hot ng ny, cc hot ng giao tip mng lin quan c phn tch vo cc tng, hnh thnh m hnh phn tng. C hai dng m hnh phn tng ph bin: OSI, TCP/IP.

1.3.1 M hnh OSI


M OSI trnh by by tng rt thnh cng v n hin ang c s dng nh l mt m hnh tham chiu m t cc giao thc mng khc nhau v chc nng ca chng. Cc tng ca m hnh OSI phn chia cc nhim v c bn m cc giao thc mng phi thc hin, v m t cc ng dng mng c th truyn tin nh th no. Mi tng c mt mc ch c th v c kt ni vi cc tng ngay di v trn n. Tng ng dng (Application): nh ngha mt giao din lp trnh giao tip vi mng cho cc ng dng ngi dng, bao gm cc ng dng s dng cc tin ch mng. Cc ng dng ny c th thc hin cc tc v nh truyn tp tin, in n, email, duyt web,

- 13 -

My B My A
ng dng Cc giao thc giao tip gia cc my Trnh by Phin Vn chuyn Mng Lin kt Vt l Nt Mng Lin kt Vt l Nt Mng Lin kt Vt l Trnh by Phin Vn chuyn Mng Lin kt Vt l ng dng

Sub-net access protocols

Sub-net

Vng cc giao tip din ra trong cc Subnet

Tng trnh din (Presentation): c trch nhim m ha/gii m), nn/gii nn d liu t tng ng dng truyn i trn mng v ngc li.

Tng phin (Session): to ra mt lin kt o gia cc ng dng. V d cc giao thc FTP, HTTP, SMTP, ...

Tng giao vn (Transport): cho php truyn d liu vi tin cy cao chng hng gi tin gi i phi c xc thc hay c thng ip truyn li nu d liu b hng hay b tht lc, hay d liu b trng lp.

Tng mng (Network): cho php truy xut ti cc nt trong mng bng cch s dng a ch logic c s dng kt ni ti cc nt khc. Cc a ch MAC ca tng 2 ch c th c s dng trong mt mng LAN, nn a ch IP c s dng nh a ch ca tng 3 khi truy xut ti cc nt trong mng WAN. Cc router tng 3 c s dng nh ng i trong mng.

Tng lin kt d liu (Data Link): truy xut ti mt mng vt l bng cc a ch vt l. a ch MAC l a ch ca tng 2. Cc nt trn LAN gi thng ip cho nhau bng cch s dng cc a ch IP, v cc a ch ny phi c chuyn i

- 14 -

sang cc a MAC tng ng. Giao thc phn gii a ch (ARP: Address Resolution Protocol) chuyn i a ch IP thnh a ch MAC. Mt vng nh cache lu tr cc a ch MAC tng tc x l ny, v c th kim tra bng tin ch arp -a, Cui cng, tng vt l (Physical): bao gm mi trng vt l nh cc yu cu v cp ni, cc thit b kt ni, cc c t giao tip, hub v cc repeater,...

1.3.2 M hnh TCP/IP


M hnh ISO phc tp nn t c s dng nhiu trong thc t. M hnh TCP/IP n gin v thch hp c s dng cho mng Internet. M hnh ny gm c bn tng. Tng ng dng: cc phn mm ng dng mng nh trnh duyt Web (IE, Firefox, ..), game online, chat, ... s dng cc giao thc nh HTTP (web), SMTP, POP, IMAP (email), FTP, FSP, TFTP (chuyn ti tp tin), NFS (truy cp tp tin), ... Tng vn chuyn: m bo vn chuyn gi tin tin cy bng cch s dng giao thc TCP hoc UDP. Tng Internet: cho php nh tuyn gi gi tin ti ch trn mng bng cch s dng giao thc IP. Tng Host to Network: vn chuyn d liu thng qua thit b vt l nh dy cp quang n tn Host to Network ca h thng xa.
Tng ng dng Tng vn chuyn Tng Internet Tng ng dng Tng vn chuyn Tng Internet

Tng Host to Network ng dn vt l

- 15 -

1.4

Cc giao thc mng Cc giao thc biu din khun dng thng tin d liu ti mi mc giao tip trong

mng. Giao thc thng c phn loi theo mc p dng ti mi tng trong cc m hnh mng. Trong mi loi giao thc c phn loi da vo s phn tng, giao thc li c phn loi da vo chc nng. V d giao thc tng phin trong m hnh OSI, gm HTTP (web), SMTP, POP, IMAP (email), FTP, FSP, TFTP (chuyn ti tp tin), NFS (truy cp tp tin), ...

1.4.1 TCP-Transmission Control Protocol


Giao thc TCP c s dng tng vn chuyn (OSI) m bo cho d liu gi i tin cy v xc thc gia cc nt mng. Giao thc TCP phn chia d liu thnh cc gi tin gi l datagram. TCP gn thm trng header vo datagram. Trng head c m t trong hnh v bn di.
Source port Sequence Number Acknowledge Number Offset Reserved Checksum Options Start of Data Flags Window Urgent pointer Padding Destination port

Bng 1-1 Minh ha cu ca thng tin header ca TCP

Trng Cng ngun (source port) Cng ch (destination port) S th t (Sequence Number) S hiu cng ca ngun S hiu cng ch

M t

S th t c to ra bi ngun v c s dng bi ch sp xp li cc gi tin to ra thng ip ban u, v gi xc thc ti ngun. Cho bit d liu c nhn thnh cng. Cc chi tit v ni d liu gi tin bt u D phng ch ra rng gi tin cui cng hoc gi khn cp ch ra kch thc ca vng m nhn. Pha nhn c th thng bo cho pha gi kch thc d liu ti a m c th c gi i bng cch s dng cc thng ip xc thc

Acknowledge Number Data offset Reserved Flags Window

- 16 -

Checksum Urgent Pointer Options Padding

xc nh xem gi tin c b hng khng thng bo cho pha nhn bit c d liu khn vng d phng cho vic thit lp trong tng lai ch ra rng d liu kt thc trong vng 32 bit.

1.4.2 UDP-User Datagram Protocol


Giao thc UDP ny c s dng tng giao vn (OSI) thc hin c ch khng lin kt. N khng cung cp dch v tin cy nh TCP. UDP s dng IP pht tn cc gi tin ny. Nhc im ca UDP l: Cc thng ip c th c nhn theo bt k th t no. Thng ip c gi u tin c th c nhn sau cng. Khng c g m bo l cc gi tin s n ch, v cc thng ip c th b tht lc, hoc thm ch c th nhn c hai bn sao ca cng mt thng ip. u im ca UDP l: UDP mt giao thc c tc truyn tin nhanh v n ch xc nh c ch ti thiu truyn d liu. C th trong cch thc truyn tin unicast, broadcast v multicast. Mt thng ip unicast c gi t nt ny ti nt khc. Kiu truyn tin l truyn tin im-im. Giao thc TCP ch h tr truyn tin unicast. Truyn tin broadcast ngha l mt thng ip c th c gi ti tt c cc nt trong mt mng. Multicast cho php cc thng ip c truyn ti mt nhm cc nt c la chn. UDP c th c s dng cho truyn tin unicast nu cn ti tc truyn tin nhanh, nh truyn tin a phng tin, nhng u im chnh ca UDP l truyn tin broadcast v truyn tin multicast. V nu dng giao thc TCP th tt c cc nt gi v cc xc thc cho server s lm cho server qu ti.
Bng 1-2 Cu trc trng Header ca UDP

Trng thng tin Source port (Cng ngun)

M t Xc nh cng ngun l mt ty chn vi UDP. Nu trng ny c s dng, pha nhn thng ip c th gi mt phc p ti cng ny S hiu cng ch

Destination Port

- 17 -

Length Checksum

Chiu di ca thng ip bao gm header v d liu kim tra tnh ng n

S hiu cng

Cc s hiu cng ca TCP v UDP c phn thnh ba loi - Cc s hiu cng h thng - Cc s hiu cng ngi dng - Cc s hiu cng ring v ng Cc s hiu cng h thng nm trong khong t 0 n 1023. Cc cng h thng ch c s dng bi cc tin trnh c quyn u tin ca h thng. Cc giao thc ni ting c cc s hiu cng nm trong khong ny. Cc s hiu cng ngi dng nm trong khong t 1024 n 49151. Cc ng dng server ca bn s nhn mt trong cc s ny lm cng, hoc bn c th ng k s hiu cng vi IANA .

Hnh 1-1 Minh ha lnh netsta xem thng tin cc cng ang s dng

Cc cng ng nm trong khong t 49152 n 65535. Khi khng cn thit phi bit s hiu cng trc khi khi ng mt ng dng, mt s hiu cng trong khong ny s l thch hp. Cc ng dng client kt ni ti server c th s dng mt cng nh vy.

- 18 -

Nu chng ta s dng tin ch netstat vi ty chn a, chng ta s thy mt danh sch tt c cc cng hin ang c s dng, n cng ch ra trng thi ca lin kt-n ang nm trong trng thi lng nghe hay lin kt c thit lp.

1.4.3 IP-Internet Protocol


Giao thc IP c thit k nh tuyn truyn gi tin trong mng t nt ngun ti nt ch. Mi nt c nh danh bi mt a ch IP (32 bit). Khi nhn gi d liu tng trn (nh theo khun dng TCP hoc UDP), giao thc IP s thm vo trng header cha thng tin ca nt ch.
Version IHL Identification Time to Live Protocol TCP Header Start of Data TOS Flags Total length Fragmentation Offset Header Checksum

Bng 1-3 Thng tin chi tit ca cu trc header ca giao thc IP

Trng Version (Phin bn IP) IP Header Length (Chiu di Chiu di ca header. Header) Type of Service (Kiu dch v)

M t Phin bn IP. ( Phin bn giao thc hin nay l IPv4)

Kiu dch v cho php mt thng ip c t ch thng lng cao hay bnh thng, thi gian tr l bnh thng hay lu, tin cy bnh thng hay cao. iu ny c li cho cc gi c gi i trn mng. Mt s kiu mng s dng thng tin ny xc nh u tin Hai byte xc nh tng chiu di ca thng ip-header v d liu. Kch thc ti a ca mt gi tin IP l 65,535, nhng iu ny l khng thc t i vi cc mng hin nay. Kch thc ln nht c chp nhn bi cc host l 576 bytes. Cc thng ip ln c th phn thnh cc on-qu trnh ny c gi l qu trnh phn on Nu thng ip c phn on, trng nh danh tr gip cho vic lp rp cc on thnh mt thng ip. Nu mt thng ip c phn thnh nhiu on, tt c cc on ca mt thng ip c cng mt s nh danh. Cc c ny ch ra rng thng ip c c phn on hay khng, v liu gi tin hin thi c phi l on cui cng ca thng ip hay khng. 13 bit ny xc nh offset ca mt thng ip. Cc on c th n theo mt th t khc vi khi gi, v vy trng offset l cn thit

Total Length (Tng chiu di)

Identification (nh danh)

Flags

Fragment Offset

- 19 -

xy dng li d liu ban u. on u tin ca mt thng ip c offset l 0 Time to Live Protocol Header Checksum Source Address Destination Address Options Padding Xc nh s giy m mt thng ip tn ti trc khi n b loi b. Byte ny ch ra giao thc c s dng mc tip theo cho thng ip ny. Cc s giao thc y l ch l checksum ca header. Bi v header thay i vi tng thng ip m n chuyn ti, checksum cng thay i. Cho bit a ch IP 32 bit ca pha gi a ch IP 32 bit ca pha nhn

a ch IP IPv4-32 bit c dng nh danh mi nt trn mng TCP/IP. Thng thng mt

a ch IP c biu din bi bn phn x.x.x.x, chng hn 192.168.0.1 . Mi phn l mt s c gi tr t 0 n 255. Mt a ch IP gm hai phn: phn mng v phn host.
Bng 1-4 Minh ha phn loi a ch lp mng

Lp A (0) B (10) C (110)

Byte 1 Networks (1-126) Networks (128-191) Networks (192-223)

Byte 2 Host (0-255) Networks (0-255) Networks (0-255)

Byte 3 Host (0-255) Host (0-255) Networks (0-255)

Byte 4 Host (0-255) Host (0-255) Host (0-255)

Trong a ch lp D(1110) c s dng cho a ch multicast. a ch d phng (01111111). a ch 127.0.0.1 l a ch ca localhost, v a ch 127.0.0.0 l a ch loopback. trnh cn kit cc a ch IP, cc host khng c kt ni trc tip vi Internet c th s dng mt a ch trong cc khong a ch ring. Cc a ch IP ring khng duy nht v tng th, m ch duy nht v mt cc b trong phm vi mng . Tt c cc lp mng d tr cc khong nht nh s dng nh l cc a ch ring cho cc host khng cn truy cp trc tip ti Internet. Cc host nh vy vn c th truy cp Internet thng qua mt gateway m khng cn chuyn tip cc a ch IP ring.
Lp A 10 Khong a ch ring

- 20 -

B C

172.16-172.31 192.168.0-192.168.255

IPv6 c s dng 128 bit biu din a ch nhm biu din nhiu hn s a ch ca nt trn mng.
Lp Cu trc a ch IP 0| netid| hostid 1|0| netid| hostid 1|1|0| netid| hostid 1|1|1|0| a ch multicast 1|1|1|1 Format S bit mng/s bit host 7/24 14/16 Tng s mng/lp 27-2=126 2142=16382 2222=4194302 Tng s host/mng 2242=17.777.214 216-2=65.643 28-2=245 Vng a ch IP

A B C D

N.H.H.H N.N.H.H

1.0.0.1126.0.0.0 128.1.0.0191.254.0.0 192.0.1.0223.255.254.0 224.0.0.0239.255.255.255 240.0.0.0254.255.255.255 127.x.x.x

N.N.N.H 22/8 -

E Loopback

Cc subnet Vic kt ni hai nt ca hai mng khc nhau cn c mt router. nh danh host ca

mng lp A cn c 24 bit; trong khi mng lp C, ch c 8 bit. cp pht a ch IP cho cc mng khc nhau mt cch hiu qu v d qun l, mt k thut c c s dng gi l subnet. Subnet s vay mn mt s bit ca hostid lm subnet mask(mt n mng). - Subnet mask c tt c cc bit network v subnet u bng 1, cc bit host u bng 0 - Tt c cc my trn cng mt mng phi c cng mt subnet mask - phn bit c cc subnet (mng con) khc nhau, b nh tuyn dng php logic AND V d: a ch lp mng lp B 128.10.0.0 c th dng 8 bit u tin ca hostid subnet: Subnet mask = 255.255.255.0
Network 11111111 Network 11111111 Subnet 11111111 Host 00000000

- 21 -

255

255

255

Nh vy, s bit dnh cho subnet s l 8 -> c tt c 28-2=254 subnet (mng con). a ch ca cc subnet ln lt l 128.10.0.1, 128.10.0.2, 128.10.0.3, ..., 128.10.0.245. 8 bit dnh cho host nn mi subnet s c 28-2=254 host, a ch ca cc host ln lt l 128.10.xxx.1, 128.10.xxx.2, 128.10.xxx.3, ..., 128.10.xxx.254

1.5

M hnh khch/ch (client/server) Hu ht cc chng trnh mng hin ny s dng theo m hnh client/server. Mt

chng trnh chy my ch-server mnh, qun l mt lng d liu ln. Mt chng trnh chy my khch-client (my tnh c nhn) thc hin khai thc d liu my ch. Trong hu ht trng hp, my ch gi d liu, my khch nhn d liu. Thng thng, client s thit lp cuc giao tip, v server s i yu cu thit lp t client v giao tip vi n.

1.6

Socket Socket l biu din tru tng ha mt c ch kt ni gia hai ng dng trn hai

my bng cch s dng kt hp a ch IP v s hiu cng. N cho php cc ng dng gi v nhn d liu cho nhau. C client v server u s dng socket giao tip vi nhau. Trong ngn ng Java, mt socket c biu din bng mt i tng ca mt trong cc lp java.net nh Socket, ServerSocket, DatagramSocket hoc MulticastSocket.

1.7

Dch v tn min a ch IP c vit di dng 4 nhm con s nn ngi s dng rt kh nh. V

vy h thng tn min c s dng h tr cho ngi s dng. Cc my tnh chuyn dng lu tr v phn gii tn min bng cch lu danh sch a ch IP v tn min c gi l My ch DNS. V d www.microsoft.com, www.bbc.co.uk. Cc tn ny khng bt buc phi c ba phn, nhng vic c bt u t phi sang tri, tn bt u vi min mc cao. Cc min mc cao l cc tn nc c th hoc tn cc t chc v c nh ngha bi t chc IANA. Cc tn min cp cao c lit k trong bng sau. Trong nhng nm gn y, mt s tn min cp cao mi c a vo.

- 22 -

Bng 1-5 Mt s tn min cao cp

Tn min .aero .biz .com .coop .info .museum .name Doanh nghip Cc t chc thng mi Cc quan h hp tc

M t Cng nghip hng khng

Khng rng buc v s dng Cc vin bo tng Cc tn c nhn


Bng 1-6 Mt s tn min cao cp khc

Tn min .net .org .pro .gov .edu .mil .int Cc mng

M t Cc t chc phi chnh ph Cc chuyn gia Chnh ph Hoa K Cc t chc gio dc Qun i M Cc t chc c thnh lp bi cc hip c quc t gia cc chnh ph.
Bng 1-7 Tn min quc gia

Tn min .at .de .fr .uk .vn Autralia Germany France United Kingdom Vietnam

M t

1.7.1 Cc server tn min


Cc hostname c phn gii bng cch s dng cc server DNS (Domain Name Service). Cc server ny c mt c s d liu cc hostname v cc b danh nh x cc tn thnh a ch IP. Ngoi ra, cc DNS cng ng k thng tin cho cc Mail Server, cc s ISDN, cc tn hm th, v cc dch v.

- 23 -

Trong Windows, chnh cc thit lp TCP/IP xc nh server DNS c s dng truy vn. Lnh ipconfig/all ch ra cc server DNS c thit lp v cc thit lp cu hnh khc. Khi kt ni vi mt h thng xa s dng hostname, trc tin server DNS c truy vn tm a ch IP. Trc tin, DNS kim tra trong b c s d liu ca ring n v b nh cache. Nu tht bi trong vic phn gii tn, server DNS truy vn server DNS gc.

1.7.2 Nslookup
Dch v tn min (Domain Name Service) L tp hp nhiu my tnh c lin kt vi nhau v phn b rng trn mng Internet. Cc my tnh ny c gi l name server. Chng cung cp cho ngi dng tn, a ch IP ca bt k my tnh no ni vo mng Internet hoc tm ra nhng name server c kh nng cung cp thng tin ny.

Hnh 1-2 Minh ha dng lnh nslookup tm a ch IP

C ch truy tm a ch IP thng qua dch v DNS Gi s trnh duyt cn tm tp tin hay trang Web ca mt my ch no , khi c ch truy tm a ch s din ra nh sau: 1. Trnh duyt yu cu h iu hnh trn client chuyn hostname thnh a ch IP. 2. Client truy tm xem hostname c c nh x trong tp tin localhost, hosts hay khng? a. Nu c client chuyn i hostname thnh a ch IP v gi v cho trnh duyt. b. Nu khng client s tm cch lin lc vi my ch DNS.

- 24 -

3. Nu tm thy a ch IP ca hostname my ch DNS s gi a ch IP cho client. 4. Client gi a ch IP cho trnh duyt. 5. Trnh duyt s dng a ch IP lin lc vi Server. 6. Qu trnh kt ni thnh cng. My ch gi thng tin cho client.

1.8

Cc vn lin quan Internet

1.8.1 Intranet v Extranet


Mt intranet c th s dng cc cng ngh TCP/IP tng t nh vi Internet. S khc bit l intranet l mt mng ring, trong tt c mi ngi u bit nhau. Intranet khng phc v cho vic truy xut chung, v mt s d liu cn phi c bo v khi nhng truy xut t bn ngoi. Mt extranet l mt mng ring ging nh intranet nhng cc extranet kt ni nhiu Intranet thuc cng mt cng ty hoc cc cng ty i tc thng qua Internet bng cch s dng mt tunnel. Vic to ra mt mng ring o trn Internet tit kim chi ph nhiu cho cng ty so vi vic thu ring mt ng truyn thit lp mng.

1.8.2 Firewall
C nhng k ph hoi trn mng Internet!. ngn chn chng, ngi ta thng thit lp cc im truy cp ti mt mng cc b v kim tra tt c cc lung truyn tin vo v ra khi im truy nhp . Phn cng v phn mm gia mng Internet v mng cc b, kim tra tt c d liu vo v ra, c gi l firewall. Firewall n gin nht l mt b lc gi tin kim tra tng gi tin vo v ra khi mng, v s dng mt tp hp cc quy tc kim tra xem lung truyn tin c c php vo ra khi mng hay khng. K thut lc gi tin thng da trn cc a ch mng v cc s hiu cng.

1.8.3 Proxy Server


Khi nim proxy c lin quan n firewall. Mt firewall ngn chn cc host trn mng lin kt trc tip vi th gii bn ngoi. Mt my b ngn kt ni vi th gii bn ngoi bi mt firewall s yu cu truy xut ti mt trang web t mt proxy server cc b, thay v yu cu mt trang web trc tip t web server xa. Proxy server sau s yu cu trang web t mt web server, v sau chuyn kt qu tr li cho bn yu cu ban u.

- 25 -

Cc proxies cng c s dng cho FTP v cc dch v khc. Mt trong nhng u im bo mt ca vic s dng proxy server l cc host bn ngoi ch nhn thy proxy server. Chng khng bit c cc tn v cc a ch IP ca cc my bn trong, v vy kh c th t nhp vo cc h thng bn trong. Trong khi cc firewall hot ng tng giao vn v tng internet, cc proxy server hot ng tng ng dng. Mt proxy server c nhng hiu bit chi tit v mt s giao thc mc ng dng, nh HTTP v FTP. Cc gi tin i qua proxy server c th c kim tra m bo rng chng cha cc d liu thch hp cho kiu gi tin. V d, cc gi tin FTP cha cc d liu ca dch v telnet s b loi b. V tt c cc truy nhp ti Internet c chuyn hng thng qua proxy server, v th vic truy xut c th c kim sot cht ch. V d, mt cng ty c th chn gii php phong ta vic truy xut ti www.playboy.com nhng cho php truy xut ti www.microsoft.com

1.9
1. OSI. 2.

Bi tp Tm hiu cc giao thc chun ha ph bin khc cc tng khc nhau ca m hnh Tm hiu cc giao thc c s dng ph bin trong cc ng dng trn mng

Internet. Cho bit s hiu cng ca cc ng dng ny. Lit k cc ng dng thc t s dng giao thc ny. Lit k cc phn mm ngun m ang pht trin s dng cc giao thc ny.

- 26 -

CHNG 2 . NGN NG LP TRNH JAVA

2.1

Gii thiu Ngn ng lp trnh Java c pht trin b Sun Microsystems vo nm 1991 nh

mt phn ca d n xanh. Mt thnh vin ca d n l Jame Gosling khng nh gi cao ngn ng lp trnh C++ v a ra mt ngn ng mi t tn l Oak. Sau , Sun i tn li l Java. Java c chnh thc cng b nm 1995 v ngay lp tc to ln mt tro lu mi trn ton th gii v t n nay vn to c sc cun ht mnh m. Java l ngn ng lp trnh thun hng i tng v n cung cp nhng c trng mnh m cho lp trnh mng (lp trnh Internet). u im ca ngn ng lp trnh java th hin qua kin trc v b th vin rt ln.

2.2

Mi trng lp trnh Java vit mt ng dng java v chy c, mi trng lp trnh yu cu cn c b

cng c JDK. B cng c ny c th download ti website ca Sum (java.sun.com). B cng c ny cha trnh bin dch, trnh thng dch, trnh g ri v tt c th vin c sn h tr cho lp trnh. Trong , c 2 tp tin chnh ca vic lp trnh java l javac.exe l trnh bin dch tp tin *.java thnh m trung gian *.class. java.exe l trnh thng dch (thnh phn my o) thng dch chy tp tin *.class
Chng trnh (*.java) javac.exe : compiler Dng c ch Just-InJava Bytecode (file.class) JVM (java.exe) platform OS Hardware Time thng dch bytecode thnh lnh my c th

- 27 -

son tho cu lnh, mt trnh son tho vn bn bt k u c th s dng nh Notepad, Notepad++, Editplus, Jcreator hoc s dng mi trng tch hp IDE nh NetBean.

2.3

Mt s v d m u

V d 1: To chng trnh Java cho php nhp mt dng k t t i dng lnh v hin th xu k t ln trn mn hnh:
class { public static void main(String[] args) { System.out.println(args[0]); } } Hello

Bin dch chng trnh


C:\>javac Hello.java

Thc hin chng trnh


C:\>java Hello "Chao ngon ngu lap trinh Java"

Kt qu in ra l:
Chao ngon ngu lap trinh Java

V d 2: To mt applet hin th mt xu k t ln mn hnh


import java.applet.*; import java.awt.*; public class { public void paint(Graphics g) { g.drawString("Hello applet",30,30); } } HelloApplet extends Applet

Bin dch applet


C:\>javac HelloApplet.java

To mt trang VDApplet.html nhng applet

- 28 -

<html> <head> </head> <body bgcolor="#f0f0f0"> <center> <applet code = "HelloApplet.class" width = "500" height </applet> </center> </body> </html> = "300" >

Thc thi applet bng cch m tp tin VDApplet.html trong trnh duyt. Kt qu c th hin hnh di y:

Hnh 2-3 Minh ha chy chng trnh applet

- 29 -

2.4

Cc thnh phn c bn ca ngn ng lp trnh Java

2.4.1 nh danh
nh danh (Identifier) Tn gi ca cc thnh phn trong chng trnh c gi l nh danh. nh danh thng c s dng xc nh bin, kiu, phng thc, lp. Qui tc cho nh danh: nh danh l mt dy cc k t gm cc ch ci, ch s v cc k t khc: _, $,... nh danh khng bt u bng ch s. di ca nh danh khng gii hn. Java phn bit ch hoa v ch thng.

Qui c t tn nh danh cho cc lp: ch ci u ca mi t trong nh danh u vit hoa

V d: MyClass, HocSinh, SocketServer, URLConnection,... nh danh cho cc bin, phng thc, i tng: ch ci u ca mi t trong nh danh u vit hoa tr t u tin. V d: hoTen (h tn), namSinh (nm sinh), tinhTong (tnh tng).

2.4.2 Cc kiu d liu nguyn thy (primitive datatype)


Kiu d liu c bn nh ngha sn c gi l kiu nguyn thy. Bin thuc kiu d liu nguyn thy lu gi tr. Kiu nguyn thy bao gm cc kiu: Kiu nguyn: char (2byte), byte(1byte), short(2byte), int(4byte), long(8byte). Kiu s thc: float(4byte), double(8byte). Kiu logic: bool. Mi kiu d liu nguyn thy c mt lp bao bc(wrapper class) cung cp cc chc nng thao tc trn kiu d liu ny.
Kiu d liu char byte Char Byte Lp gi

- 30 -

short int long float double

Short Integer Long Float Double

2.4.3 Khai bo cc bin


C php: <tn kiu> <tn bin>; v d:
int i; i=5; URL u ; HocSinh hs = new HocSinh(Tuan Anh);

Mi bin c khai bo vi mt kiu xc nh. C hai kiu bin. Bin kiu thuc d liu nguyn thy s lu gi tr. Bin thuc kim i tng s lu a ch tham chiu ti i tng (a ch i tng, a ch nh ngha lp i tng). Cn ch rng mt bin khi c khai bo, cn phi thit lp gi tr ca n trc khi s dng. Qui tc chuyn i kiu trong Java
(<kieu>)<bieu_thuc>

V d
float f = (float)100.15D;

M rng v thu hp kiu


byte short int char long float double

V d m rng kiu
char c = A; int k = c;

V d thu hp kiu

- 31 -

int k =10; char c=(char)k;

2.4.4 Cc cu lnh c bn
Khi lnh

Khi lnh trong Java tng t nh khi lnh trong C/C++, l nhng lnh nm trong cp ngoc m { v ng }. Mt khi lnh l mt dy khng hoc nhiu lnh hoc cc khai bo bin hoc khai bo lp theo bt k th t no c t trong cp ngoc {}
{ S1; Sn; }

Lnh gn

int a, b, c,d; d=b*b-4*a*c;

Biu thc iu kin

Biu thc iu kin A?B:C tr v gi tr B nu A c gi tr true, tr v gi tr C nu A c gi tr false. V d:


byte b; int i=b>=0?b:b+255;

- Trong v d trn thc hin vic chuyn i cc s nguyn kiu byte c du v s nguyn kiu int khng c du. Nu b ln hn hoc bng 0 th I nhn gi tr l b, ngc li I s nhn gi tr l 255+b. - Cc lnh iu khin r nhnh chng trnh C php
if<biu_thc_k> <cu_lnh>

Lnh if n gin

Lnh if else

- 32 -

C php
if <biu_thc_k> <cu_lnh_1>; else <cu_lnh_2>;

V d: Vit chng trnh nhp vo mt dy s nguyn t i dng lnh, sp xp dy s v hin th dy s sau khi sp xp ln mn hnh.
class SapXep { public static void main(String[] args) { int a[]=null; int i,j,tg; if(args.length>0) { a=new int[args.length]; } for(i=0;i<args.length;i++) { a[i]=Integer.parseInt(args[i]); System.out.print(a[i]+" "); } System.out.println(); for(i=0;i<a.length-1;i++) for(j=i+1;j<a.length;j++) if(a[i]>a[j]) { tg=a[i]; a[i]=a[j]; a[j]=tg; } System.out.println("Day so sau khi sap xep la:"); for(i=0;i<args.length;i++) } System.out.print(a[i]+" ");

- 33 -

Bin dch chng trnh


C:\>javac SapXep.java

Thc hin chng trnh


C:\>java SapXep -2 3 1 4 -5 6 -10 -2 3 1 4 -5 6 -10 Day so sau khi sap xep la: -10 -5 -2 1 3 4 6

Lnh switch

Lnh ny cho php r nhnh theo nhiu nhnh tuyn chn da trn cc gi tr nguyn ca biu thc. C php:
switch(<biu_thc_nguyn>) { case nhan_1:<cu_lnh_1>; case nhan_2:<cu_lnh_2>; case nhan_3:<cu_lnh_3>; ... case nhan_n:<cu_lnh_n>; default:<cu_lnh>; }

Lnh lp

Lnh lp cho php mt khi cc cu lnh thc hin mt s ln lp li. - Lnh while
while (<iu_kin>) <Thn_chu_trnh>

Ch : C th <Thn_chu_trnh> khng c thc hin ln no nu ngay t u <iu_kin> c gi tr false. <iu_kin> l biu thc boolean. V d: Lp chng trnh in ra dy s Fibonaci c cc gi tr nh hn 50.
class Fibonaci {

- 34 -

public static void main(String[] args) { int lo=1; int hi =1; System.out.println(lo); while(hi<50) { System.out.println(hi); hi=lo+hi; lo=hi-lo; } } }

- Lnh do while C php


do { //Cc lnh } while(<iu_kin>);

Ch : Thn chu trnh c thc hin t nht mt ln - Lnh for C php


for(<Biu_thc_bt_u>;<iu_kin_lp>;Biu_thc_gia_tng>) <Thn_chu_trnh>

- <Biu_thc_bt_u>: Khai bo v gn cc gi tr khi u cho cc bin iu khin qu trnh lp. - <iu_kin_lp>:Biu thc logic. - S tng ng gia vng for v while
<Biu_thc_bt_u>; while(<iu_kin_lp>) {

- 35 -

<lnh>; <Biu_thc_gia_tng>; }

Cc cu lnh nhy

Java h tr ba lnh nhy: break, continue, v return. Cc lnh ny truyn iu khin sang phn khc ca chng trnh. - Lnh break: c dng kt thc trnh t thc hin lnh trong lnh switch hoc c s dng thot ra khi mt vng lp.
class BreakDemo { public static void main(String[] args) { for(int i=0;i<20;i++){ if(i==3)break; System.out.println("i="+i); } } }

Chng trnh ny in ra kt qu l:
i=0 i=1 i=2

Nh chng ta c th thy, vng lp for c thit k chy vi cc gi tr t 0 n 20, lnh break lm cho vng lp kt thc sm khi i bng 3. - Lnh continue: Lnh continue s b qua khng x l mt lnh no trong vng lp nhng vn tip tc thc hin phn cn li ca vng lp.
class ContinueDemo { public static void main(String[] args) { for(int i=0;i<5;i++){ if(i==2)continue;

- 36 -

System.out.println("i="+i); } } }

Kt qu thc hin chng trnh trn nh sau:


i=0 i=1 i=3 i=4

Chng trnh khng in ra gi tr i=3. - Lnh return: c s dng kt thc vic thc hin ca hm hin thi v chuyn iu khin chng trnh v cho chng trnh gi phng thc V d
protected double giaTriKhongAm(double v) { if(v<0) return 0; else return v; }

2.5

Lp i tng n v c bn trong lp trnh Java l lp. Lp i tng miu t c trng (thuc

tnh) v kh nng (phng thc) ca i tng. Thuc tnh lu d liu v i tng. Phng thc l cc hm thao tc trn d liu ca i tng. Java h sn mt th vin rt ln cc lp i tng trong gi java.*, javax.* v nhiu gi khc.

2.5.1 C php nh ngha mt lp i tng


[<phm vi>] class <Tn lp> [extends <Tn lp cha>] [implements <Tn giao din>] { < Cc thnh phn lp:

- 37 -

kiu_d_liu1 bin1 ... kiu_d_liun binn phng_thc1() ... phng_thcm() } >

2.5.2 C php nh ngha phng thc


[<Phm { <Ni dung phng thc> } vi>] <Kiu tr v> <Tn phng thc> ([<Danh sch tham bin hnh thc>])[<Mnh throws>]

Trong - <Kiu tr v> c th l kiu nguyn thy, kiu lp hoc khng c gi tr tr li (kiu void) - <Danh sch tham bin hnh thc> bao gm dy cc tham bin (kiu v tn) phn cch vi nhau bi du phy. - Cc kiu phm vi o public: Cc thnh phn c khai bo l public c th c truy cp bt k ni no c th truy cp c v chng c tha k bi cc lp con ca n. o private: Cc thnh phn c khai bo l private ch c th c truy cp trong chnh lp o protected: Cc thnh phn c khai bo l protected c th c truy cp bi m lnh trong lp, lp tha k v cc i tng cng gi.

2.5.3 Hm khi to - Constructor


Hm khi to l mt phng thc c bit khng c gi tr tr v v c tn trng vi tn lp. Trng hp khng c constructor no c a ra trnh bin dch cung cp constructor mc nh cho lp .

- 38 -

Khi to ra mt i tng, hm khi to ng vi b tham s truyn vo s t ng gi ln thc hin. Hm ny cho php thit lp nhng gi tr ban u cho cc thuc tnh ca i tng va to ra.
public class Point { protected double x,y; public Point(double x,double y) { this.x=x; this.y=y; } public void move(double dx, double dy) { x=x+dx; y=y+dy; } public void print() { System.out.println("x="+x+", y="+y); } public static void main(String[] args) { Point p=new Point(3.0,6.0); System.out.println("Thong tin ve toa do diem ban dau:"); p.print(); p.move(-1.5,2.0); System.out.println("Thong tin ve toa do diem sau khi tinh tien theo vec to:"); p.print(); } }

C:\>java Point

- 39 -

Thong tin ve toa do diem ban dau: x=3.0, y=6.0 Thong tin ve toa do diem sau khi tinh tien theo vec to: x=1.5, y=8.0

2.5.4 Tham chiu this


Thng thng, i tng nhn phng thc cn phi bit tham chiu ca n. Trong lp Point c constructor
public Point(double x,double y) { this.x=x; this.y=y; }

Gi s nu sa i constructor bng cch thay i nh sau:


public Point(double x,double y) { x=x; y=y; }

Khi bin dch chng trnh s bo li v c s nhp nhng trong cc lnh gn. Tham chiu this khc phc c iu ny, this.x v this.y mun cp ti trng thng tin ca lp Point cn x, y l tham bin truyn vo ca constructor.

2.5.5 Tha k
class Point3C extends Point2C { protected double z; public Point3C(double x, double y, double z) { super(x,y); this.z=z; } public void move(double dx, double dy, double dz) {

- 40 -

super.move(dx,dy); z+=dz; } public void print() { super.print(); System.out.print(" } public static void main(String[] args) { Point3C p=new Point3C(3.0,4.5,5.0); System.out.println("Toa do ban dau:"); p.print(); System.out.println(); p.move(-1.0,0.5,-1.0); System.out.println("Toa do sau khi tinh tien:"); p.print(); System.out.println(); } } z="+z);

2.5.6 T kha super


Mt lp con k tha y cc thuc tnh v phng thc ca lp cha. Trong , c mt s thuc tnh v phng thc ca lp cha khng truy xut c do t kha phm vi ca n hoc do phng thc lp cha vit . truy xut cc thnh phn ca lp cha ny, t kha super c s dng. on m th nht khai bo lp Point2C biu din mt i tng im hai chiu, on m th hai khai bo lp Point3C biu din mt i tng im ba chiu. Lp Point3C c k tha lp t lp Point2C. Li gi super(x,y) trong lp Point3C gi ti constructor Point2C hay super.move(dx,dy) gi ti phng thc move(dx,dy) ca lp Point2C. Bin dch chng trnh
C:\>javac Point3C.java

Thc thi chng trnh

- 41 -

C:\>java Point3C

Kt qu chng trnh
Toa do ban dau: x=3.0, y=4.5 x=2.0, y=5.0 z=5.0 z=4.0 Toa do sau khi tinh tien:

2.5.7 Truyn tham s trong Java


Thng thng, trong mt ngn ng lp trnh thng c hai cch truyn tham bin cho mt th tc: truyn theo tham tr v truyn theo tham chiu. Cc gi tr ca cc bin tham s trong mt phng thc l cc bn sao ca cc gi tr do ngi gi xc nh. S khc bit l truyn tham tr th tham s lu gi tr thuc kiu d liu nguyn thy cn truyn tham chiu th tham s lu gi tr l a ch nh ca i tng thuc mt kiu nht nh.

2.5.8 a hnh
Tnh a hnh ca mt i tng c th hin qua k thut np chng phng thc(overloaded method). Cc phng thc np chng l cc phng thc nm trong cng mt lp c cng tn nhng khc nhau v danh sch tham s. V d
class TinhToan { public static void main(String[] args) { Tinh c = new Tinh(); c.add(10,20); c.add(40.0f,35.65f); c.add("Good ","Morning"); } } class Tinh {

- 42 -

public void add(int a, int b) { int c = a+b; System.out.println("Phep cong hai so nguyen :"+c); } public void add(float a, float b) { float c = a+b; System.out.println("Phep cong hai so dau phay dong :"+c); } public void add(String a, String b) { String c = a+b; System.out.println("Phep cong hai xau :"+c); } };

Kt qu:
C:\MyJava\Baitap>java TinhToan Phep cong hai so nguyen :30 Phep cong hai so dau phay dong :75.65 Phep cong hai xau :Good Morning

Gii thch: Trong chng trnh trn phng thc add() l phng thc c np chng. C ba phng thc c cng tn add() nhng c cc tham s khc nhau. Khi phng thc add c gi, da vo danh sch tham s truyn vo, phng thc tng ng s c triu gi ra thc hin.

2.5.9 Thnh phn tnh


Cc thnh phn tnh l thnh phn c lp ca lp. Thnh phn ny c th truy cp qua tn. Mi i tng trong lp u c th truy cp n cc thnh phn ny. Cc thnh phn tnh bao gm: bin tnh, phng thc tnh, khi tnh. V d v bin static
class StaticVariable { static int count=0;

- 43 -

StaticVariable(){ count++; } public static void main(String[] args) { //bien dem count se cho biet so doi tuong duoc tao ra StaticVariable c1=new StaticVariable(); System.out.println("Bien dem count="+count); StaticVariable c2=new StaticVariable(); System.out.println("Bien dem count="+count); StaticVariable c3=new StaticVariable(); System.out.println("Bien dem count="+count); } }

Phng thc tnh ch s dng cc thuc tnh hoc phng thc ca lp chnh n th cc thuc tnh, phng phc ny phi l tnh. V d phng thc static
class StaticMethodDemo { static String name="Phuong thuc tinh"; public static void main(){ System.out.println("Hello" + name); } public static void main(String[] args) { main(); System.out.println("Hello World!"); } }

Khi static c s dng khi to gi tr ca cc bin tnh. Khi lp ln u tin c ti vo b nh, cc khi static lun c x l trc. V d khi tnh
class StaticDemo {

- 44 -

static{ System.out.println("Khoi static 1"); } public static void main(String[] args) { System.out.println("Hello World!"); } static { System.out.println("Khoi static 2"); } }

V khi static lun c x l trc nn kt qu in ra ca chng trnh trn s l:


Khoi static 1 Hello World! Khoi static 2

2.5.10 Cc thnh phn hng (final)


Bin c khai bo vi t kha final c ngha l bin c gi tr hng, khng thay i c ni dung. V d.
final double PI=3.1416;

Cc phng thc c khai bo l final khng th c vit lp tha k. V d


class A { final void method(){ } } class B extends A{ final void method(){ } } //li

Lp khai bo vi t kha final khng th c tha k. V d

- 45 -

final class A { }

2.6

Lp tru tng Lp tru tng l lp c t nht mt phng thc tru tng. Phng thc tru

tng l phng thc ch khai bo khun dng hm m khng th ci t chi tit hm. C php khai bo phng thc tru tng:
[phm vi] abstract <kieu du lieu> <tenphuongthuc>([ds tham so]);

C php khai bo lp tru tng:


abstract class <ten lop>{ //c t nht mt phng thc tru tng }

V d:
abstract class { double a,b,r; public abstract double dientich(); public abstract double chuvi(); } class HinhTron extends Hinh2D { public HinhTron(double r) { this.r=r; } public double dientich() { return Math.PI*r*r; } public double chuvi() { return Math.PI*2*r; } } Hinh2D

- 46 -

class HinhChuNhat extends Hinh2D { public HinhChuNhat(double a,double b) { this.a=a; this.b=b; } public double dientich() { return a*b; } public double chuvi() { return (a+b)*2; } } class AbstractDemo { public static void main(String args[]) { Hinh2D ht=new HinhTron(1); System.out.println("Dien tich hinh tron ban kinh 1.0 la:"+ht.dientich()); System.out.println("Chu vi hinh tron ban kinh 1.0 la:"+ht.chuvi()); Hinh2D hcn=new HinhChuNhat(3,4); System.out.println("Dien tich hinh chu nhat la:"+hcn.dientich()); System.out.println("Chu vi hinh chu nhat la "+hcn.chuvi()); } };

Kt qu thc hin chng trnh


C:\MyJava>java AbstractDemo

- 47 -

Dien tich hinh tron ban kinh 1.0 la:3.141592653589793 Chu vi hinh tron ban kinh 1.0 la:6.283185307179586 Dien tich hinh chu nhat la:12.0 Chu vi hinh chu nhat la 14.0

2.7

Giao din (Interface) Giao din l s tru tng ha cao , ngha l mt lp i tng ch bao gm tp

hp cc phng thc tru tng hoc thuc tnh hng. Giao din c s dng trong c ch lin kt mun. Giao din cho php a tha k. C php khai bo giao din
public interface <tn giao din> [extends <tn giao din cha>] { //Thn giao din }

V d nh ngha mt giao din:


public interface CalculatorInterface { public double add(double x, double y); public double sub(double x, double y); public double mul(double x, double y); public double div(double x, double y); }

Ci t giao din Giao din trnh by cc phng thc chung ca cc lp i tng ci t n. Lp i tng ci t giao din c c php nh sau.
class <tn lp> implements <tn lp cha>{ //Ci t cc phng thc ca giao din }

V d:
class CalculatorTest implements CalculatorInterface { public double add(double x, double y) {

- 48 -

return x+y; } public double sub(double x, double y) { return x-y; } public double mul(double x, double y) { return x*y; } public double div(double x, double y) {return x/y; } public static void main(String[] args) throws Exception { CalculatorInterface cal=new CalculatorTest(); if(args.length!=2) { System.out.println("Cach chay chuong trinh: java CalculatorImpl so1 so2"); return; } else { double x,y,z; x=Double.parseDouble(args[0]); y=Double.parseDouble(args[1]); System.out.println(x+"+"+y+"="+cal.add(x,y)); System.out.println(x+"-"+y+"="+cal.sub(x,y)); System.out.println(x+"*"+y+"="+cal.mul(x,y)); System.out.println(x+"/"+y+"="+cal.div(x,y)); } } }

- 49 -

Kt qu thc hin chng trnh l


C:\MyJava>java CalculatorTest 12 3 12.0+3.0=15.0 12.0-3.0=9.0 12.0*3.0=36.0 12.0/3.0=4.0

2.8

Gi (Package) Cc gi gm c cc thnh phn l cc lp, cc giao din v cc gi con c lin quan

vi nhau. Vic t chc thnh cc gi c mt s li ch sau: - Cho php nhm cc thnh phn cng c trng, chc nng thnh mt n v, thun tin cho vic qun l. - Trnh xung t tn. - Cho php qui nh phm vi truy cp cc thnh phn m mc gi. C php truy cp ti thnh phn ca gi <Tn gi>.<Tn thnh phn> C php np cc thnh phn trong gi vo trong mt chng trnh.
import <Tn gi>.*;//tn gi

C php khai bo np cc thnh phn trong gi con nh sau:


import <Tn gi>.<Tn gi con>.*;

Cch to ra cc gi trong Java C php khai bo a mt lp i tng vo mt gi


package <Tn gi>;

V d:
package mypackage; public class { public double cong(double a,double b) { return a+b; } public double nhan(double a, double b) { Calculator

- 50 -

return a*b; } public double tru(double a,double b) { return a-b; } public double { return a/b; } } chia(double a,double b) throws Exception

Bin dch
C:\>javac -d C:\MyJava Calculator.java

Lu : cc thnh phn ca gi cn c khai bo vi thuc tnh public, nu cn truy xut chng t bn ngoi.

2.9

Qun l ngoi l (Exception Handling) Khi lp mt chng trnh thng c cc li xy ra. Trong , li trong qu trnh

thc thi chng trnh l mt loi li nghim trng lm cho chng trnh khng hot ng bnh thng hoc ngng hot ng. Cc li ny l do chng trnh khng kim sot ht cc tnh hung d liu u vo khc nhau, v d nh tn tp tin cung cp khng tm thy, a ch mng khng hp l, vt kch thc mng, ...) Ngn ng lp trnh Java h tr c ch kim tra li cht ch. C th cc lp biu din li nh Throwable, Error, Exception, Cc thnh phn trong th vin c sn ca Java u c ci t kim tra li v a ra lp biu din li ph hp. Ngoi ra, Java cn cho php to ra cc lp i tng c kim tra li v pht sinh ra i tng li tng ng.

2.9.1 Lnh kim sot ngoi l c bn


Mt lnh kim sot ngoi l c bn gm 2 khi lnh chnh l khi
catch. try

v khi l ni

Khi try l ni cha on lnh c kh nng gy ra li run-time. Khi


try

catch

cha on lnh x l li do khi

pht hin. Mt lnh kim sot ngoi l c duy nht

mt khi try v c th c nhiu khi catch.

- 51 -

Ngoi ra cn khi ty chn l nh


return,

finally,

l ni cha cc lnh lun c thc thi d


catch

c pht sinh exception hay khng. Nu trong khi th lnh trong khi
finally

c lnh thot khi phng thc,

vn c thc thi bnh thng. Cc lnh ny

thng l nhng lnh "dn dp" b nh, ng cc stream, C php tng qut:
try { // Cc cu lnh c kh nng gy ra exception } catch (Exception1 E1) { // Cc cu lnh x l cho exception thuc loi Exception1 } catch (Exception2 E2) { // Cc cu lnh x l cho exception thuc loi Exception2 } ... ... finally { // Cc cu lnh lun c thc thi }

V d c th: Trong v d ny, ta s c tnh pht sinh ra mt ngoi l, l li chia cho 0. Li ny ch c pht hin lc run-time.
public class Main01 { public static void main(String[] args) { int x=4,y=0; try { int z=x/y;

- 52 -

// Cu lnh ny s khng c thc thi System.out.println("Hello!"); } catch(Exception E) { System.out.println("Co loi run-time!"); } } }

V kt qu khi chy chng trnh:


Co loi run-time! Press any key to continue...

Nu khng x l exception, ta s c kt qu nh sau:


Exception in thread "main" java.lang.ArithmeticException: / by zero at Main01.main(Main01.java:8) Press any key to continue...

l exception do Java t pht hin v x l. V d trn cho thy rng khi mt cu lnh pht sinh exception, cc cu lnh sau n trong khi try s khng c thc thi. Khi , con tr lnh s nhy ngay n khi ph hp (nu c) thc thi cc lnh trong .
catch

2.9.2 T chc lp biu din ngoi l


Trong Java, cc ngoi l c biu din lp cao nht l Throwable. K tha
n l

hai lp con Exception v Error. Tt c cc lp biu din ngoi l trong Java u

k tha t hai lp ny. Mt i tng phi c dn xut t Throwable mi dng c trong cu lnh
throw

pht sinh ngoi l. Lp Exception dng m t chung cho tt c ngoi l trong Java, Trong ,

RuntimeException

l mt dn xut quan trng. T n, cc ngoi l nh li vt phm vi

mng, li tnh ton s hc, li p kiu, li s dng i tng cha khi to, c ci t.

- 53 -

Lp Error dng m t cc chung cho cc loi ngoi l c bit, khng cn x l, v d nh li ca my o, li lin kt class, Throwable

Error

Exception

LinkageError

VirtualMachineError

...

RuntimeException

IOException

...

ClassCastException

NullPointerException

ArithmeticException

...

S t chc exception ca Java

2.9.3 Pht sinh ngoi l


Cc li nu c pht sinh s c bt bi my o Java v nm ra mt i tng ngoi l cha thng tin li. Ngn ng lp trnh Java cho php ngi lp trnh nm ra i tng ngoi l bng t kha throw.
public class Main02 { public static void main(String[] args) { Object o=null; if (o==null) // Pht sinh exception loi NullPointerException throw new NullPointerException(); } }

- 54 -

Trong , NullPointerException l mt exception c sn ca Java. Khi chy chng trnh, ta s nhn c thng bo sau:
Exception in thread "main" java.lang.NullPointerException at Main02.main(Main02.java:8)

exception c r ngha, ta c th throw mt exception vi hm khi to c tham s l chui m t loi li, sau dng phng thc getMessage() xut cu thng bo ra mn hnh.
public class Main02 { public static void main(String[] args) { try { String S="Loi: object co gia tri null"; // To ra exception bng constructor c tham s throw new NullPointerException(S); } catch (NullPointerException E) { System.out.println(E.getMessage()); } } }

Khi , cu thng bo li s tr nn thn thin hn:


Loi: object co gia tri null Press any key to continue...

Trong mt phng thc c nm ra ngoi l th phng thc phi c khai bo nm ngoi l bng t kha throws. v d:
// T kha throws cho bit phng thc ny c pht sinh exception // cho khi cao hn x l void methodD(int[]a)throws NullPointerException

- 55 -

{ if (a == null) // Pht sinh exception throw new NullPointerException("Loi: Mang null"); // ... }

Khi , nu phng thc methodC() gi methodD() m khng t n trong khi exception th cng phi c t kha throws trong phn khai bo. Khi exception ca phng thc
methodC()

phi cng loi hoc l lp cha ca exception do methodD() pht sinh.

void methodC()throws NullPointerException // Hoc throws Exception,... { int[]a=null; // ... methodD(a); // ... }

V d bt nhiu ngoi l
Scanner sn=new Scanner(System.in); System.out.print("Nhap gia tri n (0, 1, 2, ...): "); int n=sn.nextInt(); try { switch (n) { case 0 : break; // Khng pht sinh exception case 1 : throw new NullPointerException(); case 2 : throw new ClassCastException(); case 3 : throw new ArrayIndexOutOfBoundsException(); default: // Pht sinh exception IllegalArgumentException // Lu : khng c khi catch ring cho exception ny, // vic catch n s do khi cach Exception thc hin

- 56 -

throw new IllegalArgumentException(); } } catch (NullPointerException E) { System.out.println("Loi doi tuong null!"); // return s ngn cn vic thc thi khi lnh ngoi finally, // nhng khng ngn cn vic thc thi khi lnh finally return; } catch (ClassCastException E) { System.out.println("Loi ep kieu!"); } catch (ArrayIndexOutOfBoundsException E) { System.out.println("Loi chi so mang vuot pham vi!"); } catch (Exception E) { System.out.println("Co loi!"); } finally { // Khi lnh ny lun c thc thi System.out.println("Khoi lenh finally."); } //Lnh ny c khi c thc thi, c khi khng, ty vo cch x l // ca cc khi catch trn System.out.println("Lenh ngoai khoi finally.");

Khi c thc thi, ty vo gi tr ca n m on code trn s pht sinh exception tng ng. Khi ch ch c khi catch ph hp nht c thc thi. Nhp n = 0: khng pht sinh exception nn khng thc thi khi catch no, vn thc thi khi finally v lnh ngoi khi finally.

- 57 -

Nhap gia tri n (0, 1, 2, ...): 0 Khoi lenh finally. Lenh ngoai khoi finally. Press any key to continue...

Nhp n = 1: pht sinh NullPointerException, khi exception ny cha lnh


return

catch

tng ng vi
finally

thot ngay khi phng thc nn lnh ngoi khi

khng c thc thi, tuy nhin lnh trong khi finally vn c thc thi bnh thng.
Nhap gia tri n (0, 1, 2, ...): 1 Loi doi tuong null! Khoi lenh finally. Press any key to continue...

Nhp n = 2: pht sinh ClassCastException, khi catch tng ng vi exception ny khng thot khi phng thc nn lnh ngoi khi
finally

vn c thc thi, v d

nhin lnh trong khi finally vn c thc thi bnh thng.


Nhap gia tri n (0, 1, 2, ...): 2 Loi ep kieu! Khoi lenh finally. Lenh ngoai khoi finally. Press any key to continue...

Mi loi exception s ng vi mt i tng exception trong Java. Nu ta "catch" mt exception th ta "catch" lun cc exception k tha t n. Nn cn lu rng Java khng cho php ta "catch" exception "cha" trc khi "catch" exception "con", v nh vy th khi lnh catch ca exception "con" s khng bao gi c thc thi. Trong khi catch cui cng, ta bt li vi loi li l Exception. Do mi exception thng thng trong Java u k tha t class Exception nn khi c t sau cng (nu c). D nhin l nu mun catch mi loi exception trong Java, ta c th
Throwable:
catch catch

ny c kh nng ca n phi

bt gn nh mi loi exception ca Java. Do , nh ni trn, khi

catch

vi loi li l

catch (Throwable T) {

- 58 -

System.out.println("Co loi trong Java!"); }

2.9.4 S lan truyn ngoi l


Khi mt exception c pht sinh, n s lan truyn dn t ni pht sinh ra cc cp cao hn cho ti khi c catch hoc ti phng thc main(). Khi exception truyn ti
main()

m vn khng c catch, n s c thng bo cho ngi dng.

Xem v d sau:
public class Main04 { public static void main(String[] args) { methodA(null); } static void methodA(int[] a) { methodB(a); } static void methodB(int[] b) { System.out.println(b[0]); } }

V kt qu khi chy v d trn:


Exception in thread "main" java.lang.NullPointerException at Main04.methodB(Main04.java:13) at Main04.methodA(Main04.java:9) at Main04.main(Main04.java:5) Press any key to continue...

Da vo thng bo, ta c th thy exception NullPointerException c pht sinh t methodB(), sau c lan truyn v methodA() v sau cng l main().

- 59 -

2.9.5 Cc phng thc chnh ca lp Exception


Cc phng thc di y u k tha t Throwable.
Exception() Exception(String msg) String getMessage() void printStackTrace() Throwable fillInStackTrace() StackTraceElement[] getStackTrace()

Khi to mt Exception mc nh, cu thng bo s l null. Khi to mt Exception vi cu thng bo msg Ly cu thng bo ca Exception. In ra stack lan truyn ca Exception. Ghi thng tin ca Exception vo stack lan truyn, sau tr v chnh Exception this Ly ra mng cha cc StackTraceElement, mi
StackTraceElement

l mt i tng cha thng

tin v Exception c lan truyn (gm dng, file, lp, phng thc gy li).

V d:
public static void main(String[] args) { StackTraceElement[]ste=null; try { methodA(); } catch (Exception E) { // In ra cu thong bao loi System.out.println("Co loi: "+E.getMessage()); // Ly ra stack lu thng tin v s lan truyn // exception ste=E.getStackTrace(); } for(int i=0; ste!=null && i<ste.length; i++) System.out.println ( " Noi gay loi: Tap tin " + ste[i].getFileName() + " Dong " + ste[i].getLineNumber() + " Class " + ste[i].getClassName() +

- 60 -

" Phuong thuc: " + ste[i].getMethodName() ); } static void methodA()throws Exception { methodB(); } static void methodB()throws Exception { throw new ArrayIndexOutOfBoundsException("Loi chi so mang."); }

Kt qu chy on v d trn:
Co loi: Loi chi so mang. Noi gay loi: Tap tin Main05.java Dong 34 Class Main05 Phuong thuc: methodB Noi gay loi: Tap tin Main05.java Dong 30 Class Main05 Phuong thuc: methodA Noi gay loi: Tap tin Main05.java Dong 11 Class Main05 Phuong thuc: main Press any key to continue...

2.9.6 Lp ngoi l t nh ngha


Ngoi vic dng cc lp i tng ngoi l c sn ca Java, ta c th t to cc exception cho ph hp vi chng trnh ca mnh. to mt lp ngoi l, ta ch cn to mt class k tha t Throwable (hoc k tha t cc lp con ca Throwable), sau ci t cc phng thc ph hp. V d: ci t exception LoiDiemSo cho im trung bnh ca hc sinh: nu nhp im nh hn 0 hoc ln hn 10 th chng trnh s pht sinh exception ny.
// Khai bo exception LoiDiemSo // Exception ny s c pht sinh khi nhp im khng hp l public class LoiDiemSo extends Exception { public LoiDiemSo()

- 61 -

{ super("Diem phai tu 0 toi 10"); } public LoiDiemSo(String s) { super(s); } }

Sau khi c lp ngoi l LoiDiemSo, ta c th dng nh sau:


// ... public void Nhap()throws LoiDiemSo { Scanner sn=new Scanner(System.in); System.out.print(" + Nhap ten hoc sinh: "); HoTen=sn.nextLine(); System.out.print(" + Nhap dien trung binh : "); DiemTrungBinh=sn.nextFloat(); // Neu diem khong hop le thi phat sinh exception LoiDiemSo if (DiemTrungBinh<0 || DiemTrungBinh>10) throw new LoiDiemSo(); }

Trong phng thc main, khi nhp hc sinh, ta s bt li v xut ra cu thng bo:
public static void main(String[] args) { HocSinh hs=new HocSinh(); try { hs.Nhap(); } catch (LoiDiemSo L) {

- 62 -

System.out.println(L.getMessage()); return; } System.out.println(hs); }

2.9.7 Overriding vi exception


Khi mt lp con override phng thc ca lp cha, nu lp cha c nm ra li E (qua t kha throws) th lp con cng phi nm ra li E hoc li con ca E.
class LopCha { public void Method1()throws Exception { } public void Method2()throws RuntimeException { } public void Method3()throws ClassCastException { } } class LopCon extends LopCha { // OK, v NullPointerException l con ca Exception public void Method1()throws NullPointerException { } // OK, v cha v con nm ra cng loi li l RuntimeException public void Method2()throws RuntimeException { } // Phng thc ny khng hp l

- 63 -

// v Exception l cha ca ClassCastException /* public void Method3()throws Exception { } */ }

2.10
3.

Bi tp Cn qun l mt danh sch nhn vin ca 1 c quan gm 2 loi: Nhn vin bin - Cc thng tin chung: h tn, phng. - NVBC: h s lng, s nm CT. - NVHD: lng hp ng, Loi H(NH,DH).

ch v nhn vin hp ng.

Cc thao tc trn danh sch nhn vin: - To lp v lu cc nhn vin - Lit k danh sch nhn vin. - Lit k danh sch nhn vin theo loi: H, BC - Tnh tng lng ton b nhn vin. - Lit k danh sch nhn vin hp ng di hn. 4. 5. Xy dng cc lp tnh din tch cc hnh: trn, tam gic, ch nht. Chng trnh Mt th vin gm cc loi ti liu sau: - Sch(M sch, Tn Sch, Tc gi, NXB, Nm XB, V tr) - Tp ch (M tp ch, Tn tp ch, Chuyn ngnh, S, Nm, V tr) - CD(M CD, Tn CD, S th t, Ni dung, V tr) Hy t chc cc lp sao cho c th lp trnh thc hin c cc chc nng sau: - Lu danh sch cc ti liu c trong th vin. - Lit k ton b ti liu c trong th vin. - Lit k tng loi ti liu c trong th vin. - Xem thng tin v ti liu khi bit m ti liu. minh ha gm mt mng cc i tng v tnh tng din tch ca cc hnh trong mng.

- 64 -

- Tm kim mt ti liu theo: Tn v tc gi i vi sch; Tn tp ch, Chuyn ngnh, s, nm i vi tp ch, Tn CD, S th t v ni dung i vi CD.

- 65 -

CHNG 3 . QUN L CC LUNG VO RA

3.1

Gii thiu Mt chng trnh my tnh cn phi ly d liu t bn ngoi vo chng trnh

x l. Sau khi chng trnh x l xong s xut kt qu ra ngoi cho thnh phn khc tip tc x l hoc lu tr. D liu c truyn t chng trnh ny sang chng trnh khc bng cc lung d liu. ci t vic truyn d liu ny, Java cung cp package
java.io

vi rt nhiu lp v cc tnh nng phong ph.

Xt theo loi d liu, Java chia cc lung thnh hai loi l lung byte (byte stream) v lung k t (character stream). Gia hai loi d liu ny c cc lp trung gian phc v cho vic chuyn i. Xt theo thao tc, Java chia cc lung thnh hai loi l input (c byte) v output (ghi byte) hoc reader (c character) v writer (ghi character). Byte streams Source streams Sink streams
InputStream OutputStream
Cc stream c bn trong Java

Character streams
Reader Writer

Ngoi ra, Java cn h tr rt nhiu lung h tr cho vic c ghi khc.


Console InputStream Chng trnh ng dng Tp tin OutputStream

Thit b

Mng

Minh ha cc ngun d liu

- 66 -

3.2

Cc lung Byte Cc lung byte c chc nng c hoc ghi d liu dng byte. Da vo thao tc, cc

lung byte c chia ra hai loi chnh: nhm input c i din bi lp InputStream v nhm output c i din bi OutputStream. Cc lp x l trn lung byte u c k tha t hai lp ny.
ByteArrayInputStream BufferedInputStream FileInputStream DataInputStream FilterInputStream LineNumberInputStream InputStream ObjectInputstream PushbackInputStream PipedInputStream

SequenceInputStream

StringBufferInputStream

S t chc ca cc stream c byte


ByteArrayOutputStream

FileOutputStream

BufferedOutputStream

OutputStream

FilterOutputStream

DataOutputStream

ObjectOutputstream

PrintStream

PipedOutputStream

S t chc ca cc stream ghi byte

- 67 -

3.2.1 Cc lung byte tng qut


Gm cc lp InputStream v OutputStream. y hai l lp tru tng, n quy nh cc phng thc c v ghi d liu dng byte v mt s phng thc h tr khc: Phng thc Lp InputStream
int available() void close() void mark(int readlimit) boolean markSupported()

ngha Tr v s byte cn li trong stream. ng stream. nh du v tr hin ti. Nu sau khi mark ta c qu
readlimit

byte th ch nh du khng cn hiu lc.

Tr v true nu stream h tr mark v reset. c byte k tip trong stream.

abstract int read()

Quy c: Tr v -1 nu ht stream. y l phng thc tru tng. c mt dy byte v lu kt qu trong mng buffer. S byte c c ti a l sc cha ( length) ca
buffer.

Nu buffer c sc cha l 0 th s khng c

c g.
int read(byte[]buffer)

Sau khi c xong s tr v s byte c c tht s (nu ang c m ht stream th s byte c c tht s s nh hn sc cha ca buffer). Nu stream ht m vn c na th kt qu tr v l
-1.

int read(byte[]buffer, int offset, int len)

c mt dy byte v lu kt qu trong mng buffer k t byte th offset. S byte c c ti a l len. Nu len l 0 th s khng c c g. Sau khi c xong s tr v s byte c c tht s (nu ang c m ht stream th s byte c c tht s s nh hn len). Nu stream ht m vn c na th kt qu tr v l

- 68 -

-1.

void reset() long skip(long n)

Tr li ch nh du bng phng thc mark(). B qua n byte ( c cc byte tip sau n byte ). Lp OutputStream ng stream. Buc stream ghi ht d liu trong vng m ra ngoi. Ghi mt dy byte vo stream. S byte c ghi s l
buffer.length.

void close() void flush() void write(byte[]buffer) int write(byte[]buffer, int offset, int len) abstract void write(int b)

Ghi mt dy byte vo stream. Bt u ghi t byte th


offset,

v ghi tng cng len byte.

Ghi mt byte vo stream. y l phng thc tru tng.

Cc phng thc c bn ca cc byte stream tng qut

Lu : Cc phng thc c/ghi s pht sinh IOException nu c li xy ra.

3.2.2 Cc lung c byte hin thc


s c/ghi lung d liu dng byte, cc lp con hin thc ca InputStream v
OutputStream

thng c s dng gm: byte t tp tin. byte vo tp tin. b m l mng byte c d liu. b m l mng byte ghi d liu. byte t mt piped output stream. byte vo mt piped input stream.

FileInputStream: c (cc)

FileOutputStream: ghi (cc)

ByteArrayInputStream: cha

ByteArrayOutputStream: cha PipedInputStream: c (cc)

PipedOutputStream: ghi (cc)

Nhn chung cc lp ny u c nhng chc nng chnh tng t nh nhau. Di y ch trnh by nhng phng thc c th ca chng. Stream
File Input FileInputStream(File file) Stream FileInputStream(String name)

Phng thc

ngha To FileInputStream c d liu t mt tp tin lin kt ti i tng File. To FileInputStream c d liu t

- 69 -

mt tp tin c tn l name. To FileOutputStream ghi d liu


FileOutputStream(File file) vo mt tp tin lin kt ti i tng
File.

To FileOutputStream ghi d liu tp tin lin kt ti i tng File.


FileOutputStream(File file, boolean append) File Output Stream FileOutputStream(String name)

Nu append l true th s ghi tip vo cui tp tin, ngc li th ghi ln tp tin. To FileOutputStream ghi d liu vo mt tp tin c tn l name. To FileOutputStream ghi d liu vo mt tp tin c tn l name.

FileOutputStream(String name, boolean append)

Nu append l true th s ghi tip vo cui tp tin, ngc li th ghi ln tp tin.

Byte Array Input Byte Array Output Stream

ByteArrayInputStream(byte[] To ra ByteArrayInputStream v dng buf)


buf

lm vng m.

ByteArrayInputStream(byte[] To ra ByteArrayInputStream v dng

Stream buf, int off, int len) ByteArrayOutputStream() ByteArrayOutputStream(int size) byte[]toByteArray()

mt phn ca buf lm vng m. To ra mt ByteArrayOutputStream vi vng m 32 byte v c th tng nu cn. To ra mt ByteArrayOutputStream vi vng m size byte. To ra mng byte l bn sao ca vng m ca this. To ra chui l bn sao ca vng m ca this vi cc byte c i thnh k t tng ng. Ghi d liu trong vng m vo mt

String toString() void writeTo(OutputStream out)

- 70 -

output stream khc. To ra mt piped input stream. Stream


PipedInputStream() Piped Input Stream
PipedInputStream (PipedOutputStream src) connect(PipedOutputStream src)

ny cha c kt ni vi piped output stream no. To ra mt piped input stream kt ni vi piped output stream src. Kt ni ti piped output stream src. To ra mt piped output stream. Stream

PipedOutputStream() Piped Output Stream PipedOutputStream (PipedInputStream snk) connect(PipedInputStream snk)

ny cha c kt ni vi piped input stream no. To ra mt piped output stream kt ni vi piped input stream snk. Kt ni ti piped input stream snk.

Bng 8: Nhng phng thc c trng ca cc byte stream c th

3.2.3 Cc v d
dng cc stream, trc ht cn import package java.io.
import java.io.*;

Di y s trnh by cc v d v file stream v piped stream. File stream:


String fileName="C:\\TestB.txt"; // Pht sinh v xut mng ngu nhin byte[]a=new byte[10]; System.out.print("Du lieu phat sinh: "); for(int i=0;i<a.length;i++) { a[i]=(byte)Math.round(Math.random()*20); System.out.print(a[i]+" "); } System.out.println(); // Ghi mng a vo tp tin

- 71 -

FileOutputStream fo=new FileOutputStream(fileName); fo.write(a); fo.close(); // c tp tin vo mng b FileInputStream fi.read(b); fi.close(); // Xut mng b System.out.print("Du lieu doc duoc : "); for(int i=0;i<b.length;i++) { System.out.print(b[i]+" "); } System.out.println(); fi=new FileInputStream (fileName); byte[]b= new byte[fi.available()];

Kt qu thc thi (cc con s s khc nhau vi mi ln chy):


Du lieu phat sinh: 4 14 0 16 2 19 10 9 9 15 Du lieu doc duoc : 4 14 0 16 2 19 10 9 9 15 Press any key to continue...

V d v lung mng: To mt mng gm 100 byte ri gn vo mng ny mt lung ByteArrayInputStream ly d liu ra.
import java.io.*; public class LuongNhapMang { public static void main(String[] args) { byte[] b = new byte[100]; for(byte i=0;i<b.length;i++) b[i]=i; try{ InputStream is = new ByteArrayInputStream(b); for(byte i=0;i<b.length;i++) System.out.print(is.read()+" "); }

- 72 -

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

Kt qu thc hin chng trnh


C:\MyJava\Baitap>java LuongNhapMang 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

V d lung vit mng: Vit chng trnh to lp mt lung xut mng (ByteArrayOutputStream) 100 byte. Ghi vo lung xut mng 100 phn t t 0 n 99. d liu t lung xut mng vo mng b. In d liu t mng b ra mn hnh.
import java.io.*; class LuongXuatMang { public static void main(String[] args) { try{ //Tao mot luong xuat mang 100 byte ByteArrayOutputStream os = new ByteArrayOutputStream(100); //Ghi du lieu vao luong for(byte i=0;i<100;i++) os.write(i); //Doc du lieu tu luong vao mang byte[] b = os.toByteArray(); for(byte i=0;i<100;i++) System.out.print(b[i]+" "); os.close(); }catch(IOException e) { System.err.println(e); }

- 73 -

} }

Kt qu thc hin chng trnh:


C:\MyJava\Baitap>java LuongXuatMang 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

V d v Piped stream:
PipedInputStream pi= new PipedInputStream();

PipedOutputStream po= new PipedOutputStream(pi); // Ghi cc s nguyn ngu nhin bng PipedOutputStream System.out.print("Du lieu ghi duoc: "); for(int i=0;i<10;i++) { int b=(int)Math.round(Math.random()*20); po.write(b); System.out.print(b+" "); } po.flush(); System.out.println(); // c cc s nguyn t PipedOutputStream bng PipedInputStream System.out.print("Du lieu doc duoc: "); while (pi.available()>0) { int b=pi.read(); System.out.print(b+" "); } System.out.println(); // ng cc stream

- 74 -

pi.close(); po.close();

Kt qu thc thi (cc con s s khc nhau vi mi ln chy):


Du lieu ghi duoc: 16 19 9 11 19 3 2 13 18 16 Du lieu doc duoc: 16 19 9 11 19 3 2 13 18 16 Press any key to continue...

3.3

Cc lung k t Cc lung k t (character stream) c chc nng c hoc ghi d liu dng k t.

Da vo thao tc, cc character stream c chia ra hai loi chnh: nhm input c i din bi lp Reader v nhm output c i din bi Writer. Cc lp x l trn character stream u c k tha t hai lp ny.
BufferedReader LineNumberReader

CharArrayReader

FilterReader Reader InputStreamReader

PushbackReader

FileReader

PipedReader

StringReader

Hnh 4: S t chc ca cc stream c k t

- 75 -

BufferedWriter

CharArrayWriter

FilterWriter

Writer

OutputStreamWriter

FileWriter

PipedWriter

PrintWriter

StringWriter

Hnh 5: S t chc ca cc stream ghi k t

3.3.1 Cc lung k t tng qut


Gm cc lp Reader v Writer. y hai l lp tru tng, n quy nh cc phng thc c v ghi d liu dng character v mt s phng thc h tr khc: Phng thc Lp Reader
void close()

ngha ng stream. nh du v tr hin ti. Nu sau khi nh du ta c qu readlimit k t th ch nh du khng cn hiu lc. Tr v true nu stream h tr mark v reset. c k t k tip trong stream.

void mark(int readlimit)

boolean markSupported()

abstract int read()

Quy c: Tr v -1 nu ht stream. y l phng thc tru tng.

int read(char[]cbuf)

c mt dy k t v lu kt qu trong mng cbuf. Sau khi c xong s tr v s k t c c tht s (nu ang c m ht stream th s k t c c tht

- 76 -

s s nh hn sc cha ca cbuf). Nu stream ht m vn c na th kt qu tr v l


-1.

c mt dy k t v lu kt qu trong mng cbuf k t k t th offset. Sau khi c xong s tr v s k t c c tht s


int read(char[]cbuf, int offset, int len)

(nu ang c m ht stream th s k t c c tht s s nh hn len). Nu stream ht m vn c na th kt qu tr v l


-1.

void read(CharBuffer target) boolean ready() void reset() long skip(long n)

c mt dy k t v lu kt qu trong target. Tr v true nu stream sn sng c. Tr li ch nh du bng phng thc mark(). B qua n k t ( c cc k t tip sau). Lp Writer Ni ui k t c vo stream. Ni ui dy k t csq vo stream. Ni ui mt phn ca dy k t csq vo stream.

Writer append(char c) Writer append(CharSequence csq) Writer append(CharSequence csq, int start, int end) void close() void flush() void write(char[]cbuf) abstract void write(int c) void write(String c) void write(String str, int off, int len)

ng stream. Buc stream ghi ht d liu trong vng m ra ngoi. Ghi mt mng k t vo stream. S k t c ghi s l cbuffer.length. Ghi mt k t vo stream. y l phng thc tru tng. Ghi mt chui vo stream. Ghi mt phn ca chui vo stream.

- 77 -

Cc phng thc c bn ca character stream tng qut

Lu : Cc phng thc c/ghi s pht sinh IOException nu c li xy ra.

3.3.2 Cc lung k t hin thc


s c/ghi k t, ta phi dng cc lp con ca Reader v Writer. Cc lp thng dng gm:
FileReader: c (cc) FileWriter: ghi (cc)

k t t tp tin. k t vo tp tin. b m l mng k t c d liu. b m l mng k t ghi d liu. k t t mt piped writer. k t vo mt piped reader. k t. k t.

CharArrayReader: cha CharArrayWriter: cha PipedReader: c (cc) PipedWriter: ghi (cc)

StringReader: c chui StringWriter: ghi chui

Nhn chung cc lp ny u c nhng chc nng chnh tng t nh nhau. Di y ch trnh by nhng phng thc c th ca chng. Stream Phng thc
FileReader(File file)

ngha To FileReader c d liu t mt tp tin lin kt ti i tng File. To FileReader c d liu t mt tp tin c tn l name. To FileWriter ghi d liu vo mt tp tin lin kt ti i tng File. To FileWriter ghi d liu tp tin lin kt ti i tng File. Nu append l true th s ghi tip vo cui tp tin, ngc li th ghi ln tp tin. To FileWriter ghi d liu vo mt

File Reader File

FileReader(String name)

Writer FileWriter (File file)

FileWriter(File file, boolean append)

FileWriter(String name) FileWriter(String name, boolean append)

tp tin c tn l name. To FileWriter ghi d liu vo mt

- 78 -

tp tin c tn l name. Nu append l true th s ghi tip vo cui tp tin, ngc li th ghi ln tp tin.
Char Array Reader CharArrayReader(char[] buf) CharArrayReader(char[] buf, int off, int len) CharArrayWriter() CharArrayWriter(int size) Char Array Writer String toString() char[]toCharArray()

To ra CharArrayReader v dng buf lm vng m. To ra CharArrayReader v dng mt phn ca buf lm vng m. To ra mt CharArrayWriter. To ra mt CharArrayWriter vi vng m size k t. To ra mng k t l bn sao ca vng m ca this. To ra chui l bn sao ca vng m ca
this

vi cc byte c i thnh k t

tng ng. Ghi d liu trong vng m vo mt writer


void writeTo(Writer out)

khc. To ra mt piped reader. Stream ny cha c kt ni vi piped output stream no. To ra mt piped reader kt ni vi piped output stream src. Kt ni ti piped writer src. To ra mt piped writer. Stream ny cha c kt ni vi piped input stream no. To ra mt piped writer kt ni vi piped reader snk. Kt ni ti piped reader snk. To ra mt StringReader. To ra mt StringReader, dng vng m c kch thc mc nh. To ra mt StringReader, dng vng m

PipedReader() Piped Reader PipedReader


(PipedWriter src) connect(PipedWriter src)

PipedWriter() Piped Writer PipedWriter (PipedReader snk) connect(PipedReader snk) String Reader String StringReader(String s)

Writer StringWriter() StringWriter(int

- 79 -

initialSize) StringBuffer getBuffer()

c kch thc l initialSize. Tr v vng m ca stream.

Bng 9: Nhng phng thc c trng ca cc character stream c th

3.3.3 Cc v d
Dng file reader v file writer:
String fileName="C:\\TestC.txt"; String s="Hello File Reader/Writer!"; System.out.println("Du lieu ban dau // Ghi s vo tp tin FileWriter fw=new FileWriter(fileName); fw.write(s); fw.close(); // c tp tin vo chui sb FileReader fr=new FileReader(fileName); // c mi ln ti a 5 k t StringBuffer sb=new StringBuffer(); char ca[]=new char[5]; while (fr.ready()) { int len=fr.read(ca); sb.append(ca,0,len); } fr.close(); // Xut chui sb System.out.println("Du lieu doc duoc : "+sb); // len: s k t c c tht s : "+s);

Kt qu thc thi:
Du lieu ban dau : Hello File Reader/Writer!

Du lieu doc duoc : Hello File Reader/Writer! Press any key to continue...

Dng piped reader v piped writer:


PipedReader pr=new PipedReader(); PipedWriter pw=new PipedWriter(pr); // PipedWriter gi d liu

- 80 -

String s="Hello Piped Reader/Writer!"; System.out.println("Du lieu ghi pw.write(s); pw.close(); // PipedReader nhn d liu StringBuffer sb=new StringBuffer(); char ca[]=new char[5]; while (pr.ready()) { int len=pr.read(ca); sb.append(ca,0,len); } pr.close(); // Kt qu System.out.println("Du lieu doc duoc: "+sb); // len: s k t c c tht s // c mi ln ti a 5 k t : "+s);

Kt qu thc thi:
Du lieu ghi : Hello Piped Reader/Writer!

Du lieu doc duoc: Hello Piped Reader/Writer! Press any key to continue...

3.4

Cc lung lc d liu (Filter Stream) Bi v cc lung d liu c chuyn ti dng byte hoc k t, nn cn c mt b

bin i cc lung d liu ny sang nhng gi tr c nh kiu khc nhau. Java cung cp thm cc lung lc d liu. Khi cc lung ny c to ra, n phi c gn vi mt lung d liu c th lc n. Do vy, vic c d liu t mt ngun l s phi hp gia cc lung to thnh mt dy chuyn x l trn cc lung khi c thao tc c/ghi xy ra. Dy chuyn c bt u bi mt lung c c bn v kt thc bi mt lung lc d liu. gia c th c thm cc lung x l c trung gian. Dy chuyn ghi bt u bi mt lung x l ghi v kt thc bi mt lung ghi c bn. gia c th c cc lung x l ghi trung gian. V d:

- 81 -

Data Source
File InputStream Buffered InputStream

Chng trnh
Data InputStream

Chng trnh
Data OutputStream File Buffered OutputStream OutputStream

Data Sink

V d v dy chuyn c/ghi d liu

3.4.1 Cc lung lc tng qut


Trong Java, cc lung x l lc tng qut l cc lp tru tng sau:
FilerInputStream: lung x l

cho thao tc c d liu dng byte. thao tc ghi d liu dng byte.

FilerOutputStream: lung x l cho FilerReader: lung x l cho FilerWriter: lung x l cho

thao tc c d liu dng k t. thao tc ghi d liu dng k t.

3.4.2 Cc lung lc hin thc


Cc lung lc hin thc cc lung lc tng qut chu trch nhim hin thc cc thao tc bin i d liu c nh kiu thnh lung byte/k t hoc ngc li t lung byte/k t thnh gi tr c nh kiu. C th, cc lung lc ny l DataInputStream,
DataOutputStream.

Cc lp ny c nhng phng thc c trng nh sau: Phng thc ngha To stream c d liu theo nh dng. c mt gi tr kiu boolean.

Stream

DataInputStream Data Input Stream boolean readBoolean() (InputStream in)

Cc kiu byte, char, double, float,... cng c nhng phng thc tng ng.

- 82 -

DataOutputStream (OutputStream out) int size() Data Output Stream void writeBytes(String s) void writeChars(String s) void writeBoolean (boolean v)

To stream ghi d liu theo nh dng. Tr v s byte m stream ghi. Ghi mt bin kiu boolean. Cc kiu byte, char, double, float,... cng c nhng phng thc tng ng. Ghi chui thnh mt dy cc byte. Ghi chui thnh mt dy cc k t.

Lu : Khi c cc bin, phi c ng theo th t ghi. ghi chui hoc cc i tng khc, ta phi dng chc nng c/ghi object. Ta c th kt hp c c nh dng vi vng m.

V d: c/ghi cc bin trn tp tin


String name="C:\\TestD.txt"; // Ghi d liu DataOutputStream fo=new DataOutputStream(new FileOutputStream(name)); fo.writeBoolean(true); fo.writeInt(786); fo.writeFloat(0.123f); fo.close(); // c d liu DataInputStream (name)); boolean b=fi.readBoolean(); int i=fi.readInt(); float f=fi.readFloat(); fo.close(); // Xut d liu c c ra mn hnh System.out.println("Du lieu doc duoc: "); System.out.println(String.valueOf(b)); fi=new DataInputStream(new FileInputStream

- 83 -

System.out.println(i); System.out.println(String.valueOf(f));

Kt qu thc thi:
Du lieu doc duoc: true 786 0.123 Press any key to continue...

3.5

Cc lung m d liu tng tc c/ghi, nht l i vi thao tc c/ghi trn b nh ph, ngi ta

dng k thut vng nh m. Vng m c: d liu s c c vo vng m thnh tng khi, sau ly ra dng t t, khi ht th s c tip khi k gim s thao tc c. Vng m ghi: d liu cn ghi s c gom li n khi s lng cn thit th s c ghi mt ln gim s thao tc ghi. Nh vy, vng m cng ln th cng tng tc , nhng s cng d xy ra mt d liu khi chng trnh b chm dt t ngt. V d: ta yu cu ghi nhng do cha d liu nn chng trnh cha ghi tht s vo a, sau b cp in cc d liu c ta yu cu ghi s mt. Trong Java, cc lp lung m h tr thao tc c/ghi nh:
BufferedInputStream: c d liu

dng byte, c dng vng m dng byte, c dng vng m

BufferedOutputStream: ghi d liu BufferedReader: c d liu BufferedWriter: ghi d liu

dng k t, c dng vng m dng k t, c dng vng m

Khi to ra mt i tng lung m, n phi gn vi mt i tng lung d liu khc. Nhn chung cc lung m c nhng phng thc ging nh lung thng thng, nhng c khc bit v cch khi to:

- 84 -

Stream

Phng thc
BufferedInputStream

ngha To mt stream vng m c d liu dng byte. To mt stream vi vng m kch thc
size

Buffered (InputStream in) Input BufferedInputStream Stream (InputStream in, int size) BufferedOutputStream Buffered (OutputStream out) Output BufferedOutputStream Stream (OutputStream out, int sz) BufferedReader(Reader Buffered in) Reader BufferedReader (Reader in, int sz) BufferedWriter(Writer Buffered Writer out) BufferedWriter (Writer out, int sz) void newLine()

c d liu dng byte.

To mt stream vng m ghi d liu dng byte. To mt stream vi vng m kch thc
sz

byte ghi d liu dng byte.

To mt stream vng m c d liu dng k t. To mt stream vi vng m kch thc


sz

c d liu dng k t.

To mt stream vng m ghi d liu dng k t. To mt stream vi vng m kch thc


sz

byte ghi d liu dng byte.

Ghi k t xung dng vo stream.

Bng 10: Nhng phng thc c trng ca cc stream vng m

V d:
String fileName="C:\\TestC.txt"; String s="Hello Buffered File Reader/Writer!"; System.out.println("Du lieu ban dau // Ghi s vo tp tin BufferedWriter bw=new BufferedWriter(new FileWriter(fileName)); bw.write(s); bw.close(); // c tp tin vo chui sb BufferedReader br=new BufferedReader(new FileReader(fileName)); : "+s);

- 85 -

StringBuffer sb=new StringBuffer(); char ca[]=new char[5]; t while (br.ready()) { int len=br.read(ca); sb.append(ca,0,len); } br.close(); // Xut chui sb System.out.println("Du lieu doc duoc : "+sb); // len: s k t c c tht s // c mi ln ti a 5 k

Kt qu:
Du lieu ban dau : Hello Buffered File Reader/Writer!

Du lieu doc duoc : Hello Buffered File Reader/Writer! Press any key to continue...

Nhn vo v d trn, ta thy dng stream vng m v khng dng cho kt qu khng khc g nhau. Vy u l u im ca stream vng m? Hy xem v d k tip. V d: di y l v d so snh tc khi dng v khng dng stream vng m:
String fileName="C:\\TestB.txt"; long n=50000; // Ghi vi stream vng m { long t=System.currentTimeMillis(); FileOutputStream fo=new FileOutputStream(fileName); BufferedOutputStream bo=new BufferedOutputStream(fo); for(int i=0;i<n;i++) bo.write(i); bo.close(); t=System.currentTimeMillis()-t; System.out.println("Ghi co vung dem : mat "+t+"ms.");

- 86 -

} // Ghi khng c stream vng m { long t=System.currentTimeMillis(); FileOutputStream fo=new FileOutputStream(fileName); for(int i=0;i<n;i++) fo.write(i); fo.close(); t=System.currentTimeMillis()-t; System.out.println("Ghi khong vung dem: mat "+t+"ms."); }

Kt qu thc thi: thi gian chy rt chnh lch (kt qu c th khc nhau ty my)
Ghi co vung dem : mat 15ms.

Ghi khong vung dem: mat 1703ms. Press any key to continue...

V d: kt hp c/ghi c nh dng trn tp tin, c dng vng m


String fileName="C:\\TestB.txt"; // Ghi cc s t 0 ti 9 v cn bc 2 tng ng ca chng // To cc stream FileOutputStream fo=new FileOutputStream(fileName); BufferedOutputStream bo=new BufferedOutputStream(fo); DataOutputStream dos=new DataOutputStream(bo); // Ghi cc s for(int i=0;i<10;i++) { dos.writeInt(i); dos.writeDouble(Math.sqrt(i)); } dos.close(); /* c cc s nguyn v cn bc hai tng ng */ // To cc stream FileInputStream fi=new FileInputStream(fileName);

- 87 -

BufferedInputStream bi=new BufferedInputStream(fi); DataInputStream dis=new DataInputStream(bi); // c cc s v xut ra mn hnh while(dis.available()>0) { int i=dis.readInt(); double sinI=dis.readDouble(); System.out.println("sqrt("+i+")"+" = "+sinI); } dis.close();

Kt qu thc thi:
sqrt(0) = 0.0 sqrt(1) = 1.0 sqrt(2) = 1.4142135623730951 sqrt(3) = 1.7320508075688772 sqrt(4) = 2.0 sqrt(5) = 2.23606797749979 sqrt(6) = 2.449489742783178 sqrt(7) = 2.6457513110645907 sqrt(8) = 2.8284271247461903 sqrt(9) = 3.0 Press any key to continue...

3.6

Cc lp nh dng lung d liu nhp/xut

Java h tr hai lp i tng Scanner (thuc gi java.util.*) v PrintWriter (thuc gi java.io.*) rt hiu qu cho vic nh dng d liu ca mt lung nhp/xut. Bng i y trnh by mt s phng phc thng dng ca hai lp i tng ny. Phng thc Lp Scanner Khi to i tng Scanner ly d liu t mt
Scanner(InputStream source)

ngha

lung nhp. nhp.

Scanner(ReadableByteChannel Khi to i tng Scanner ly d liu t mt knh source)

- 88 -

void close() bool nextBoolean()

ng i tng Scanner. c mt khi d liu trong lung v p n sang kiu logic bool. c mt khi d liu trong lung v p n sang kiu s nguyn int. c mt khi d liu trong lung v p n sang kiu s nguyn long. c mt khi d liu trong lung v p n sang kiu s thc float. c mt khi d liu trong lung v p n sang kiu s thc double. c cc khi d liu trong lung v p n sang kiu chui String. kim tra lung cn khi d liu no khng. Lp PrintWriter Khi to i tng PrintWriter vit d liu ra lung xut byte out. Khi to i tng PrintWriter vit d liu ra lung xut k t out. ng i tng PrintWriter. Ghi mt chui ra lung. Ghi gi tr bool ra lung. Ghi k hiu kt thc dng ra lung Ghi mt s nguyn i v k hiu kt thc dng ra lung. Ghi mt chui s v k hiu kt thc dng ra lung. Ghi ton b d liu trong PrintWriter ra lung.

int nextInt()

long nextLong()

float nextFloat()

double nextDouble()

String nextLine() bool hasNext()

PrintWriter(OutputStream out) PrintWriter(Writer out) void close() void print(String s) void print(bool b) void println() void println(int i) void println(String s) void flush()

V d: c v ghi d liu c nh dng t hai lung nhp xut c bn System.in v System.out


import java.util.*; import java.io.*; public class NhapXuat {

- 89 -

public static void main(String[] args) { //hien thi day so vua nhap len man hinh su dung PrintWriter PrintWriter pw=new PrintWriter(System.out); //Tao doi tuong Scanner de dinh dang du lieu cho luong //nhap ban phim Scanner sc=new Scanner(System.in); //doc so luong phan tu day so can nhap pw.println("nhap so phan tu n:"); pw.flush(); int n =sc.nextInt(); //doc vao mot day so n nguyen luu vao mang int a[] =new int[n]; for(int i=0;i<n;i++){ pw.println("a[" + i+"]=");pw.flush(); a[i]=sc.nextInt(); } pw.println("Hien thi day so su dung doi tuong Printer"); for(int i=0;i<n;i++) pw.print(a[i]); pw.close(); } }

Kt qu thc hin
nhap so phan tu n: 3 a[0]=1 a[1]=2 a[2]=3 Hien thi day so su dung doi tuong Printer 1 2 3

- 90 -

3.7

Tun t ha i tng (object serialization) Object serialization l kh nng bin i mt i tng thnh mt dy byte lu

tr trn b nh ph hoc truyn i ni khc. Trong Java, object serialization c t ng ha hon ton v hu nh lp trnh vin khng phi lm g thm. mt i tng c th c "serialize", ta ch cn cho n implement interface
Serializable.

Mi vic sau nh c/ghi/truyn/nhn u do Java thc hin.

Lu : Ch c cc thuc tnh (d liu) ca i tng mi c serialize. Cc thuc tnh c nh du bng t kha transient (ngha l c tnh tm thi) s khng c serialize. Sau khi serialize, trng thi ca i tng c lu tr trn b nh ngoi c gi l persistence (ngha l c gi li mt cch bn vng). V d: to ra lp hc sinh c th c serialize:
public class HocSinh implements Serializable { protected String hoTen; protected int namSinh; protected float diemVan, diemToan; protected transient float diemTrungBinh; // ... }

3.8

Lung vit i tng

Trong Java, cc lp m nhn vic c/ghi i tng gm:


ObjectInputStream: c dy byte v chuyn ObjectOutputStream: chuyn i tng

thnh i tng ph hp.

thnh dy byte v ghi.

Cc i tng c/ghi ny cng khng th hot ng c lp m phi c lin kt vi stream khc. Chng c cc phng thc chnh nh sau:

- 91 -

Stream
Object Input Stream

Phng thc
ObjectInputStream (InputStream in) Object readObject() ObjectOutputStream

ngha To stream c i tng. c mt i tng.Nu i tng khng c khai bo trong chng trnh th s pht sinh ClassNotFoundException.

Object Output Stream

(OutputStream out) void reset() writeObject(Object obj)

To stream ghi i tng. Phc hi li stream v hy b thng tin v cc i tng m stream ghi. Ghi mt i tng.

Bng 11: Nhng thao tc c trng ca cc object stream

V d To ra lp phn s c th c serialize:
public class PhanSo implements Serializable { protected int tu,mau; private transient float val=0; public PhanSo() { tu=0; mau=1; } public PhanSo(int tu, int mau) { this.tu=tu; this.mau=mau; val=(float)tu/mau; } public String toString() { return tu+"/"+mau+" ("+val+")"; }

- 92 -

Ghi v c cc i tng phn s (c dng stream vng m):


// Ghi d liu FileOutputStream fo=new FileOutputStream("C:\\TestO.bin"); BufferedOutputStream bo=new BufferedOutputStream(fo); ObjectOutputStream oo=new ObjectOutputStream(bo); System.out.println("Du lieu ghi duoc:"); for(int i=0;i<4;i++) { int tu =(int)(Math.random()*10); int mau=(int)(Math.random()*9)+1; PhanSo ps=new PhanSo(tu,mau); oo.writeObject(ps); System.out.println(ps); } oo.close(); // c d liu FileInputStream fi=new FileInputStream("C:\\TestO.bin"); BufferedInputStream bi=new BufferedInputStream(fi); ObjectInputStream oi=new ObjectInputStream(bi); System.out.println("\nDu lieu doc duoc:"); while(bi.available()>0) { PhanSo ps=(PhanSo)oi.readObject(); System.out.println(ps); } oi.close();

Kt qu thc thi c dng nh sau (kt qu thc t s khc nhau vi mi ln chy):


Du lieu ghi duoc: 2/2 (1.0) 6/8 (0.75)

- 93 -

5/6 (0.8333333) 3/5 (0.6) Du lieu doc duoc: 2/2 (0.0) 6/8 (0.0) 5/6 (0.0) 3/5 (0.0) Press any key to continue...

Ta thy thuc tnh val khng c ghi do n l transient. Nu trong lp phn s, ta b t kha transient th kt qu s c dng nh sau:
Du lieu ghi duoc: 2/6 (0.33333334) 3/7 (0.42857143) 2/1 (2.0) 2/4 (0.5) Du lieu doc duoc: 2/6 (0.33333334) 3/7 (0.42857143) 2/1 (2.0) 2/4 (0.5) Press any key to continue...

3.9
6. 7.

Bi tp Vit chng trnh ci t tt c cc v d chong chng. Cho bit cc loi lp biu din lung d liu trong Java. Nu tnh nng chnh ca

tng loi.

- 94 -

CHNG 4 . LP TRNH A TUYN

4.1

Gii thiu Thng thng, mt s chng trnh ng dng cn x l nhiu yu cu cng mt lc

(v d chng trnh Webserver phi p tr nhiu yu cu ca nhiu my khch cng mt lc hoc mt ca s va c hnh nh ng va cho php ngi s dng nhp liu bnh thng, chng trnh son tho vn bn s va cho php bn g vn bn va chy chc nng kim li chnh t ...). Ngn ng Java cho php lp trnh a tuyn trnh. Do vy, cc ng dng mng thc hin theo c ch khch/ch c ci t d dng.

4.1.1 n tuyn trnh


Mt chng trnh thc hin n tin trnh th cc cu lnh ca chng trnh s c thc hin tun t. Nu mt lnh khng hon thnh th lnh tip theo s khng c x l. Do vy, trng thi ca chng trnh ti bt k c th d on c ang thi im no cho trc.

4.1.2 a tin trnh


Mt chng trnh c thc hin a tin trnh cho php nhiu tin trnh thc hin cng mt lc. Mi tin trnh c x l bi mt CPU ring. Vi my c nhiu CPU (hoc CPU a nhn) th vic x l ng thi l tht nhng d nhin s lnh chy cng lc khng th vt qu s CPU. Khi , vic iu phi xem tin trnh chy trn CPU no thng thng s do HH quy nh. Vi CPU (n nhn) th ch c th thc thi lnh mt cch tun t, ngha l mt CPU ch chy mt lnh trong mt thi im. Vy lm sao chng trnh a tiu trnh c th chy trn my ch c 1 CPU ? Cu tr li chnh l phng php xoay vng. Theo , h iu hnh s cp cho mi tin trnh mt CPU o v mt vng nh o, khi mi tin trnh u "tng" rng ch c mt mnh n dng CPU v b nh. Cn v thc cht, mi tin trnh s dng CPU trong mt khong thi gian ngn ri tr CPU li cho tin trnh khc s dng. Cch lm ny thc cht khng phi l ng thi nhng do vic "mn" v "tr" CPU

- 95 -

din ra rt nhanh v hon ton t ng nn ngi dng s khng cm thy iu g bt thng.

4.2

Tin trnh

Mt tuyn trnh on c th mt trong bn trng thi sau trong sut vng i ca n: Running: tin trnh ang thc thi. Suspended: vic thc thi tin trnh b tm dng v c th phc hi chy tip. Blocked: tin trnh cn dng ti nguyn nhng ti nguyn ang c tin trnh khc dng nn n phi ch. Terminated: vic thc thi ca tin trnh b ngng hn v khng th phc hi. Lp Thread lp trnh a tin trnh, lp dn xut t lp Thread c ci t sau override phng thc run(). Khi tin trnh cn chy th phng thc start() ca tin trnh c gi thc hin. Xem v d sau (file Main01.java):
public class Main01 { public static void main(String[]args) { MyThread t1=new MyThread(); // To tin trnh MyThread t2=new MyThread(); t1.start(); t2.start(); } } class MyThread extends Thread { public void run() { int i=0; // Override phng thc run // K tha lp Thread // Gi thc thi tin trnh

4.3

- 96 -

while(i<200) { System.out.println(getName()+" "+i); i++; } } }

4.4

Qun l Thread

Qun l thread gm: to thread, chnh u tin, chy thread, v dng thread.

4.4.1 To Thread
Dng cc constructor sau: Constructor
Thread() Thread(String name) Thread(Runnable target) Thread(Runnable target, String name)

ngha To Thread vi gi tr mc nh To Thread vi tn cho trc To thread lin kt vi i tng Runnable To Thread lin kt vi i tng Runnable v c tn cho trc

Nu khng dng Runnable, ta buc phi to class k tha t class Thread c sn ri override phng thc run(). Khi thread c kch hot, n s chy cc lnh trong phng thc run() ny. Do trong thc t, ta dng cc constructor ca lp dn xut ch khng dng cc constructor ca thread mt cch trc tip. V d:
class MyThread extends Thread { // ... public void run() { // ... } // ... // Override phng thc run // K tha lp Thread

- 97 -

Ri dng nh sau:
MyThread t=new MyThread(); // To tiu trnh t.start(); // Gi thc thi tiu trnh

4.4.2 Chnh u tin


Trong Java, thread c 10 mc u tin, nh s t 1 ( u tin thp nht) ti 10 ( u tin cao nht). Khi thread c to ra, n s c u tin mc nh l 5. ta c th chnh li u tin ca thread bng phng thc void setPriority(int newPriority). V d:
t.setPriority(8);

Lu : Nu truyn vo u tin khng thuc gi tr t 1 ti 10, phng thc s pht sinh


IllegalArgumentException.

u tin thp nht v cao nht c lu trong hai hng (kiu s nguyn) l
Thread.MIN_PRIORITY v Thread.MAX_PRIORITY.

4.4.3 Thc thi thread


thc thi thread, ta gi phng thc void start(). Khi c thc thi, thread s chy cc lnh trong phng thc run(). V d:
t.start();

Lu : Nu thread start() ri, vic gi start() ln na s b pht sinh exception


IllegalThreadStateException.

start() li thread, ta cn to mi thread.

4.4.4 Dng thread


dng thread ang chy, ta dng phng thc void interrupt().

- 98 -

t.interrupt();

Nu thread ang trng thi sleep, vic dng n s lm pht sinh InterruptedException.

4.4.5 Mt s phng thc qun k khc ca lp Thread


Phng thc ngha Tuyn trnh hin thi ch cho ti khi c
public final void wait(long timeout) throws InterruptedException

cnh bo hoc mt khong thi gian timeout nht nh. Nu timeout bng 0 th phng thc s ch ch cho ti khi c cnh bo v s kin. Cnh bo t nht mt tuyn trnh ang ch mt iu kin no thay i. Cc tuyn

public final void notify()

trnh phi ch mt iu kin thay i trc khi c th gi phng thc wait no . Phng thc ny cnh bo tt c cc tuyn trnh ang ch mt iu kin thay i. Cc tuyn trnh ang ch thng ch mt tuyn trnh khc thay i iu kin no . Trong s cc tuyn trnh c cnh bo, tuyn trnh no c u tin cao nht th s chy trc tin. Phng thc ny a tin trnh hin hnh

public final void notifyAll()

public static void sleep(long ms) throws InterruptedException

vo trng thi ngh ti thiu l ms (mili giy). Phng ny ginh ly quyn thc thi ca tuyn trnh hin hnh cho mt trong cc tuyn trnh khc.

public static void yeild()

4.5

Interface Runnable Nu khng th to class k tha t Thread, ta c th cho n implement interface

Runnable.

Khi , class phi hin thc phng thc void run() ca interface ny.

- 99 -

Sau , ta to thread lin kt vi Runnable thng qua constructor tng ng ca lp


Thread.

Khi thread c start, n s gi thc thi lnh trong phng thc run() ca lin kt vi n.

Runnable

V d:
public class Main09 { public static void main(String[]args) { Runnable r1=new MyRunnable(); Runnable r2=new MyRunnable(); Thread t1=new Thread(r1); Thread t2=new Thread(r2); t1.start(); t2.start(); } } class MyRunnable implements Runnable { public void run() { int i=0; while(i<200) { System.out.println(getName()+" "+i); i++; } } } // Ci t phng thc run ca Runnable // To thread lin kt // vi runnable // To runnable

Kt qu thc thi tng t khi dng cch k tha lp Thread.

- 100 -

Vic qun l Runnable, c tin hnh thng qua Thread lin kt vi n nh trnh by trong phn trc.

4.6

ng b

4.6.1 ng b ha s dng cho phng thc


Nu nhiu thread cng truy cp vo mt vng nh, li c th xy ra. ch cho php trong mt lc ch c ti a mt thread truy cp v vng nh, ta cn ng b ha bng cch dng t kha synchronized. Xem v d sau:
public class Main08 extends Thread { public static void main(String[]args) { MyThread[] T=new MyThread[3]; for(int i=0;i<T.length;i++) { T[i]=new MyThread(); T[i].start(); } } } class MyThread extends Thread { public static int x=5; public static boolean stop=false; public static /*synchronized*/ void Trans() { if (x>0) { try {

- 101 -

sleep(100); } catch(Exception E) { return; } x--; } } public void run() { do { Trans(); System.out.println("x = "+x); } while(x>0); } }

Theo on code th cc tiu trnh s ch chy khi x > 0. Kt qu thc thi khi khng ng b:
x = 4 x = 3 x = 2 x = 1 x = 0 x = -1 x = -2 Press any key to continue...

Kt qu thc thi khi c ng b:


x = 4 x = 3

- 102 -

x = 2 x = 1 x = 0 x = 0 x = 0 Press any key to continue...

Nh vy, trong thc t nu khng dng ng b ha, th li xy ra trng hp x < 0. Nguyn nhn nh sau: Khi khng ng b, lc x = 1, mt tiu trnh no kim tra thy tha yu cu > 0 v gim x. Nhng trong lc x cha kp b gim th tiu trnh khc cng kim tra v thy x vn tha nn li gim x. Kt qu l x s b gim nhiu ln v sau cng x s c gi tr m. Khi thm t kha synchronized vo, trong mt thi im ch c mt tiu trnh c truy cp vo phng thc Trans() nn s khng b li na. Mt iu cn lu l khi ng b ha, tc x l s chm hn khi khng ng b, nn ta khng c lm dng vic ng b m ch dng khi cn thit.

4.6.2 Lnh synchronized


Lnh synchronized cho php ng b ha mt i tng m khng cn yu cu bn tc ng mt phng thc synchronized trn i tng . C php
synchronized (expr) statement

Khi c c kha, statement c x l ging nh n l mt phng thc synchronized trn i tng . V d: Chuyn cc phn t trong mng thnh cc s khng m
public static void abs(int[] v) { synchronized(v) { for(int i=0;i<v.length;i++) {

- 103 -

if(v[i]<0) v[i]=-v[i]; } } }

4.7

Trao i d liu gia cc thread trao i d liu gia cc thread, ta dng cc lp PipedOutputStream (xut d

liu) v PipedInputStream (nhn d liu). Lu : cn import package java.io. kt ni stream xut v nhn, ta dng phng thc connect() ca cc pipe. Sau khi kt ni, ta dng cc phng thc read() v write() c / ghi d liu. V d:
import java.io.*; public class Multi10 { public static void main(String[]args)throws Exception { Teacher t=new Teacher(); Student s=new Student(); t.pout.connect(s.pin); //s.pin.connect(t.pout); t.start(); s.start(); } } class Teacher extends Thread { public PipedOutputStream pout=new PipedOutputStream(); // .. public void run() { // .. } // Kt ni hai Piped Stream // Tng ng vi lnh trn

- 104 -

// .. } class Student extends Thread { public PipedInputStream pin=new PipedInputStream(); // .. public void run() { // ... } // .. }

Lu : Khi thread ang c d liu t stream m stream khng c d liu, n s b lock v khng hot ng cho n khi c c d liu hoc stream ng. trnh b lock khi ang c, ta dng phng thc available() ca PipedInputStream kim tra s byte d liu ang c trong cc stream. Nu s byte tha yu cu th mi tin hnh c. trao i d liu dng text, ta dng PipedReader v PipedWrite. Cch dng cng tng t PipedInputStream v PipedOutStream.

4.8

Nhm cc tuyn trnh ThreadGroup

Cc tuyn trnh c th c to ra v c chy ring theo tng tuyn trnh. i khi, cn qun l mt nhm cc tuyn trnh ti tng thi im. i vi mt danh cch cc tuyn trnh, cn qun l cc thao tc nh tm dng, phc hi, dng hn hoc ngt. Khi , thc hin mt thao tc, cn phi gi tng tuyn trnh ra x l ring. iu ny th phc tp. Mt gii php thay th l nhm cc tuyn trnh vi nhau v p dng mt thao tc trn nhm. Java API h tr kh nng lm vic vi cc nhm tuyn trnh bng lp ThreadGroup. Mc ch ca lp ThreadGroup l biu din mt tp hp cc tuyn trnh, v cung cp cc phng thc tc ng nhanh trn tng tuyn trnh ring trong nhm. Mt nhm c th bao

- 105 -

gm nhiu tuyn trnh. Mt tin trnh c th gia nhp nhm. Tuy nhin, khng c cch no g b tuyn trnh ra khi mt nhm. Mt nhm cc tuyn trnh c th cha cc nhm tuyn trnhn khc c. Cc thao tc nh dng hoc tm dng c th c thc hin trn cc nhm con hoc nhm cha. Khi mt thao tc c p dng cho nhm cha, thao tc s c lan truyn ti nhm con .
Nhm tuyn trnh

Nhm tuyn trnh

Nhm tuyn trnh

Tuyn trnh

Tuyn trnh

Tuyn trnh

Tuyn trnh

4.8.1 To mt nhm tuyn trnh


Dng cc constructor sau: Constructor
public ThreadGroup(String name) throws java.lang.SecurityException ThreadGroup(ThreadGroup parentGroup,String name) throws java.lang.SecurityException

ngha Constructor ny to ra mt nhm tuyn trnh mi, nhm ny c tn c xc nh bi mt xu k t truyn vo nh mt tham s. To ra mt nhm tuyn trnh mi c nh danh bi tn name. N l con ca mt nhm cho truyn vo.

4.8.2 S dng mt nhm tuyn trnh


Mi khi c to ra, mt nhm tuyn trnh c th c s dng nh mt tuyn trnh bnh thng. Nhm tuyn trnh ny c th c tm dng, phc hi, ngt hoc dng bng cch

- 106 -

gi phng thc thch hp. s dng nhm tuyn trnh hiu qu th tuyn trnh phi khc rng . Nu cc tuyn trnh khng c gn vi mt nhm c th ti thi im to ra chng th sau , khng th gn mt tuyn trnh cho mt nhm sau , hoc chuyn mt tuyn trnh t nhm ny sang nhm khc. C ba constructor thc hin iu ny
Thread(ThreadGroup group, Runnable runnbale) Thread(ThreadGroup group, Runnable name) Thread(ThreadGroup group, Runnable runnbale, String name)

Mi khi to ra mt nhm cc tuyn trnh, cc phng thc sau c s dng tc ng ln nhm. Phng thc
int activeCount() int activeGroupCount() boolean allowThreadSuspension() void destroy() int enumerate(Thread[] threadList)

ngha tr v s tuyn trnh trong nhm, v cc nhm con. tr v s nhm con cc tuyn trnh ch ra tuyn trnh b tm ngng hay khng. hy b nhm tuyn trnh a cc tuyn trnh trong nhm vo mt mng cc tuyn trnh. a cc tuyn trnh trong nhm vo mt mng cc tuyn trnh. Phng thc ny a cc tuyn trnh trong nhm bao gm c cc tuyn trnh nhm con nu bin logic subgroupFlag c thit lp l true.

int enumerate(Thread[] threadList, boolean subgroupFlag) int enumerate(ThreadGroup[] groupList)

t tt c cc nhm con vo mng

4.8.3 Minh ha v lp ThreadGroup


public class GroupDemo implements Runnable{ public static void main(String args[]) throws Exception { //to ra nhm tuyn trnh ThreadGroup parent = new ThreadGroup("parent"); //to ra nhm tuyn trnh con

- 107 -

ThreadGroup subGroup; subGroup =new ThreadGroup(parent, "subgroup"); //tao ra mt s tuyn trnh trong nhm tuyn trnh cha //v nhm tuyn trnh con Thread t1 = new Thread ( parent, new GroupDemo() ); t1.start(); Thread t2 = new Thread ( parent, new GroupDemo() ); t2.start(); Thread t3 = new Thread ( subGroup, new GroupDemo() ); t3.start(); //hin th ni dung nhm parent.list(); //i ngi s dng kt thc System.out.println ("Press enter to continue"); System.in.read(); System.exit(0); } public void run(){ // khng lm g ht for(;;) { Thread.yield(); } } }

Kt qu thc hin chng trnh


C:\MyJava>java GroupDemo java.lang.ThreadGroup[name=parent,maxpri=10] Thread[Thread-0,5,parent] Thread[Thread-1,5,parent] java.lang.ThreadGroup[name=subgroup,maxpri=10] Thread[Thread-2,5,subgroup] Press enter to continue

- 108 -

4.9
8. 9. 10. ca s.

Bi tp Cho chng trnh minh hot c ch deadlock c th xy ra khi lp trnh nhiu tuyn Tm hiu vai tr ca lp trnh a tuyn trnh trong cc ng dng mng. S dng tuyn trnh trong vic vit chng trnh hin th ng h m gi ln mt

trnh khi s dng d liu chia s.

- 109 -

CHNG 5 . QUN L A CH KT NI MNG VI CC LP INETADDRES, URL V URLCONNECTION

Mng my tnh l s kt ni gia cc thit b (hay cn gi l cc node nh my tnh, router, ..) vi nhau. Cc node l my tnh c gi l host. Cc thit b c kt ni vi mng LAN c a ch vt l (MAC) duy nht. iu ny gip cho cc my khc trn mng trong vic truyn cc gi tin n ng v tr. Nhng ngi lp trnh mng khng cn phi quan tm n tng chi tit d liu c nh tuyn nh th no trong mt mng LAN. Hn na, Java khng cung cp kh nng truy xut ti cc giao thc tng lin kt d liu mc thp c s dng bi LAN. Vic h tr nh vy l rt kh khn. V mi kiu giao thc s dng mt kiu a ch khc nhau v c cc c trng khc nhau, chng ta cn cc chng trnh khc nhau cho mi kiu giao thc mng khc nhau. i vi mng Internet, a ch MAC khng h tr c vic xc nh vng mng. Do , gi tin khng th c nh tuyn ti my ch. Tuy nhin, mi node c mt a ch duy nht nhn dng, c gi l a ch Internet. nh dng a ch c s dng thng dng l IPv4. V s pht trin nhanh ca s lng my tnh trn mng Internet, nh dng a ch IPv6 c s dng m rng phm vi min a ch. Mt ng dng mng cn s dng a ch Internet nh danh v to s kt ni gia cc my tnh. Ngn ng lp trnh Java h tr giao thc TCP/IP, giao thc ny c nhim v lin kt mng. Lp InetAddress, lp URL v URLConnection c cung cp qun l a ch kt ni mng Internet. t bit lp InetAddress c s dng dng bi cc lp Socket, ServerSocket, URL, DatagramSocket, Datagrampacket, .. trong cc chng trnh ng dng mng.

5.1

Lp InetAddress Lp InetAddress nm trong gi java.net v biu din mt a ch Internet bao gm

hai thuc tnh c bn: hostName (String) v address (int[]).

- 110 -

5.1.1 To cc i tng InetAddress


Lp InetAddress khng ging vi cc lp khc, khng c cc constructor cho lp InetAddress. Tuy nhin, lp InetAddress c ba phng thc tnh tr v cc i tng InetAddress Cc phng thc trong lp InetAddress Phng thc
public static InetAddress InetAddress.getByName(Stri ng hostname) public static InetAddress[] InetAddress.getAllByName(S tring hostname) public static InetAddress InetAddress.getLocalHost()

ngha Cung cp tn min, v hm tr v i tng InetAddress. Cung cp tn min v tr v tt c a ch InetAddress c th c. tr v i tng InetAddress biu din a ch Internet ca my ng chy chng trnh.

Tt c cc phng thc ny u thc hin kt ni ti server DNS bit c cc thng tin trong i tng InetAddress V d:
try{ InetAddress dc =InetAddress.getByName(www.microsoft.com); System.out.println(dc); } catch(UnknownHostException e) { System.err.println(e); }

V d : Vit chng trnh nhn tn min t i dng lnh v in ra a ch IP tng ng vi tn min .


import java.net.*; public class { public static void main(String[] args) { TimDCIP

- 111 -

try{ if(args.length!=1) { System.out.println("Cach su dung: java TimDCIP <Hostname>"); } InetAddress host = InetAddress.getByName(args[0]); String hostName = host.getHostName(); System.out.println("Host name:"+hostName); System.out.println("Dia chi IP:"+host.getHostAddress()); }catch(UnknownHostException e) { System.out.println("Khong tim thay dia chi"); return; } } }

5.1.2 Cc thao tc i d liu ca mt i tng InetAddress


Ch c cc lp trong gi java.net c quyn truy xut ti cc trng ca lp InetAddress. Cc lp trong gi ny c th c d liu ca mt i tng InetAddress bng cch gi phng thc getHostname v getAddress(). Phng thc ngha Phng thc ny tr v mt xu biu din
public String getHostName()

hostname ca mt i tng InetAddress. Nu my khng c hostname, th n s tr v a ch IP ca my ny di dng mt xu k t. Tr v mt a ch IP di dng mt mng cc

public byte[] getAddress()

byte.

V d :Vit chng trnh nhp mt tn min t i dng lnh v in ra dng thng bo cho bit a ch IP tng ng vi a ch IP thuc lp no.
import java.net.*;

- 112 -

public class {

PhanLoaiDCIP

public static void main(String[] args) { try{ if(args.length!=1) { System.out.println("Cach su dung: java TimDCIP <Hostname>"); } InetAddress host = InetAddress.getByName(args[0]); String hostName = host.getHostName(); System.out.println("Host name:"+hostName); System.out.println("Dia chi IP:"+host.getHostAddress()); byte[] b=host.getAddress(); int i=b[0]>=0?b[0]:256+b[0]; if((i>=1)&(i<=126)) System.out.println(host+" thuoc dia chi lop A"); if((i<=191)&(i>=128)) System.out.println(host+" thuoc dia chi lop B"); if((i<=223)&(i>=192)) System.out.println(host+" thuoc dia chi lop C"); }catch(UnknownHostException e){ System.out.println("Khong tim thay dia chi"); return; } } }

Ch : Dng lnh int i=b[0]>=0?b[0]:256+b[0] lm nhim v chuyn i s nguyn c du dng b 2 v dng s nguyn khng du.

5.1.3 Cc phng thc kim tra a ch IP


Phng thc ngha

- 113 -

Kim tra xem mt lin kt mng c thit lp hay cha. Nu host p ng trong khong thi gian timeout mili giy, cc phng thc ny tr v gi
public boolean isReachable(int timeout) throws IOException

tr true nu n c, ngc li n tr v gi tr false. Ch . Cc lin kt c th b phong ta v nhiu nguyn nhn nh firewall, cc server y quyn, cc router hot ng sai chc nng, dy cp b t, hoc host xa khng bt. Kim tra c th to kt ni ti a ch mng ny hay khng bng cch thc hin mt ICMP ECHO REQUEST hoc thit lp kt ni TCP ti cng 7 (Echo) ca my ch. netif null hoc giao din bt k. ttl s lng ti a cc hops, mc nh l 0. timeout thi gian xem xt ti a, mili giy. Kim tra c l a ch Multicast hay khng, true nu ng, ngc li l false. Kim tra a ch ny c l a ch loopback khng. Kim tra a ch ny c l a ch cc b khng. Tin li trong vic nh tuyn.

public boolean isReachable(NetworkInterfa ce netif, int ttl, int timeout) throws IOException

public boolean isMulticastAddress() public boolean isLoopbackAddress() public boolean isSiteLocalAddress()

5.2

Lp URL Ngn ng Java h tr vic nh v v ly d liu thng qua a ch URL (Uniform

Resource Locator) bng lp i tng URL. Lp i tng ny cho php chng trnh giao tip vi Server ly d liu v da trn cc giao thc chun c h tr bi Server. Vic xc nh Server, giao thc, cng nh cng dch v, ng dn l da vo URL c cung cp cho lp i tng URL. Do vy, lp URL qun l cc thng tin lin quan n vic nh v ti nguyn nh sau: giao thc (protocol), tn min (hostname), cng (port), ng dn (path), tn tp tin (filename), mc ti liu (document section). Cc thng tin ny c th thit lp c lp.

- 114 -

5.2.1 To cc URL
Trong vic to i tng URL, c bn hm khi to h tr ng vi cc trng hp khc nhau ca vic cung cp tham s v nh v ngun ti nguyn URL. Tt c cc hm khi to ny u nm ra ngoi l MalformedURLException nu URL khng ng khun dng. Hm khi to
public URL(String url) throws MalformedURLException public URL(String protocol, String host, String file) throws MalformedURLException public URL(String protocol, String host, int port, String file) throws MalformedURLException public URL(URL u, String s) throws MalformedURLException

ngha To i tng URL vi chui url. To i tng URL vi tng phn tch bit: giao thc, tn min, tn tp tin, (cng s thit lp l -1, s dng dng cng mc nh ca giao thc ) . To ra i tng URL vi y cc thng tin nh giao thc, tn min, s hiu cng, tn tp tin. To ra i tng URL t mt i tng URL khc.

V d
try{ URL u = new URL(http://www.sun.com/index.html); } catch(MalformedURLException e) { System.err.println(e); }

V d
try{ URL u = new URL("http","/www.sun.com","index.html"); } catch(MalformedURLException e){ System.err.println(e); }

- 115 -

V d
try{ URL u = new URL("http","/www.sun.com",80,"index.html"); } catch(MalformedURLException e){ System.err.println(e); }

V d
URL u1,u2; try{ URL u1= new URL("http://www.macfaq.com/index.html"); URL u2 = new URL(u1,"vendor.html"); } catch(MalformedURLException e) { System.err.println(e); }

5.2.2 Nhn thng tin cc thnh phn ca URL


URL c su trng thng tin trong lp URL: tn min, a ch IP, giao thc, cng, tp tin, mc tham chiu ti liu. Cc phng thc
public String getProtocol() public String getHost() public int getPort() public int getDefaultPort() public String getFile()

ngha tr v mt xu k t biu din giao thc tr v mt xu k t biu din tn min tr v mt s nguyn kiu int biu din s hiu cng. tr v s hiu cng mc nh cho giao thc. tr v mt xu k t cha ng dn tp tin

V d: Vit chng trnh nhp vo mt URL t i dng lnh v hin th tng thnh phn to nn URL ln mn hnh.
//Chng trnh ly thng tin ca URL vi url nhp t bn phm import java.net.*;

- 116 -

class GetURLParts{ public static void main(String[] args) try{ URL u = new URL(args[0]); System.out.println("URL is "+u); System.out.println("The protocol part is"+u.getProtocol()); System.out.println("The host part is "+u.getHost()); System.out.println("The file part is "+u.getFile()); }catch(MalformedURLException e){ System.err.println(e); } } } {

Kt qu thc hin chng trnh nh sau:


javac GetURLParts.java java GetURLParts http://it.hutech.edu.vn/KhoaCNTT/index.php URL is http://it.hutech.edu.vn/KhoaCNTT/index.php The protocol part is http The host part is it.hutech.edu.vn The file part is /KhoaCNTT/index.php

V d: kim tra giao thc c h tr bi lp URL.


/* kiem tra kieu giao thuc nao duoc may ao ho tro */ import java.net.*; public class ProtocolTester { public static void main(String[] args) { // hypertext transfer protocol testProtocol("http://www.adc.org"); // secure http testProtocol("https://www.amazon.com/exec/obidos/order2/"); // file transfer protocol testProtocol("ftp://metalab.unc.edu/pub/languages/java/javafaq/"); // Simple Mail Transfer Protocol testProtocol("mailto:elharo@metalab.unc.edu");

- 117 -

// telnet testProtocol("telnet://dibner.poly.edu/"); // local file access testProtocol("file:///etc/passwd"); // gopher testProtocol("gopher://gopher.anc.org.za/"); // Lightweight Directory Access Protocol testProtocol("ldap://ldap.itd.umich.edu/o=University + "%20of%20Michigan,c=US?postalAddress"); // JAR testProtocol("jar:http://cafeaulait.org/books/javaio/" + "ioexamples/javaio.jar!/com/macfaq/io/StreamCopier.class"); // NFS, Network File System testProtocol("nfs://utopia.poly.edu/usr/tmp/"); // a custom protocol for JDBC testProtocol("jdbc:mysql://luna.metalab.unc.edu:3306/NEWS"); // rmi, a custom protocol for remote method invocation testProtocol("rmi://metalab.unc.edu/RenderEngine"); // custom protocols for HotJava testProtocol("doc:/UsersGuide/release.html"); testProtocol("netdoc:/UsersGuide/release.html"); } private static void testProtocol(String url) { try { URL u = new URL(url); System.out.println(u.getProtocol( ) + " is supported"); } catch (MalformedURLException ex) { String protocol = url.substring(0, url.indexOf(':')); System.out.println(protocol + " is not supported"); } } }

Kt qu thc hin:
java ProtocolTester

- 118 -

http is supported https is supported ftp is supported mailto is supported telnet is not supported file is supported gopher is supported ldap is not supported jar is supported nfs is not supported jdbc is not supported rmi is not supported doc is supported netdoc is supported

5.2.3 Nhn d liu t my ch trong URL


Sau khi xc nh c thng tin ti nguyn ca dch v my ch, i tng URL h tr cc phng thc ly d liu t my my ch v. Cc phng thc ngha Phng thc ny kt ni ti mt ti nguyn c tham chiu bi mt URL, thc hin c ch bt tay cn thit gia client v server, v tr v mt lung nhp InputStream. Ta s dng lung ny c d
public final InputStream openStream() throws java.io.IOException

liu. D liu nhn t lung ny l d liu th ca mt tp tin m URL tham chiu (m ASCII nu c mt tp vn bn, m HTML nu c mt ti liu HTML, mt nh nh phn nu ta c mt file nh). N khng c cc thng tin header v cc thng tin c lin quan n giao thc

public URLConnection openConnection() throws java.io.IOException

Phng thc openConnection() m mt socket ti mt URL xc nh v tr v mt i tng URL. Mt i tng URLConnection biu din mt lin kt m ti mt ti nguyn mng. Nu li gi

- 119 -

phng thc tht bi n a ra ngoi l IOException. Phng thc getContent() tm kim d liu c tham chiu bi mt URL v chuyn n thnh mt kiu i tng no . Nu i tng tham chiu ti mt kiu i tng vn bn no nh tp tin
public final Object getContent() throws java.io.IOException

ASCII hoc tp HTML, i tng c tr v thng thng s l mt kiu lung nhp InputStream no . Nu URL tham chiu ti mt i tng nh nh nh GIF hoc JPEG th phng thc getContent() tr v i tng java.awt.ImageProducer

V d:Vit chng trnh nhp mt URL t bn phm, kt ni vi Internet v hin th m ngun ca trang Web ln mn hnh.
import java.net.*; import java.io.*; public class { public static void main(String[] args) { URL u; String thisLine; if(args.length>0){ try{ u =new URL(args[0]); try{ DataInputStream dis = new DataInputStream(u.openStream()); while((thisLine=dis.readLine())!=null) System.out.println(thisLine); }catch(IOException e) { System.err.println(e); ViewSource

- 120 -

} }catch(MalformedURLException e){ System.err.println(e); } } } }

5.3

Lp URLConnection URLConnection l mt lp tru tng biu din mt lin kt ti mt ti nguyn

c xc nh bi mt url. Lp URLConnection cung cp nhiu kh nng iu khin hn so vi lp URL thng qua vic tng tc vi mt server. Hn na, lp i tng ny cho php gi d liu n Server v c thng tin p tr t Server (ty thuc giao thc m Server c h tr). Vic to ra i tng hin thc lp URLConnection bng phng thc openConnection ca lp URL. s dng lp URLConnection, thc hin cc bc c bn sau: Xy dng mt i tng URL. Gi phng thc openConnection() ca i tng URL tm kim mt i tng URLConnection cho URL . Cu hnh i tng URL. c cc trng header. Nhn mt lung nhp v c d liu. Nhn mt lung xut v ghi d liu. ng lin kt.

Mt s phng thc h tr cho vic thao tc vi lp URLConnection. Cc phng thc


public InputStream getInputStream() public OutputStream getOutputStream()

ngha tr li mt lung c d liu t my ch. tr v mt lung OutputStream trn bn c th ghi d liu truyn ti my ch.

- 121 -

V d: c d liu l mt t web p tr t mt web Server my ch.


import java.net.*; import java.io.*; public class ViewSource { public static void main(String[] args) { String thisLine; URL u; URLConnection uc; if(args.length>0) { try{ u =new URL(args[0]); try{ uc=u.openConnection(); DataInputStream theHtml; theHtml = new DataInputStream(uc.getInputStream()); try{ while((thisLine=theHtml.readLine())!=null) { System.out.println(thisLine); } } catch(Exception e) { System.err.println(e); } } catch(Exception e) { System.err.println(e); } }

- 122 -

catch(MalformedURLException e) { System.err.println(args[0]+" is not a parseable URL"); System.err.println(e); } } } }

V d: Gi d liu ln WebServer ca my ch
try{ URL u = new URL(http://www.somehost.com/cgi-bin/acgi); URLConnection uc = u.openConnection(); uc.setDoOutput(true); DataOutputStream dos; dos = new DataOutputStream(uc.getOutputStream()); dos.writeByte("Herre is some data"); }catch(Exception e) { System.err.println(e); }

Ngoi ra lp URLConnection cn h tr mt s phng thc xem thng tin v tp tin v cc phng thc cho php nhn v phn tch thng tin Header ca giao thc HTTP. Cc phng thc
public int getContentLength() public long getDate()

ngha tr v di ca trng header. tr v mt s nguyn kiu long cho bit ti liu c gi khi no. Phng thc ny tr v String cho ta bit cch thc m ha. Nu ni dung c gi khng c m ha (nh trong trng hp ca HTTP server), phng thc ny tr v gi tr null.

public String getContentEncoding() public long getLastModified() public Map

tr v ngy m ti liu c sa i ln cui tr li thng tin trng Header p tr bi Server

- 123 -

getHeaderFields() public String getHeaderField(String name)

my ch. tr v gi tr ca thnh phn trng header ng vi tn name.

V d, tm gi tr ca cc trng header Content-type, Content-encoding ca mt i tng URLConnection uc bn c th vit:


uc.getHeaderField("content-type"); uc.getHeaderField("content-encoding");

nhn thng tin v cc trng Date, Content-length, hoc Expiration bn cng thc hin tng t:
uc.getHeaderField("date"); uc.getHeaderField("expires"); uc.getHeaderField("Content-length");

- 124 -

CHNG 6 . LP TRNH SOCKET CHO THC TCP

6.1

M hnh client/server Cc ng dng mng thng hot ng theo m hnh client/server nh th in t,

truyn nhn tp tin, game trn mng, ... M hnh ny gm c mt chng trnh ng vai tr l client v mt chng trnh ng vai tr l server. Hai chng trnh ny s giao tip vi nhau thng qua mng. Chng trnh server ng vai tr cung cp dch v. Chng trnh ny lun lun lng nghe cc yu cu t pha client, ri tnh ton v p tr kt qu tng ng. Chng trnh client cn mt dch v v gi yu cu dch v ti chng trnh server v i p tr t server. Nh vy, qu trnh trao i d liu gia client/server bao gm: Truyn mt yu cu t chng trnh client ti chng trnh server Yu cu c server x l Truyn p ng cho client

Client Server

Request message

Wait

Reply Execution

Request message

Tin trnh ang x l

Tin trnh ang phong ta

- 125 -

M hnh truyn tin ny thc hin truyn hai thng ip qua li gia client v server mt cch ng b ha. Chng trnh server nhn c thng ip t client th n pht ra yu cu client chuyn sang trng thi ch (tm dng) cho ti khi client nhn c thng ip p ng do server gi v. M hnh client/server thng c ci t da trn cc thao tc c bn l gi (send) v nhn (receive).

6.2

M hnh truyn tin socket

Chng trnh client v server s dng giao thc vn chuyn gi v nhn d liu. Mt v d l giao thc TCP/IP c s dng giao tip qua mng Internet.

Clien t

Serve r

Tng vn chuyn Tng Internet Tng Host to network Internet

Tng vn chuyn Tng Internet Tng Host to network

TCP v UDP l cc giao thc tng giao vn truyn d liu. Mi giao thc c nhng u v nhc im ring. Chng hn, giao thc TCP c tin cy truyn tin cao, nhng tc truyn tin b hn ch do phi c giai on thit lp v gii phng lin kt khi truyn tin, khi gi tin c li hay b tht lc th giao thc TCP phi c trch nhim truyn li,Ngc li, giao thc UDP c tc truyn tin rt nhanh v n ch c mt c ch truyn tin rt n gin: khng cn phi thit lp v gii phng lin kt. D liu c truyn trn mng Internet di dng cc gi (packet) c kch thc hu hn c gi l datagram. Mi datagram cha mt header v mt payload. Header cha a ch v cng cn truyn gi tin n, cng nh a ch v cng xut pht ca gi tin, v cc thng tin khc c s dng m bo tin cy truyn tin, payload cha d liu. Tuy nhin do cc datagram c chiu di hu hn nn thng phi phn chia d liu thnh nhiu gi v khi phc li d liu ban u t cc gi ni nhn. Trong qu trnh truyn tin c th c th c mt hay nhiu gi b mt hay b hng v cn phi truyn li hoc cc gi tin n khng theo ng trnh t. trnh nhng iu ny, vic phn chia d liu thnh

- 126 -

cc gi, to cc header, phn tch header ca cc gi n, qun l danh sch cc gi nhn c v cc gi cha nhn c, ... rt nhiu cng vic cn phi thc hin, v i hi rt nhiu phn mm phc tp. gii quyt bi ton ny, i hc UC Berkeley a ra khi nim Socket. Chng cho php ngi lp trnh xem mt lin kt mng nh l mt lung m c th c d liu ra hay ghi d liu vo t lung ny. Cc Socket che du ngi lp trnh khi cc chi tit mc thp ca mng nh kiu ng truyn, cc kch thc gi, yu cu truyn li gi, cc a ch mng... Mt socket c th thc hin by thao tc c bn: Kt ni vi mt my xa (v d, chun b gi v nhn d liu) Gi d liu Nhn d liu Ngt lin kt Gn cng Nghe d liu n Chp nhn lin kt t cc my xa trn cng c gn

C nhiu kiu Socket khc nhau tng ng vi mi kiu giao thc c s dng giao tip gia hai my trn mng Internet. i vi chng giao thc TCP/IP, c hai kiu Socket chnh c s dng l stream socket v datagram socket. Stream socket s dng giao thc TCP cung cp dch v gi d liu tin cy. Datagram socket s dng giao thc UDP cung cp dch v gi gi tin n gin. Ngn ng lp trnh Java h tr lp Socket v ServerSocket cho kiu stream socket v lp DatagramPacket v DatagramSocket cho kiu datagram socket. i vi kiu stream socket, lp Socket c s dng bi c client v server. Lp Socket ny c cc phng thc tng ng vi bn thao tc u tin ca thao tc c bn ca socket trnh by trn. Ba thao tc cui c h tr bi server ch cc client lin kt ti. Cc thao tc ny c ci t bi lp ServerSocket.

- 127 -

6.3

TCP client - Socket

Client thit lp giao tip vi server v i s p tr t Server. Cc socket cho client thng c s dng theo cc bc sau: To ra mt Socket mi s dng hm khi to vi a ch IP v s hiu cng dch v ca my ch. Socket c gng lin kt vi socket server ca my ch. Sau khi lin kt c thit lp, ly lung nhp v lung xut c to ra gia socket my gi - client v socket my ch server. Cc lung ny c s dng gi d liu cho nhau. Kiu lin kt ny c gi l song cng (fullduplex) cc host c th nhn v gi d liu ng thi. ngha ca d liu ph thuc vo giao thc. Khi vic truyn d liu hon thnh, mt hoc c hai pha ngt lin kt. Mt s giao thc, nh HTTP, i hi mi lin kt phi b ng sau mi khi yu cu c phc v. Cc giao thc khc, chng hn FTP, cho php nhiu yu cu c x l trong mt lin kt n.

6.3.1 Cc hm khi to ca lp Socket


Hm khi to
public Socket(String host, int port) throws UnknownHostException, IOException

ngha Hm ny to mt socket TCP vi host v cng xc nh, v thc hin lin kt vi host xa. to mt socket TCP vi thng tin l a ch ca mt host c xc nh bi mt i tng InetAddres v s hiu cng port, sau n thc hin kt ni ti host. N a ra ngoi l IOException nhng khng a ra ngoi l UnknownHostException. Constructor a ra ngoi l trong trng hp khng kt ni c ti host.

public Socket(InetAddress host, int port)throws IOException

public Socket (String host, int port, InetAddress interface, int localPort) throws

to ra mt socket vi thng tin l a ch IP c biu din bi mt i tng String v mt s hiu cng v thc hin kt ni ti host . Socket kt

- 128 -

ni ti host xa thng qua mt giao tip mng v s hiu cng cc b c xc nh bi hai tham s
IOException, UnknownHostException

sau. Nu localPort bng 0 th Java s la chn mt cng ngu nhin c sn nm trong khong t 1024 n 65535.

public Socket (InetAddress host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException

Constructor ch khc constructor trn ch a ch ca host lc ny c biu din bi mt i tng InetAddress.

V d. To ra mt TCP socket kt ni ti webserver ca Vietnamnet


try{ //ket noi voi may chu web cua Vietnamnet Socket s = new Socket("www.vnn.vn",80); } catch(UnknownHostException e){ System.err.println(e); } catch(IOException e){ System.err.println(e); }

Trong on code trn, nu my ch vi tn min khng xc nh hoc my ch tn min khng hot ng th hm khi to s a ra ngoi l UnknownHostException. Nu v mt l do no m khng th m c socket th hm khi to s a ra ngoi l IOException. V d: Vit chng trnh kim tra trn 1024 cng u tin nhng cng no ang c server hot ng
import java.net.*; import java.io.*; class PortScanner { public static void main(String[] args) {

- 129 -

String host="localhost"; if(args.length>0){ host=args[0]; } for(int i=0;i<1024;i++){ try{ Socket s=new Socket(host,i); System.out.println("Co mot server dang hoat dong } catch(UnknownHostException e){ System.err.println(e); } catch(IOException e){ System.err.println(e); } } } tren cong:"+i);

6.3.2 Cc phng thc phc v giao tip gia cc Socket


Cc phng thc
public InetAddress getInetAddress() public int getPort() public int getLocalPort() public InetAddress getLocalAddress() public InputStream getInputStream() throws IOException

ngha Cho trc mt i tng Socket, phng thc getInetAddress() cho tr li a ch my ch bng i tng InetAddress. Ly s hiu cng dch v ca my ch. tr li a ch cng s dng my cc b. tr li a ch mng ca my cc b dng giao tip vi my xa. tr v mt lung nhp c d liu t mt socket vo chng trnh. Thng thng ta c th gn kt lung nhp th InputStream ti mt lung lc hoc mt lung k t nhm a cc chc nng tin ch (chng hn nh cc lung InputStream, hoc

- 130 -

InputStreamReader). tng cao hiu nng, ta c th m d liu bng cch gn kt n vi lung lc BufferedInputStream hoc BufferedReader. tr v mt lung xut th ghi d liu t ng dng ra u cui ca mt socket. Thng thng, ta
public OutputStream getOutputStream() throws IOException

s gn kt lung ny vi mt lung tin li hn nh lp DataOuputStream hoc OutputStreamWriter trc khi s dng n. tng hiu qu ghi.

Hai phng thc getInputStream() v getOutputStream() l cc phng thc cho php ly v cc lung d liu nhp v xut. nhn d liu t mt my xa, mt lung nhp t socket c nhn v c d liu t lung . ghi d liu ln mt my xa, mt lung xut c nhn t socket v ghi d liu ln lung. Di y l hnh v minh ha trc quan.
OutputStream

Chng trnh InputStream

Socket

6.3.3 Cc phng thc ng Socket


Khi giao tip gia client v server c thc hin xong, cn thit phi ng knh kt ni li. Di y l cc phng thc h tr ng kt ni. Cc phng thc
public void close() throws IOException public void shutdownInput() throws IOException public void shutdownOutput() throws IOException public boolean isOutputShutdown() public boolean

ngha ng lung kt ni li. ng mt lung nhp.

ng lung xut. kim tra lung xut ng cha. kim tra lung nhp ng cha.

- 131 -

isInputShutdown()

Cc socket c ng mt cch t ng khi mt trong hai lung ng li, hoc khi chng trnh kt thc, hoc khi socket c thu hi bi gabbage collector. Tuy nhin, thc t cho thy vic cho rng h thng s t ng socket l khng tt, c bit l khi cc chng trnh chy trong khong thi gian v hn. Mi khi mt Socket b ng li, cc trng thng tin InetAddress, a ch cc b, v s hiu cng cc b vn c th truy xut ti c thng qua cc phong thc getInetAddress(), getPort(), getLocalHost(), v getLocalPort(). Tuy nhin khi ta gi cc phng thc getInputStream() hoc getOutputStream() c d liu t lung c InputStream hoc ghi d liu OuputStream th ngoi l IOException c a ra.

6.3.4 Cc phng thc thit lp cc ty chn cho Socket


TCP_NODELAY: Thit lp gi tr TCP_NODELAY l true m bo rng cc gi tin c gi i nhanh nht c th m khng quan tm n kch thc ca chng. Thng thng, cc gi tin nh c kt hp li thnh cc gi tin ln hn trc khi c gi i. Trc khi gi i mt gi tin khc, host cc b i nhn cc xc thc ca gi tin trc t h thng xa.
public void setTcpNoDelay(boolean on) throws SocketException public boolean getTcpNoDelay() throws SocketException

SO_LINGER: Ty chn SO_LINGER xc nh phi thc hin cng vic g vi datagram vn cha c gi i khi mt socket b ng li. ch mc nh, phng thc close() s c hiu lc ngay lp tc; nhng h thng vn c gng gi phn d liu cn li. Nu SO_LINGER c thit lp bng 0, cc gi tin cha c gi i b ph hy khi socket b ng li. Nu SO_LINGER ln hn 0, th phng thc close() phong ta ch cho d liu c gi i v nhn c xc thc t pha nhn. Khi ht thi gian qui nh, socket s b ng li v bt k phn d liu cn li s khng c gi i.
public void setSoLinger(boolean on, int seconds) throws SocketException public int getSoLinger() throws SocketException

SO_TIMEOUT: Thng thng khi ta c d liu t m socket, li gi phng thc phong ta cho ti khi nhn s byte. Bng cch thit lp phng thc SO_TIMEOUT, ta s

- 132 -

m bo rng li gi phng thc s khng phong ta trong khong thi gian qu s giy quy nh.
public void setSoTimeout(int milliseconds) throws SocketException public int getSoTimeout() throws SocketException

6.3.5 Mt s v d chng trnh client giao tip trn mt s dch v chun


Finger l giao thc n gin c miu t trong RFC 1288. Finger s dng giao thc TCP trn cng dch v 79. Giao thc ny c s dng xem thng tin ngi s dng ng nhp h thng my tnh xa.

6.4

Lp ServerSocket

Lp ServerSocket c mi th ta cn vit cc server bng Java. N c cc constructor to cc i tng ServerSocket mi, cc phng thc lng nghe cc lin kt trn mt cng xc nh, v cc phng thc tr v mt Socket khi lin kt c thit lp, v vy ta c th gi v nhn d liu. Vng i ca mt server 1. Mt ServerSocket mi c to ra trn mt cng xc nh bng cch s dng mt constructor ServerSocket. 2. ServerSocket lng nghe lin kt n trn cng bng cch s dng phng thc accept(). Phng thc accept() phong ta cho ti khi mt client thc hin mt lin kt, phng thc accept() tr v mt i tng Socket m lin kt gia client v server. 3. Ty thuc vo kiu server, hoc phng thc getInputStream(), getOutputStream() hoc c hai c gi nhn cc lung vo ra truyn tin vi client. 4. server v client tng tc theo mt giao thc tha thun sn cho ti khi ngt lin kt. 5. Server, client hoc c hai ngt lin kt 6. Server tr v bc hai v i lin kt tip theo.

- 133 -

6.4.1 Cc constructor
public ServerSocket(int port) throws IOException, BindException

Constructor ny to mt socket cho server trn cng xc nh. Nu port bng 0, h thng chn mt cng ngu nhin cho ta. Cng do h thng chn i khi c gi l cng v danh v ta khng bit s hiu cng. Vi cc server, cc cng v danh khng hu ch lm v cc client cn phi bit trc cng no m n ni ti (ging nh ngi gi in thoi ngoi vic xc nh cn gi cho ai cn phi bit s in thoi lin lc vi ngi ). V d: to mt server socket cho cng 80
try{ ServerSocket httpd = new ServerSocket(80); } catch(IOException e) { System. err.println(e); }

Constructor a ra ngoi l IOException nu ta khng th to v gn Socket cho cng c yu cu. Ngoi l IOException pht sinh khi: V d;
import java.net.*; import java.io.*; public class congLocalHost { public static void main(String[] args) { ServerSocket ss; for(int i=0;i<=1024;i++) { try{ ss= new ServerSocket(i); ss.close();

Cng c s dng Khng c quyn hoc c lin kt vi mt cng nm gia 0 v 1023.

- 134 -

} catch(IOException e) { System.out.println("Co mot server tren cong "+i); } } } }

public ServerSocket(int port, int queuelength, InetAddress bindAddress)throws IOException

Constructor ny to mt i tng ServerSocket trn cng xc nh vi chiu di hng i xc nh. ServerSocket ch gn cho a ch IP cc b xc nh. Constructor ny hu ch cho cc server chy trn cc h thng c nhiu a ch IP.

6.4.2 Chp nhn v ngt lin kt


Mt i tng ServerSocket hot ng trong mt vng lp chp nhn cc lin kt. Mi ln lp n gi phng thc accept(). Phng thc ny tr v mt i tng Socket biu din lin kt gia client v server. Tng tc gi client v server c tin hnh thng qua socket ny. Khi giao tc hon thnh, server gi phng thc close() ca i tng socket. Nu client ngt lin kt trong khi server vn ang hot ng, cc lung vo ra kt ni server vi client s a ra ngoi l InterruptedException trong ln lp tip theo public Socket accept() throws IOException

Khi bc thit lp lin kt hon thnh, v ta sn sng chp nhn lin kt, cn gi phng thc accept() ca lp ServerSocket. Phng thc ny phong ta; n dng qu trnh x l v i cho ti khi client c kt ni. Khi client thc s kt ni, phng thc accept() tr v i tng Socket. Ta s dng cc phng thc getInputStream() v getOutputStream() truyn tin vi client. V d:
try{ ServerSocket theServer = new ServerSocket(5776); while(true) {

- 135 -

Socket con = theServer.accept(); PrintStream p = new PrintStream(con.getOutputStream()); p.println(Ban da ket noi toi server nay. Bye-bye now.); con.close(); } } catch(IOException e) { System.err.println(e); }

public void close() throws IOException

Nu ta kt thc lm vic vi mt i tng server socket th cn phi ng li i tng ny. V d: Ci t mt server daytime
import java.net.*; import java.io.*; import java.util.Date; public class daytimeServer{ public final static int daytimePort =13; public static void main(String[]args) { ServerSocket Socket con; PrintStream p; try{ theServer = new ServerSocket(daytimePort); try{ p= new PrintStream(con.getOutputStream()); p.println(new Date()); con.close(); } catch(IOException e) { theServer;

- 136 -

theServer.close(); System. err.println(e); } } catch(IOException e) { System. err.println(e); } } }

public void close() throws IOException

Nu hon thnh cng vic vi mt ServerSocket, ta cn phi ng n li, c bit nu chng trnh ca ta tip tc chy. iu ny nhm to iu kin cho cc chng trnh khc mun s dng n. ng mt ServerSocket khng ng nht vi vic ng mt Socket.

Lp ServerSocket cung cp mt s phng thc cho ta bit a ch cc b v cng m trn i tng server ang hot ng. Cc phng thc ny hu ch khi ta m mt i tng server socket trn mt cng v danh v trn mt giao tip mng khng public InetAddress getInetAddress()

Phng thc ny tr v a ch c s dng bi server (localhost). Nu localhost c a ch IP, a ch ny c tr v bi phng thc InetAddress.getLocalHost() V d:
try{ ServerSocket httpd = new ServerSocket(80); InetAddress ia = httpd.getInetAddress(); } { catch(IOException } e)

public int getLocalHost()

Cc contructor ServerSocket cho php ta nghe d liu trn cng khng nh trc bng cch gn s 0 cho cng. Phng thc ny cho php ta tm ra cng m server ang nghe.

- 137 -

6.5

Cc bc ci t chng trnh pha Client bng Java

Sau khi tm hiu cc lp v cc phng thc cn thit ci t chng trnh Socket. mc 6 v mc 7 chng ta s i vo cc bc c th ci t cc chng trnh Client v Server. Cc bc ci t Client Bc 1:To mt i tng Socket
Socket client =new Socket(hostname,portName);

Bc 2:To mt lung xut c th s dng gi thng tin ti Socket


PrintWriter out=new PrintWriter(client.getOutputStream(),true);

Bc 3:To mt lung nhp c thng tin p ng t server


BufferedReader in=new InputStreamReader(client.getInputStream())); BufferedReader(new

Bc 4:Thc hin cc thao tc vo/ra vi cc lung nhp v lung xut i vi cc lung xut, PrintWriter, ta s dng cc phng thc print v println, tng t nh System.out.println. i vi lung nhp, BufferedReader, ta c th s dng phng thc read() c mt k t, hoc mt mng cc k t, hoc gi phng thc readLine() c vo mt dng k t. Cn ch rng phng thc readLine() tr v null nu kt thc lung. Bc 5: ng socket khi hon thnh qu trnh truyn tin V d: Vit chng trnh client lin kt vi mt server. Ngi s dng nhp vo mt dng k t t bn phm v gi d liu cho server.
import java.net.*; import java.io.*; public class { public static void main(String[] args) { String hostname="localhost"; if(args.length>0) { hostname=args[0]; } PrintWriter pw=null; EchoClient1

- 138 -

BufferedReader br=null; try{ Socket s=new Socket(hostname,2007); br=newBufferedReader(new InputStreamReader(s.getInputStream())); BufferedReader user; user=new BufferedReader(new InputStreamReader(System.in)); pw=new PrintWriter(s.getOutputStream()); System.out.println("Da ket noi duoc voi server..."); while(true) { String st=user.readLine(); if(st.equals("exit")) { break; } pw.println(st); pw.flush(); System.out.println(br.readLine()); } } catch(IOException e) { System.err.println(e); } finally{ try{ if(br!=null)br.close(); if(pw!=null)pw.close(); } catch(IOException e) { System.err.println(e); } } }

- 139 -

Chng trnh EchoClient c vo hostname t i dng lnh. Tip theo ta to mt socket vi hostname xc nh trn cng s 2007. Tt nhin cng ny hon ton do ta la chn sao cho n khng trng vi cng c dch v hot ng. Vic to socket thnh cng c ngha l ta lin kt c vi server. Ta nhn lung nhp t socket thng qua phng thc getInputStream() v gn kt n vi cc lung k t v lung m nh lnh:
br=new BufferedReader(new InputStreamReader(s.getInputStream());

Tng t ta ly v lung xut thng qua phng thc getOuputStream() ca socket. Sau gn kt lung ny vi lung PrintWriter gi d liu ti server
pw=new PrintWriter(s.getOutputStream());

c d liu t bn phm ta gn bn phm vi cc lung nhp nh cu lnh:


BufferedReader user=new InputStreamReader(System.in)); BufferedReader(new

Sau i to c cc lung th vn nhn v gi d liu tr thnh vn n gin l c d liu t cc lung nhp br, user v ghi d liu ln lung xut pw.

6.6

Cc bc ci t chng trnh Server bng Java

ci t chng trnh Server bng ServerSocket ta thc hin cc bc sau: Bc 1 To mt i tng ServerSocket
ServerSocket ss=new ServerSocket(port)

Bc 2: To mt i tng Socket bng cch chp nhn lin kt t yu cu lin kt ca client. Sau khi chp nhn lin kt, phng thc accept() tr v i tng Socket th hin lin kt gia Client v Server.
while(<btdieukien>) { Socket s=ss.accept(); doSomething(s); }

Ngi ta khuyn co rng chng ta nn giao cng vic x l i tng s cho mt tuyn on no .

- 140 -

Bc 3: To mt lung nhp c d liu t client


BufferedReader in=new InputStreamReader(s.getInputStream())); BufferedReader(new

Bc 4: To mt lung xut gi d liu tr li cho server


PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

Trong tham s true c s dng xc nh rng lung s c t ng y ra. Bc 5: Thc hin cc thao tc vo ra vi cc lung nhp v lung xut Bc 6: ng socket s khi truyn tin xong. Vic ng socket cng ng ngha vi vic ng cc lung. V d: Vit chng trnh server EchoServer phc v chng trnh EchoClient1 vit bc 5
import java.net.*; import java.io.*; public class { public final static int DEFAULT_PORT=2007; public static void main(String[] args) { int port=DEFAULT_PORT; try{ ServerSocket ss=new ServerSocket(port); Socket s=null; while(true) { try{ s=ss.accept(); PrintWriter pw; BufferedReader br; pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream())); br=newBufferedReader(new InputStreamReader(s.getInputStream())); while(true){ String line=br.readLine(); if(line.equals("exit"))break; String upper=line.toUpperCase(); pw.println(upper); pw.flush(); } EchoServer1

- 141 -

}catch(IOException e){ } finally{ try{ if(s!=null){ s.close(); } }catch(IOException e){} } } }catch(IOException e){} } }

Chng trnh bt u bng vic to ra mt i tng ServerSocket trn cng xc nh. Server lng nghe cc lin kt trong mt vng lp v hn. N chp nhn lin kt bng cch gi phng thc accept(). Phng thc accept() tr v mt i tng Socket th hin mi lin kt gia client v server. Ta cng nhn v cc lung nhp v lung xut t i tng Socket nh cc phng thc getInputStream() v getOuputStream(). Vic nhn yu cu t client s thng qua cc lung nhp v vic gi p ng ti server s thng qua lung xut. Khi ng chng trnh server
start java EchoServer1

Khi ng client
C:\MyJava>start java EchoClient1

- 142 -

6.7

ng dng a tuyn on trong lp trnh Java

Cc server nh vit trn rt n gin nhng nhc im ca n l b hn ch v mt hiu nng v n ch qun l c mt client ti mt thi im. Khi khi lng cng vic m server cn x l mt yu cu ca client l qu ln v khng bit trc c thi im hon thnh cng vic x l th cc server ny l khng th chp nhn c. khc phc iu ny, ngi ta qun l mi phin ca client bng mt tuyn on ring, cho php cc server lm vic vi nhiu client ng thi. Server ny c gi l server tng tranh (concurrent server)-server to ra mt tuyn on qun l tng yu cu, sau tip tc lng nghe cc client khc. Chng trnh client/server chng ta xt m mc 6 v mc 7 l chng trnh client/server n tuyn on. Cc server n tuyn on ch qun l c mt lin kt ti mt thi im. Trong thc t mt server c th phi qun l nhiu lin kt cng mt lc. thc hin iu ny server chp nhn cc lin kt v chuyn cc lin kt ny cho tng tuyn on x l. Trong phn di y chng ta s xem xt cch tin hnh ci t mt chng trnh client/server a tuyn on. Chng trnh pha server
import java.io.*; import java.net.*; class EchoServe extends Thread { private Socket socket; private BufferedReader in; private PrintWriter out; public EchoServe (Socket s) throws IOException { socket = s; System.out.println("Serving: "+socket); in = new InputStreamReader(socket.getInputStream())); // Cho php auto-flush: new PrintWriter(new BufferedWriter(new out = OutputStreamWriter( BufferedReader(new

- 143 -

socket.getOutputStream())), true); // Nu bt k li gi no trn a ra ngoi l // th chng trnh gi c trch nhim ng socket. Ngc li tuyn on s // s ng socket start(); } public void run() { try{ while (true) { System.out.println("....Server is waiting..."); String str = in.readLine(); if (str.equals(exit) ) break; System.out.println("Received: " + str); System.out.println("From: "+ socket); String upper=str.toUpperCase(); // gi li cho client out.println(upper); } System.out.println("Disconnected with.."+socket); }catch (IOException e) {} finally{ try{ socket.close(); } catch(IOException e) {} } } } public class TCPServer1 { static int PORT=0; . public static void main(String[] args) throws IOException {

- 144 -

if (args.length == 1) { PORT=Integer.parseInt(args[0]); // Nhp s hiu cng t i dng lnh } // To mt i tng Server Socket ServerSocket s = new ServerSocket(PORT); InetAddress addrs= InetAddress.getLocalHost(); System.out.println("TCP/Server running on : "+ addrs +" ,Port "+s.getLocalPort()); try { while(true) { // Phong ta cho ti khi c mt lin kt n Socket socket = s.accept(); try { new EchoServe(socket); // To mt tuyn on qun l ring tng lin kt } catch(IOException e) { socket.close(); } } } finally { s.close(); } } }

Chng trnh pha client


import java.net.*; import java.io.*; public class TCPClient1 { public static void main(String[] args) throws IOException { if (args.length != 2) { System.out.println("S dng: java TCPClient hostid port#");

- 145 -

System.exit(0); } try{ InetAddress addr = InetAddress.getByName(args[0]); Socket socket = new Socket(addr, Integer.parseInt(args[1])); try { System.out.println("socket = " + socket); InputStreamReader( BufferedReader in = new BufferedReader(new

socket.getInputStream())); // Output is automatically flushed by PrintWriter: PrintWriter out =new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); // c dng k t t bn phm DataInputStream myinput BufferedInputStream(System.in)); try { for(;;){ System.out.println("Type anything followed by RETURN, or Exit to terminate the program."); String strin=myinput.readLine(); // Quit if the user typed ctrl+D if (strin.equals("exit")) break; else out.println(strin); // Send the message // Recive it back String strout = in.readLine(); { // Compare Both Strings System.out.println("Received: "+strout); } else strout); System.out.println("Echo } // of for ;; }catch (IOException e){ e.printStackTrace(); } bad -string unequal"+ = new DataInputStream(new

if ( strin.length()==strout.length())

- 146 -

// User is exiting } finally { System.out.println("EOF...exit"); socket.close(); } } catch(UnknownHostException e) { System.err.println("Can't find host"); System.exit(1); } catch (SocketException e) { System.err.println("Can't open socket"); e.printStackTrace(); System.exit(1); } } }

6.8

Kt lun

Chng ta tm hiu cch lp trnh mng cho giao thc TCP. Cc Socket cn c gi l socket lung v gi v nhn d liu u c tin hnh thng qua vic c ghi cc lung. Ta c cng tm hiu c ch hot ng ca socket v cch thc lp cc chng trnh server v client. Ngoi ra, chng ny cng gii thch to sao cn c ci t server a tuyn on v tm hiu cch thc lp cc chng trnh client/server a tuyn on. Trong chng tip theo chng ta s hc cch xy dng mt chng trnh client/server cho giao thc UDP, mt giao thc gn vi giao thc TCP.

- 147 -

CHNG 7 . LP TRNH NG DNG CHO GIAO THC UDP

7.1

Tng quan v giao thc UDP

TCP/IP l mt h cc giao thc c gi l h giao thc IP, bao gm bn tng. Cn nh rng TCP/IP khng phi l mt giao thc m thc s l mt h cc giao thc, v bao gm cc giao thc mc thp khc nh IP, TCP, v UDP. UDP nm tng giao vn, pha trn giao thc IP. Tng giao vn cung cp kh nng truyn tin gia cc mng thng qua cc gateway. N s dng cc a ch IP gi cc gi tin trn Internet hoc trn mng thng

- 148 -

qua cc trnh iu khin thit b khc nhau. TCP v UDP l mt phn ca h giao thc TCP/IP; mi giao thc c nhng u v nhc im ring ca n. Giao thc UDP l giao thc n gin, phi lin kt v cung cp dch v trn tng giao vn vi tc nhanh. N h tr lin kt mt-nhiu v thng c s dng thng xuyn trong lin kt mt-nhiu bng cch s dng cc datagram multicast v unicast. Giao thc IP l giao thc c bn ca Internet. TCP v UDP u l hai giao thc tng giao thc vn trn c s ca giao thc IP. Hnh di y ch ra cch nh x m hnh OSI nh x vo kin trc TCP/IP v h giao thc TCP/IP.
Cc tng OSI 7 6 5 4 3 2 1 Tng ng dng Tng trnh din Tng phin Tng giao vn Tng mng Tng lin kt d liu Tng vt l Tng giao vn Tng Internet Tng mng TCP ICMP,IP, IGMP Ethernet, ATM, Frame Relay,.. UDP Tng ng dng H giao thc TCP HTTP TCP/IP Stack FTP SMTP RIP DNS

7.1.1 Mt s thut ng UDP


Trc khi kim tra xem giao thc UDP hot ng nh th no, chng ta cn lm quen vi mt s thut ng. Trong phn di y, chng ta s nh ngha mt s thut ng c bn c lin quan n giao thc UDP. Packet

Trong truyn s liu, mt packet l mt dy cc s nh phn, biu din d liu v cc tn hiu iu khin, cc gi tin ny c chuyn i v chuyn ti ti host. Trong gi tin, thng tin c sp xp theo mt khun dng c th. Datagram

Mt datagram l mt gi tin c lp, t cha, mang y d liu nh tuyn t ngun ti ch m khng cn thng tin thm. MTU

MTU l vit tt ca Maximum Transmission Unit. MTU l mt c trng ca tng lin kt m t s byte d liu ti a c th truyn trong mt gi tin. Mt khc, MTU l gi d liu

- 149 -

ln nht m mi trng mng cho trc c th truyn. V d, Ethernet c MTU c nh l 1500 byte. Trong UDP, nu kch thc ca mt datagram ln hn MTU, IP s thc hin phn on, chia datagram thnh cc phn nh hn (cc on), v vy mi on nh c kch thc nh hn MTU. Port

UDP s dng cc cng nh x d liu n vo mt tin trnh c th ang chy trn mt my tnh. UDP nh ng i cho packet ti v tr xc nh bng cch s dng s hiu cng c xc nh trong header ca datagram. Cc cng c biu din bi cc s 16-bit, v th cc cng nm trong di t 0 n 65535. Cc cng cng c xem nh l cc im cui ca cc lin kt logic, v c chia thnh ba loi sau: - Cc cng ph bin: T 0 n 1023 - Cc cng ng k: 1024 n 49151 - Cc cng ng/dnh ring 49152 n 65535 Ch rng cc cng UDP c th nhn nhiu hn mt thng ip mt thi im. Trong mt s trng hp, cc dch v TCP v UDP c th s dng cng mt s hiu cng, nh 7 (Echo) hoc trn cng 23 (Telnet). UDP c cc cng thng dng sau:
Cng UDP 15 53 69 137 138 161 M t Netstat- Network Status-Tnh trng mng DNS-Domain Name Server TFTP-Trivial File Transfer Protocol Giao thc truyn tp thng thng NetBIOS Name Service Dch v Datagram NetBIOS SNMP Bng 7.2

TTL (Time To Live)

Gi tr TTL cho php chng ta thit lp mt gii hn trn ca cc router m mt datagram c th i qua. Gi tr TTL ngn nga cc gi tin khi b kt trong cc vng lp nh tuyn v hn. TTL c khi to bi pha gi v gi tr c gim i bi mi router qun l datagram. Khi TTL bng 0, datagram b loi b. Multicasting

- 150 -

Multicasting l phng php da trn chun c tnh cht m phn phi cc thng tin ging nhau n nhiu ngi dng. Multicasting l mt c trng chnh ca giao thc UDP. Multicasting cho php chng ta truyn tin theo kiu mt nhiu, v d gi tin hoc th in t ti nhiu ngi nhn, i pht thanh trn Internet, hoc cc chng trnh demo trc tuyn.

7.1.2 Hot ng ca giao thc UDP


Khi mt ng dng da trn giao thc UDP gi d liu ti mt host khc trn mng, UDP thm vo mt header c di 8 byte cha cc s hiu cng ngun v ch, cng vi tng chiu di d liu v thng tin checksum. IP thm vo header ca ring n vo u mi datagram UDP to ln mt datagram IP:

7.1.3 Cc nhc im ca giao thc UDP


So vi giao thc TCP, UDP c nhng nhc im sau: Thiu cc tn hiu bt tay. Trc khi gi mt on, UDP khng gi cc tn hiu bt tay gia bn gi v bn nhn. V th pha gi khng c cch no bit datagram n ch hay cha. Do vy, UDP khng m bo vic d liu n ch hay cha. S dng cc phin. TCP l hng lin kt, cc phin c duy tr gia cc host. TCP s dng cc ch s phin (session ID) duy tr cc lin kt gia hai host. UDP khng h tr bt k phin no do bn cht phi lin kt ca n. tin cy. UDP khng m bo rng ch c mt bn sao d liu ti ch. gi d liu ti cc h thng cui, UDP phn chia d liu thnh cc on nh. UDP khng m bo rng cc on ny s n ch ng th t nh chng c to ra ngun. Ngc li, TCP s dng cc s th t cng vi s hiu cng v cc gi tin xc thc thng xuyn, iu ny m bo rng cc gi tin n ch ng th t m n c to ra. Bo mt. TCP c tnh bo mt cao hn UDP. Trong nhiu t chc, firewall v router cm cc gi tin UDP, iu ny l v cc hacker thng s dng cc cng UDP.

- 151 -

Kim sot lung. UDP khng c kim sot lung; kt qu l, mt ng dng UDP c thit k ti c th lm gim bng thng ca mng.

7.1.4 Cc u im ca UDP
Khng cn thit lp lin kt. UDP l giao thc phi lin kt, v th khng cn phi thit lp lin kt. V UDP khng s dng cc tn hiu handshaking, nn c th trnh c thi gian tr. chnh l l do ti sao DNS thng s dng giao thc UDP hn l TCP-DNS s chm hn rt nhiu khi dng TCP. Tc . UDP nhanh hn so vi TCP. Bi v iu ny, nhiu ng dng thng c ci t trn giao thc UDP hn so vi giao thc TCP. H tr hnh trng (Topology). UDP h tr cc lin kt 1-1, 1-n, ngc li TCP ch h tr lin kt 1-1. Kch thc header. UDP ch c 8 byte header cho mi on, ngc li TCP cn cc header 20 byte, v vy s dng bng thng t hn. Bng di y tng kt nhng s kc nhau gia hai giao thc TCP v UDP:

Cc c trng Hng lin kt S dng phin tin cy Xc thc nh th t iu khin lung Bo mt

UDP Khng Khng Khng Khng Khng Khng t C C C C C C

TCP

Nhiu hn

7.1.5 Khi no th nn s dng UDP


Rt nhiu ng dng trn Internet s dng UDP. Da trn cc u v nhc im ca UDP chng ta c th kt lun UDP c ch khi: S dng cho cc phng thc truyn broadcasting v multicasting khi chng ta mun truyn tin vi nhiu host. Kch thc datagram nh v trnh t on l khng quan trng

- 152 -

Khng cn thit lp lin kt ng dng khng gi cc d liu quan trng Khng cn truyn li cc gi tin Bng thng ca mng ng vai tr quan trng

Vic ci t ng dng UDP trong Java cn c hai lp l DatagramPacket v DatagramSocket. DatagramPacket ng gi cc byte d liu vo cc gi tin UDP c gi l datagram v cho php ta m cc datagram khi nhn c. Mt DatagramSocket ng thi thc hin c hai nhim v nhn v gi gi tin. gi d liu, ta t d liu trong mt DatagramPacket v gi gi tin bng cch s dng DatagramSocket. nhn d liu, ta nhn mt i tng DatagramPacket t DatagramSocket v sau c ni dung ca gi tin. UDP khng c bt k khi nim no v lin kt gia hai host. Mt socket gi tt c d liu ti mt cng hoc nhn tt c d liu t mt cng m khng cn quan tm host no gi. Mt DatagramSocket c th gi d liu ti nhiu host c lp hoc nhn d liu t nhiu host c lp. Socket khng dnh ring cho mt lin kt c th th no c nh trong giao thc TCP. Cc socket TCP xem lin kt mng nh l mt lung: ta gi v nhn d liu vi cc lung nhp v lung xut nhn c t socket. UDP khng cho php iu ny; ta phi lm vic vi tng gi tin. Tt c d liu c t trong datagram c gi i di dng mt gi tin. Gi tin ny cng c th nhn c bi mt nhm hoc cng c th b mt. Mt gi tin khng nht thit phi lin quan n gi tin tip theo. Cho trc hai gi tin, khng c cch no bit c gi tin no c gi trc v gi tin no c gi sau.

7.2

Lp DatagramPacket

Cc datagram UDP a rt t thng tin vo datagram IP. Header UDP ch a tm byte vo header IP. Header UDP bao gm s hiu cng ngun v ch, chiu di ca d liu v header UDP, tip n l mt checksum ty chn. V mi cng c biu din bng hai byte nn tng s cng UDP trn mt host s l 65536. Chiu di cng c biu din bng hai byte nn s byte trong datagram ti a s l 65536 tr i tm 8 byte dnh cho phn thng tin header.

- 153 -

Trong Java, mt datagram UDP c biu din bi lp DatagramPacket: public final class DatagramPacket extends Object

Lp ny cung cp cc phng thc nhn v thit lp cc a ch ngun, ch t header IP, nhn v thit lp cc thng tin v cng ngun v ch, nhn v thit lp di d liu. Cc trng thng tin cn li khng th truy nhp c t m Java thun ty. DatagramPacket s dng cc constructor khc nhau ty thuc vo gi tin c s dng gi hay nhn d liu.

7.2.1 Cc constructor nhn datagram


Hai constructor to ra cc i tng DatagramSocket mi nhn d liu t mng: public DatagramPacket(byte[] b, int length) public DatagramPacket(byte[] b, int offset, int length)

Khi mt socket nhn mt datagram, n lu tr phn d liu ca datagram trong vng m b bt u ti v tr b[0] v tip tc cho ti khi gi tin c lu tr hon ton hoc cho ti khi lu tr ht length byte. Nu s dng constructor th hai, th d liu c lu tr bt

- 154 -

u t v tr b[offset]. Chiu di ca b phi nh hn hoc bng b.length-offset. Nu ta xy dng mt DatagramPacket c chiu di vt qu chiu di ca vng m th constructor s a ra ngoi l IllegalArgumentException. y l kiu ngoi l RuntimeException nn chng trnh ca ta khng cn thit phi n bt ngoi l ny. V d, xy dng mt DatagramPacket nhn d liu c kch thc ln ti 8912 byte
byte b[]=new byte[8912]; DatagramPacket dp=new DatagramPacket(b,b.length);

7.2.2 Constructor gi cc datagram


Bn constructor to cc i tng DatagramPacket mi gi d liu trn mng: public DatagramPacket(byte[] b, int length, InetAddress dc, int port) public DatagramPacket(byte[] b, int offset, int length, InetAddress dc, int port) public DatagramPacket(byte[] b, int length, SocketAddress dc, int port) public DatagramPacket(byte[] b, int offset, int length, SocketAddress dc, int port)

Mi constructor to ra mt DatagramPacket mi c gi i ti mt host khc. Gi tin c in y d liu vi chiu di l length byte bt u t v tr offset hoc v tr 0 nu offset khng c s dng. V d gi i mt xu k t n mt host khc nh sau:
String s=This is an example of UDP Programming; byte[] b= s.getBytes(); try{ InetAddress dc=InetAddress.getByName(www.vnn.vn); int port =7; DatagramPacket dp=new DatagramPacket(b,b.length,dc,port); //Gi gi tin } catch(IOException e){ System.err.println(e); }

Cng vic kh khn nht trong vic to ra mt i tng DatagramPacket chnh l vic chuyn i d liu thnh mt mng byte. on m trn chuyn i mt xu k t thnh mt mng byte gi d liu i

- 155 -

7.2.3 Cc phng thc nhn cc thng tin t DatagramPacket


DatagramPacket c su phng thc tm cc phn khc nhau ca mt datagram: d liu thc s cng vi mt s trng header. Cc phng thc ny thng c s dng cho cc datagram nhn c t mng. public InetAddress getAddress()

Phng thc getAddress() tr v mt i tng InetAddress cha a ch IP ca host xa. Nu datagram c nhn t Internet, a ch tr v chnh l a ch ca my gi datagram (a ch ngun). Mt khc nu datagram c to cc b c gi ti my xa, phng thc ny tr v a ch ca host m datagram c nh a ch. public int getPort()

Phng thc getPort() tr v mt s nguyn xc nh cng trn host xa. Nu datagram c nhn t Internet th cng ny l cng trn host gi gi tin i. public SocketAddress()

Phng thc ny tr v mt i tng SocketAddress cha a ch IP v s hiu cng ca host xa. public byte[] getData()

Phng thc getData() tr v mt mng byte cha d liu t datagram. Thng thng cn phi chuyn cc byte ny thnh mt dng d liu khc trc khi chng trnh x l d liu. Mt cch thc hin iu ny l chuyn i mng byte thnh mt i tng String s dng constructor sau y: public String(byte[] buffer,String encoding)

Tham s u tin, buffer, l mng cc byte cha d liu t datagram. Tham s th hai cho bit cch thc m ha xu k t. Cho trc mt DatagramPacket dp c nhn t mng, ta c th chuyn i n thnh xu k t nh sau:
String s=new String(dp.getData(),ASCII);

Nu datagram khng cha vn bn, vic chuyn i n thnh d liu Java kh khn hn nhiu. Mt cch tip cn l chuyn i mng byte c tr v bi phng thc getData() thnh lung ByteArrayInputStream bng cch s dng constructor ny: public ByteArrayInputStream(byte[] b, int offset, int length)

- 156 -

b l mng byte c s dng nh l mt lung nhp InputStream public int getLength()

Phng thc getLength() tr v s bytes d liu c trong mt datagram. public getOffset()

Phng thc ny tr v v tr trong mng c tr v bi phng thc getData() m t d liu trong datagram xut pht. Cc phng thc thit lp gi tr cho cc trng thng tin Su constructor trn l to lp ra cc datagram. Tuy nhin, Java cung cp mt s phng thc thay i d liu, a ch ca my xa, v cng trn my xa sau khi datagram c to ra. Trong mt s trng hp vic s dng li cc DatagramPacket c sn s nhanh hn vic to mi cc i tng ny. public void setData(byte[] b): Phng thc ny thay i d liu ca datagram public void setData(byte[] b, int offset, int length)

Phng thc ny a ra gii php gi mt khi lng d liu ln. Thay v gi ton b d liu trong mng, ta c th gi d liu trong tng on ca mng ti mi thi im. V d on m sau y s gi d liu theo tng on 512 byte:
int offset=0; DatagramPacket dp=new DatagramPacket(b,offset,512); int bytesSent=0; while(bytesSent<b.length) { ds.send(dp); bytesSent+=dp.getLength(); int bytesToSend=b.length-bytesSent; int size=(bytesToSend>512):512:bytesToSend; dp.setData(b,byteSent,512); }

public void setAddress(InetAddress dc)

Phng thc setAddress() thay i a ch ca my m ta s gi gi tin ti. iu ny s cho php ta gi cng mt datagram n nhiu ni nhn. public void setPort(int port)

- 157 -

Phng thc ny thay i s hiu cng gi ti ca gi tin. pubic void setAddress(SocketAddress sa) public void setLength(int length)

Phng thc ny thay i s byte d liu c th t trong vng m.

7.3

Lp DatagramSocket

gi hoc nhn mt DatagramPacket, bn phi m mt DatagramSocket. Trong Java, mt datagram socket c to ra v c truy xut thng qua i tng DatagramSocket
public class DatagramSocket extends Object

Tt c cc datagram c gn vi mt cng cc b, cng ny c s dng lng nghe cc datagram n hoc c t trn cc header ca cc datagram s gi i. Nu ta vit mt client th khng cn phi quan tm n s hiu cng cc b l bao nhiu DatagramSocket c s dng gi v nhn cc gi tin UDP. N cung cp cc phng thc gi v nhn cc gi tin, cng nh xc nh mt gi tr timeout khi s dng phng php vo ra khng phong ta (non blocking I/O), kim tra v sa i kch thc ti a ca gi tin UDP, ng socket. Cc phng thc void close(): ng mt lin kt v gii phng n khi cng cc b. void connect(InetAddress remote_address, int remote_port)InetAddress getInetAddress():phng thc ny tr v a ch remote m socket kt ni ti, hoc gi tr null nu khng tn ti lin kt. InetAddress getLocalAddress(): tr v a ch cc b Int getSoTimeOut() tr v gi tr ty chn timeout ca socket. Gi tr ny xc nh thi gian m thao tc c s phong ta trc khi n a ra ngoi l InterruptedException. ch mc nh, gi tr ny bng 0, ch ra rng vo ra khng phong ta c s dng. void receive(DatagramPacket dp) throws IOException:phng thc c mt gi tin UDP v lu n dung trong packet xc nh. void send(DatagramSocket dp) throws IOException:phng thc gi mt gi tin

- 158 -

void setSoTimeOut(int timeout): thit lp gi tr ty chn ca socket. Nhn cc gi tin packet

7.4

gi tin Chuyn gi tin vo

DatagramSocket

DatagramSocket

DatagramPacket

ng dng UDP

Trc khi mt ng dng c th c cc gi tin UDP c gi bi cc my xa, n phi gn mt socket vi mt cng UDP bng cch s dng DatagramSocket, v to ra mt DatagramPacket s ng vai tr nh l mt b cha cho d liu ca gi tin UDP. Hnh v di y ch ra mi quan h gia mt gi tin UDP vi cc lp Java khc nhau c s dng x l n v cc ng dng thc t. Khi mt ng dng mun c cc gi tin UDP, n gi phng thc DatagramSocket.receive(), phng thc ny sao chp gi tin UDP vo mt DatagramPacket xc nh. X l ni dung ni tin v tin trnh lp li khi cn
DatagramPacket dp=new DatagramPacket(new byte[256],256); DatagramSocket ds=new DatagramSocket(2000); boolean finished=false; while(!finished) { ds.receive(dp); //X l gi tin } ds.close();

Khi x l gi tin ng dng phi lm vic trc tip vi mt mng byte. Tuy nhin nu ng dng l c vn bn th ta c th s dng cc lp t gi vo ra chuyn i gia mng byte v lung stream v reader. Bng cch gn kt lung nhp ByteArrayInputStream vi ni dung ca mt datagram v sau kt ni vi mt kiu lung khc, khi bn c th truy xut ti ni dung ca gi UDP mt cch d dng. Rt nhiu ngi lp trnh thch dng

- 159 -

cc lung vo ra I/O x l d liu, bng cch s dng lung DataInputStream hoc BufferedReader truy xut ti ni dung ca cc mng byte. InputStream a ch IP DatagramPacket a ch cng D liu gi tin byte[]={,} ByteArrayInputStream

hoc

InputStreamReader

V d, gn kt mt lung DataInputStream vi ni dung ca mt DatagramPacket, ta s dng on m sau:


ByteArrayInputStream bis=new ByteArrayInputStream(dp.getData()); DataInputStream dis=new DataInputStream(bis); //c ni dung ca gi tin UDP

7.5

Gi cc gi tin

Lp DatagramSocket cng c s dng gi cc gi tin. Khi gi gi tin, ng dng phi to ra mt DatagramPacket, thit lp a ch v thng tin cng, v ghi d liu cn truyn vo mng byte. Nu mun gi thng tin phc p th ta cng bit a ch v s hiu cng ca gi tin nhn c. Mi khi gi tin sn sng gi, ta s dng phng thc send() ca lp DatagramSocket gi gi tin i.

- 160 -

DatagramSocket Gn cng UDP ng dng UDP Xy dng gi tin Gi DatagramPacket bng cch s dng DatagramSocket Packet

DatagramPacket

//Socket lng nghe cc gi tin n trn cng 2000 DatagramSocket socket = new DatagramSocket(2000); DatagramPacket packet = new DatagramPacket (new byte[256], 256); packet.setAddress ( InetAddress.getByName ( somehost ) ); packet.setPort ( 2000 ); boolean finished = false; while !finished ) { // Ghi d liu vo vng m buffer ......... socket.send (packet); // Thc hin hnh ng no , chng hn nh c gi tin khci hoc kim tra xemor // cn gi tin no cn gi i hay khng ......... } socket.close();

7.6

V d minh ha giao thc UDP

minh ha cc gi tin UDP c gi v nhn nh th no, chng ta s vit, bin dch v chy ng dng sau.

- 161 -

Vit chng trnh theo m hnh Client/Server : Client thc hin cc thao tc sau y: Client gi mt xu k t do ngi dng nhp t bn phm cho server Client nhn thng tin phn hi tr li t Server v hin th thng tin trn mn hnh Server thc hin cc thao tc sau: Server nhn xu k t do client gi ti v in ln mn hnh Server bin i xu k t thnh ch hoa v gi tr li cho Client

import java.net.*; import java.io.*; public class UDPClient { public final static int CONG_MAC_DINH=9; public static void main(String args[]) { String hostname; int port=CONG_MAC_DINH; if(args.length>0) { hostname=args[0]; try{ } catch(Exception e){ port =Integer.parseInt(args[1]); } } else { hostname="127.0.0.1"; } try{ InetAddress dc=InetAddress.getByName(hostname);

- 162 -

BufferedReader InputStreamReader(System.in)); while(true){

userInput=new

BufferedReader(new

DatagramSocket ds =new DatagramSocket(port); String line=userInput.readLine(); if(line.equals("exit"))break; byte[] data=line.getBytes(); DatagramPacket DatagramPacket(data,data.length,dc,port); ds.send(dp); dp.setLength(65507); ds.receive(dp); ByteArrayInputStream ByteArrayInputStream(dp.getData()); BufferedReader InputStreamReader(bis)); dis =new bis =new dp=new

BufferedReader(new

System.out.println(dis.readLine()); } } catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); } } }

import java.net.*; import java.io.*; public class UDPServer { public final static int CONG_MAC_DINH=9;

- 163 -

public static void main(String args[]) { int port=CONG_MAC_DINH; try{ } catch(Exception e){ port =Integer.parseInt(args[1]); } try{ DatagramSocket ds =new DatagramSocket(port); DatagramPacket byte[65507],65507); while(true){ ds.receive(dp); ByteArrayInputStream ByteArrayInputStream(dp.getData()); BufferedReader dis; dis =new BufferedReader(new InputStreamReader(bis)); String s=dis.readLine(); System.out.println(s); s.toUpperCase(); dp.setData(s.getBytes()); dp.setLength(s.length()); dp.setAddress(dp.getAddress()); dp.setPort(dp.getPort()); ds.send(dp); } } catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); } bis =new dp=new DatagramPacket(new

- 164 -

} }

C:\>start java UDPServer C:\>start java UDPClient

Chng trnh Client/Server s dng a tuyn on


import java.net.*; import java.io.*; public abstract class UDPServer extends Thread { private int bufferSize; protected DatagramSocket ds; public UDPServer(int port, int bufferSize) throws SocketException { this.bufferSize=bufferSize; this.ds=new DatagramSocket(port); } public UDPServer(int port)throws SocketException { this(port,8192); } public void run() { byte[] buffer=new byte[bufferSize]; while(true)

- 165 -

{ DatagramPacket dp; dp=new DatagramPacket(buffer,buffer.length); try{ ds.receive(dp); this.respond(dp); } catch(IOException e) { System.err.println(e); } } } public abstract void respond(DatagramPacket req); }

Server Echo
import java.net.*; import java.io.*; public class UDPEchoServer extends UDPServer { public final static int DEFAULT_PORT=7; public UDPEchoServer()throws SocketException { super(DEFAULT_PORT); } public void respond(DatagramPacket dp) { try{ DatagramPacket outdp=new DatagramPacket(dp.getData(),dp.getLength(),dp.getAddress(),dp.getP ort());

- 166 -

ds.send(outdp); } catch(IOException e) { System.err.println(e); } } public static void main(String[] args) { try { UDPServer server=new UDPEchoServer(); server.start(); System.out.println("Server dang da san sang lang nghe lien ket..."); } catch(SocketException e) { System.err.println(e); } } }

Client
import java.net.*; import java.io.*; public class { private DatagramSocket ds; private boolean stopped=false; public ReceiverThread(DatagramSocket ds) throws SocketException { this.ds=ds; ReceiverThread extends Thread

- 167 -

} public void halt(){ this.stopped=true; } public void run() { byte buffer[]=new byte[65507]; while(true) { if(stopped) return; DatagramPacket dp; dp=new DatagramPacket(buffer,buffer.length); try{ ds.receive(dp); String s; s=new String(dp.getData(),0,dp.getLength()); System.out.println(s); Thread.yield(); } catch(IOException e) { System.err.println(e); } } } }

import java.net.*; import java.io.*; public class { private InetAddress server; private DatagramSocket ds; SenderThread extends Thread

- 168 -

private boolean stopped=false; private int port; public SenderThread(InetAddress address, int port) throws SocketException { this.server=address; this.port=port; this.ds=new DatagramSocket(); this.ds.connect(server,port); } public void halt(){ this.stopped=true; } public DatagramSocket getSocket() { return this.ds; } public void run() { try{ BufferedReader userInput; userInput=new BufferedReader(new InputStreamReader(System.in)); while(true) { if(stopped) return; String line=userInput.readLine(); if(line.equals("exit"))break; byte[] data=line.getBytes(); DatagramPacket dp; dp = new DatagramPacket(data,data.length,server,port); ds.send(dp); Thread.yield(); } } catch(IOException e)

- 169 -

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

Client Echo
import java.net.*; import java.io.*; public class { 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(args[0]); SenderThread sender=new SenderThread(ia,DEFAULT_PORT); sender.start(); ReceiverThread receiver; receiver=new ReceiverThread(sender.getSocket()); receiver.start(); } catch(UnknownHostException e) { System.err.println(e); } catch(SocketException e) { System.err.println(e); } UDPEchoClient

- 170 -

} }

7.7

Kt lun

Trong chng ny, chng ta tho lun nhng khi nim cn bn v giao thc UDP v so snh n vi giao thc TCP. Chng ta cp ti vic ci t cc chng trnh UDP trong Java bng cch s dng hai lp DatagramPacket v DatagramSocket. Mt s chng trnh mu cng c gii thiu bn c tham kho v gip hiu su hn v cc vn l thuyt.

- 171 -

CHNG 8 . TUN T HA I TNG V NG DNG TRONG LP TRNH MNG

8.1

Tun t ha i tng

8.1.1 Khi nim


Tun t ha l qu trnh chuyn tp hp cc th hin i tng cha cc tham chiu ti cc i tng khc thnh mt lung byte tuyn tnh, lung ny c th c gi i qua mt Socket, c lu vo tp tin hoc c x l di dng mt lung d liu. Tun t ha l c ch c s dng bi RMI truyn cc i tng gia cc my o JVM hoc di dng cc tham s trong li gi phng thc t client ti server hoc l cc gi tr tr v t mt li gi phng thc. Tun t ha l mt c ch c xy dng v c a vo cc lp th vin Java cn bn chuyn mt th cc i tng thnh cc lung d liu. Lung d liu ny sau c th c x l bng cch lp trnh v ta c th to li cc bn sao ca i tng ban u nh qu trnh ngc li c gi l gii tun t ha. Tun t ha c ba mc ch chnh sau C ch n nh: Nu lung c s dng l FileOuputStream, th d liu s c t ng ghi vo tp. C ch sao chp: Nu lung c s dng l ByteArrayObjectOuput, th d liu s c ghi vo mt mng byte trong b nh. Mng byte ny sau c th c s dng to ra cc bn sao ca cc i tng ban u. Nu lung ang c s dng xut pht t mt Socket th d liu s c t ng gi i ti Socket nhn, khi mt chng trnh khc s quyt nh phi lm g i vi d liu nhn c. Mt iu quan trng khc cn ch l vic s dng tun t ha c lp vi thut ton tun t ha.

- 172 -

8.1.2 1.2. Kh tun t (Serializable)


Ch c i tng thc thi giao din Serializable mi c th c ghi li v c phc hi bi cc tin ch tun t ha. Giao din Serializable khng nh ngha cc thnh phn. Nu mt lp thc thi giao din Serializable th lp c kh nng tun t ha. Mt lp l kh tun t th tt c cc lp con ca n cng l kh tun t. Giao din ObjectOutput tha k t giao din DataOutput v h tr tun t ha i tng. Lp ObjectOuputStream l lp con ca lp ObjectOuput v thc thi giao din ObjectOutput. N c nhim v ghi cc i tng vo mt lung bng cch s dng phng thc writeObject(Object obj). ObjectInput tha k giao din DataInput v nh ngha cc phng thc. N h tr cho vic tun t ha i tng. Phng thc readObject() c gi gii tun t ha mt i tng. ObjectInputStream c nh ngha trong gi java.io l mt lung ci t c ch c trng thi ca lung nhp i tng. Mt vn t ra l: liu mi lp trong Java u c kh nng tun t ha? Cu tr li l khng, bi v khng cn thit hoc s khng c ngha khi tun t ha mt s lp nht nh. xc nh xem mt lp c kh tun t hay khng ta s dng cng c serialver c trong b JDK.

Vi kt qu trn cho ta thy lp ny l kh tun t. Nhng khng phi mi lp trong Java u kh tun t chng hn ta th kim tra vi lp java.net.Socket

- 173 -

Khi kt qu hin th l Class java.net.Socket is not Serializable (Lp java.net.Socket khng kh tun t).

8.1.3 Xy dng lp mt lp kh tun t


i vi cc lp do ngi lp trnh nh ngha ta phi khai bo bo hiu cho h thng bit n c kh tun t hay khng. Mt lp do ngi dng nh ngha c kh nng tun t ha khi lp thc thi giao din Serializable. Trong v d di y ta nh ngha lp Point lp ny c kh nng tun t ha.
public class Point implements Serializable { private double x,y; public Point(double x,double y){ this.x=x; this.y=y; } public double getX(){ return x; } public double getY(){ return y; } public void move(double dx,double dy){ x+=dx; y+=dy; } public void print(){ System.out.println("Toa do cua diem la:"); System.out.println("Toa do x="+x); System.out.println("Toa do y="+y); } }

8.1.4 C ch c v ghi i tng trn thit b lu tr ngoi


Chng ta u bit rng tt c cc thao tc nhp v xut d liu trong Java thc cht l vic c v ghi trn cc lung d liu vo v lung d liu ra. Vic c v ghi i tng trn

- 174 -

thit b lu tr ngoi cng khng phi l mt ngoi l. Chng ta c th thy c c ch ny qua hnh 4. ObjectInputStream FileInputStream

Serializable Object

File

ObjectOuputStream

FileOuputStream

Gi s i tng obj l mt i tng kh tun t. Bn thn i tng ny c th l kh tun t hoc do ngi lp trnh nh ngha nn thuc tnh kh tun t cho n. C ch ghi i tng c tin hnh rt n gin: Trc tin ta to ra mt tp ghi thng tin, thc cht l to ra i tng FileOuputStream, sau ta to ra mt lung ghi i tng ObjectOuputStream gn vi lung ghi tp v gn kt hai lung vi nhau. Vic ghi i tng c thc hin bi phng thc writeObject().
FileOuputStream fos=new FileOuputStream("date.out"); ObjectOuputStream oos=new ObjectOuputStream(fos); Date d=new Date(); oos.writeObject(d);

Qu trnh trn c gi l qu trnh tun t ha. Chng ta nhn thy rng phc hi li trng thi ca mt i tng ta phi m mt tp c d liu. Nhng ta khng th c c trc tip m phi thng qua lung nhp i tng ObjectInputStream gn vi lung nhp tp tin FileInputStream. Vic c li trng thi i tng c tin hnh nh phng thc readObject()
FileInputStream fis=new FileInputStream("date.out"); ObjectInputStream ois=new ObjectInputStream(fis); Date d=(Date)ois.readObject();

Qu trnh trn cn c gi l gii tun t ha Cng vic c v ghi trng thi ca i tng kh tun t do ngi lp trnh nh ngha c tin hnh hon ton tng t nh trn.

- 175 -

8.2

Truyn cc i tng thng qua Socket

Chng ta bit cch ghi v c cc i tng t cc lung vo ra trong mt tin trnh n, by gi chng ta s xem xt cch truyn i tng thng qua Socket. M hnh lp trnh Socket cho giao thc TCP l m hnh rt ph bin trong lp trnh mng. lp chng trnh client/server trong Java ta cn hai lp Socket v ServerSocket.

8.2.1 Lp Socket
Lp Socket ca Java c s dng bi c client v server, n c cc phng thc tng ng vi bn thao tc u tin. Ba thao tc cui ch cn cho server ch cc client lin kt vi chng. Cc thao tc ny c ci t bi lp ServerSocket. Cc Socket cho client thng c s dng theo m hnh sau: 1. Mt Socket mi c to ra bng cch s dng hm dng Socket(). 2. Socket c gng lin kt vi mt host xa. 3. Mi khi lin kt c thit lp, cc host xa nhn cc lung vo v lung ra t Socket, v s dng cc lung ny gi d liu cho nhau. Kiu lin kt ny c gi l song cng (full-duplex), cc host c th nhn v gi d liu ng thi. ngha ca d liu ph thuc vo tng giao thc. 4. Khi vic truyn d liu hon thnh, mt hoc c hai pha ngt lin kt. Mt s giao thc, nh HTTP, i hi mi lin kt phi b ng sau mi khi yu cu c phc v. Cc giao thc khc, chng hn nh FTP, cho php nhiu yu cu c x l trong mt lin kt n.

8.2.2 Lp ServerSocket
Lp ServerSocket c mi th ta cn vit cc server bng Java. N c cc constructor to cc i tng ServerSocket mi, cc phng thc lng nghe cc lin kt trn mt cng xc nh v cc phng thc tr v mt Socket khi lin kt c thit lp, v vy ta c th gi v nhn d liu. Vng i ca mt server 1. Mt ServerSocket mi c to ra trn mt cng xc nh bng cch s dng mt constructor ServerSocket. 2. ServerSocket lng nghe lin kt n trn cng bng cch s dng phng thc accept(). Phng thc accept() phong ta cho ti khi mt client thc hin

- 176 -

mt lin kt, phng thc accept() tr v mt i tng Socket biu din lin kt gia client v server. 3. Ty thuc vo kiu server, hoc phng thc getInputStream(), getOuputStream() hoc c hai c gi nhn cc lung vo ra phc v cho vic truyn tin vi client. 4. Server v client tng tc theo mt giao thc tha thun sn cho ti khi ngt lin kt. 5. Server, client hoc c hai ngt lin kt Server tr v bc hai v i lin kt tip theo.

8.2.3 Truyn v nhn d liu trong m hnh lp trnh Socket


Vic truyn v nhn d liu thc cht l cc thao tc c v ghi d trn Socket. Ta c th thy iu ny qua s di y: InputStream Socket ObjectOuput

Program

Gi s s l mt i tng Socket. Nu chng trnh nhn d liu th ta s ly d liu t lung nhp n t Socket:
InputStream is=s.getInputStream()

phc hi trng thi i tng ta gn kt lung nhp th ly c t Socket vi lung c i tng ObjectInputStream:
ObjectInputStream ois=new ObjectInputStream(is);

Khi i tng c phc hi li trng thi bi cu lnh:


Object obj=(Object)ois.readObject();

Nu chng trnh gi d liu th ta s ly d liu t lung xut n t Socket:


ObjectOuput os=s.getObjectOuput();

- 177 -

tin hnh ghi i tng ta gn kt lung xut th ly c t Socket vi lung xut i tng ObjectOuputStream:
ObjectOuputStream oos=new ObjectOutputStream(os);

Vic truyn i tng lc ny tr thnh mt cng vic rt n gin:


oos.writeObject(obj);

oos.flush(); 8.2.4 V d minh ha


minh ha k thut chng ta vit mt server thc hin php nhn hai mng s nguyn vi nhau. Client gi hai i tng, mi i tng biu din mt mng nguyn; server nhn cc i tng ny, thc hin li gi phng nhn hai mng s nguyn vi nhau v gi kt qu tr v cho client. Trc tin chng ta nh ngha i tng c th s dng trong vic truyn cc i tng.
public class ArrayObject implements java.io.Serializable{ private int[] a=null; public ArrayObject(){ } public void setArray(int a[]){ this.a=a; } public int[] getArray(){ return a; } }

Lp ArrayObject l lp c xy dng ng gi cc mng s nguyn v c kh nng truyn i qua li trn mng. Cu trc lp nh sau: trng thng tin l mt mng s nguyn a[]; phng thc setArray() thit lp gi tr cho mng. Phng thc getArray() tr v mt mng s nguyn t i tng ArrayObject. M hnh client/server ti thiu phi c hai moun client v server. Trong v d ny cng vy ta s xy dng mt s moun chng trnh nh sau: u tin chng ta pht trin client. Client to ra hai th hin ca cc i tng ArrayObject v ghi chng ra lung xut (thc cht l gi ti server).

- 178 -

public class ArrayClient{ public static void main(String[] args)throws Exception{ ObjectOuputStream oos=null; ObjectInputStream ois=null; int dat1[]={3,3,3,3,3,3,3}; int dat2[]={5,5,5,5,5,5,5}; Socket s=new Socket("localhost",1234); oos=new ObjectOuputStream(s.getObjectOuput()); ois=new ObjectInputStream(s.getInputStream()); ArrayObject a1=new ArrayObject(); a1.setArray(dat1); ArrayObject a2=new ArrayObject(); a2.setArray(dat2); ArrayObject res=null; int r[]=new int[7]; oos.writeObject(a1); oos.writeObject(a2); oos.flush(); res=(ArrayObject)ois.readObject(); r=res.getArray(); System.out.println("The result received from server..."); System.out.println(); for(int i=0;i<r.length;i++)System.out.print(r[i]+" "); } }

Bc tip theo chng ta pht trin server. Server l mt chng trnh cung cp dch v phc v cc yu cu ca client. Server nhn hai i tng ArrayObject v nhn v hai mng t hai i tng ny v sau em nhn chng vi nhau v gi kt qu tr li cho client.
public class ArrayServer extends Thread { private ServerSocket ss; public static void main(String args[])throws Exception { new ArrayServer(); }

- 179 -

public ArrayServer()throws Exception{ ss=new ServerSocket(1234); System.out.println("Server running on port "+1234); this.start(); } public void run(){ while(true){ try{ System.out.println("Waiting for client..."); Socket s=ss.accept(); System.out.println("Accepting a connection from:"+s.getInetAddress()); Connect c=new Connect(s); }catch(Exception e){ System.out.println(e); } } } }

Trong m hnh client/server ti mt thi im server c th phc v cc yu cu n t nhiu client, iu ny c th dn n cc vn tng tranh. Chnh v l do ny m lp ArrayServer tha k lp Thread gii quyt vn trn. Ngoi ra nng cao hiu sut ca chng trnh th sau khi chp nhn lin kt t mt client no , vic x l d liu s c dnh ring cho mt tuyn on server c th tip tc chp nhn cc yu cu khc. Hay ni cch khc, mi mt yu cu ca client c x l trong mt tuyn on ring bit.
class Connect extends Thread{ private Socket client=null; private ObjectInputStream ois; private ObjectOuputStream oos; public Connect(){ } public Connect(Socket client){ this.client=client;

- 180 -

try{ ois=new ObjectInputStream(client.getInputStream()); oos=new ObjectOuputStream(client.getObjectOuput()); } catch(Exception e){ System.err.println(e); } this.start(); } public void run(){ ArrayObject x=null; ArrayObject y=null; int a1[]=new int[7]; int a2[]=new int[7]; int r[]=new int[7]; try{ x=(ArrayObject)ois.readObject(); y=(ArrayObject)ois.readObject(); a1=x.getArray(); a2=y.getArray(); for(int i=0;i<a1.length;i++)r[i]=a1[i]*a2[i]; ArrayObject res=new ArrayObject(); res.setArray(r); oos.writeObject(res); oos.flush(); ois.close(); client.close(); } catch(Exception e){ } } }

- 181 -

8.3

Truyn cc i tng thng qua giao thc UDP

Mt giao thc gn vi giao thc TCP l giao thc UDP. Java h tr cho kiu ng dng truyn tin phi lin kt trn giao thc UDP thng qua lp DatagramSocket v DatagramPacket. Liu chng ta c th vit c cc chng trnh nhp v xut i tng bng truyn tin datagram? Thc hin iu ny khng th tin hnh trc tip nh vi lung Socket. Vn l DatagramSocket khng c gn vi bt k lung no; m n s dng mt tham s mng byte gi v nhn d liu.

Object
ObjectOuputStream ByteArrayObjectOuput DatagramPacket Network ObjectInputStream ByteArrayInputStream

Object

DatagramPacket

C th thy rng xy dng mt gi tin datagram, i tng phi c chuyn thnh mt mng byte. Vic chuyn i ny rt kh thc hin nu bn thn i tng c lin quan n mt s i tng phc tp trong th i tng. Hnh 6 minh ha dng lun chuyn d liu khi truyn mt i tng thng qua mt datagram. Di y l by bc ta cn thc hin ci t m hnh truyn d liu cho giao thc UDP Bc 1. Chun b: To i tng cn truyn i, gi s i tng ny l obj, lm cho n kh tun t bng cch thc thi giao tip Serializable. Bc 2. To mt lung ByteArrayObjectOuput v t tn cho n l baos. Bc 3. Xy dng i tng ObjectOuputStream v t tn cho n l oos. Tham s cho cu t ObjectOuputStream l baos Bc 4. Ghi i tng obj vo lung baos bng cch s dng phng thc writeObject() ca oos.

- 182 -

Bc 5. Tm kim vng m d liu mng byte t bng cch s dng phng thc toByteAray().

Bc 6. Xy dng i tng DatagramPacket v t tn l dp vi d liu u vo l vng m d liu tm c bc 5.

Bc 7. Gi dp thng qua DatagramSocket bng cch gi phng thc send() ca n.

V d minh ha chi tit qu trnh gi mt i tng


InetAddress ia=InetAddress.getByName("localhost"); Student st=new Student("Peter",7,8,9); DatagramSocket ds=new DatagramSocket(); ByteArrayObjectOuput baos=new ByteArrayObjectOuput(5000); ObjectOuputStream oos=new ObjectOuputStream( new BufferedObjectOuput(baos)); oos.flush(); oos.writeObject(st); oos.flush(); byte[] b=baos.toByteAray(); DatagramPacket dp=new DatagramPacket(b,b.length,ia,1234); ds.send(dp); oos.close();

nhn mt i tng ta cng tin hnh cc bc nh trn nhng theo th t ngc li, thay th lung ObjectOuputStream bng ObjectInputStream v ByteArrayObjectOuput bng ByteArrayInputStream. V d di y minh ha chi tit qu trnh nhn mt i tng
DatagramSocket ds=new DatagramSocket(1234); while(true){ byte b[]=new byte[5000]; DatagramPacket dp=new DatagramPacket(b,b.length); ds.receive(dp); ByteArrayInputStream bais; bais=new ByteArrayInputStream(new BufferedInputStream(b)); ObjectInputStream ois =new ObjectInputStream(bais); Student st=(Student)ois.readObject();

- 183 -

st.computeAverage(); st.print(); ois.close(); bais.close(); }

8.4

Kt lun

Qua bi bo ny ti gii thiu tng quan v tun t ha i tng. Thng qua cc v d chng ta thy khng qu kh lm vic vi tun t ha i tng v iu quan trng hn l chng ta bit cch truyn i cc i tng c cu trc phc tp thng qua cc Socket. Ngoi ra, bi bo cng cp ti cch truyn i tng bng cch s dng cc gi tin datagram. Nh nhng u im ca tin ch tun t ha i tng, ti minh ha mt cch truyn cc i tng bng cch s dng cc gi tin datagram. Nh chng ta thy, mc d trong giao thc ny khng h tr x l theo lung d liu nhng ti lung ha cc i tng a cc i tng vo cc mng byte. S la chn gia vic s dng RMI hay gii php Socket kt hp vi tun t ha ph thuc vo tng d n v cc yu cu ca n. S la chn gii php no chnh l s tha hip gia cc c trng ca mi gii php: nu i vi RMI th l tnh n gin khi trin khai, ngc li vi Socket kt hp vi tun t ha i tng th li l u th v mt hiu nng. Nu vn hiu nng c tm quan trng th gii php lp trnh Socket kt hp tun t ha i tng l gii php tt hn so vi RMI.

- 184 -

CHNG 9 . PHN TN I TNG TRONG JAVA BNG RMI

9.1

Tng quan

RMI l mt c ch cho php mt i tng ang chy trn mt my o Java ny ( Java Virtual Machine) gi cc phng thc ca mt i tng ang tn ti trn mt my o Java khc (JVM). Thc cht RMI l mt c ch gi phng thc t xa c thc hin v tch hp trong ngn ng Java. V Java l mt ngn ng lp trnh hng i tng, nn phng php lp trnh trong RMI l phng php hng i tng do cc thao tc hay cc li gi phng thc u lin quan n i tng. Ngoi ra, RMI cn cho php mt Client c th gi ti mt i tng n cho Server x l, v i tng ny cng c th c xem l tham s cho li gi hm t xa, i tng ny cng c nhng d liu bn trong v cc hnh vi nh mt i tng thc s. So snh gi gi phng thc t xa vi cc li gi th tc t xa Gi phng thc t xa khng phi l mt khi nim mi. Thm ch trc khi ra i lp trnh hng i tng phn mm c th gi cc hm v cc th tc t xa. Cc h thng nh RPC c s dng trong nhiu nm v hin nay vn c s dng. Trc ht, Java l mt ngn ng c lp vi nn v cho php cc ng dng Java truyn tin vi cc ng dng Java ang chy trn bt k phn cng v h iu hnh no c h tr JVM. S khc bit chnh gia hai mc tiu l RPC h tr a ngn ng, ngc li RMI ch h tr cc ng dng c vit bng Java. Ngoi vn v ngn ng v h thng, c mt s s khc bit cn bn gia RPC v RMI. Gi phng thc t xa lm vic vi cc i tng, cho php cc phng thc chp nhn v tr v cc i tng Java cng nh cc kiu d liu nguyn t (premitive type). Ngc li gi th tc t xa khng h tr khi nim i tng. Cc thng ip gi cho mt dch v RPC (Remote Procedure Calling) c biu din bi ngn ng XDR (External Data Representation): dng thc biu din d liu ngoi. Ch c cc kiu d liu c th c nh ngha bi XDR mi c th truyn i.

- 185 -

9.2

Mc ch ca RMI H tr gi phng thc t xa trn cc i tng trong cc my o khc nhau H tr gi ngc phng thc ngc t server ti cc applet Tch hp m hnh i tng phn tn vo ngn ng lp trnh Java theo mt cch t nhin trong khi vn duy tr cc ng cnh i tng ca ngn ng lp trnh Java Lm cho s khc bit gia m hnh i tng phn tn v m hnh i tng cc b khng c s khc bit. To ra cc ng dng phn tn c tin cy mt cch d dng Duy tr s an ton kiu c cung cp bi mi trng thi gian chy ca nn tng Java H tr cc ng cnh tham chiu khc nhau cho cc i tng t xa Duy tr mi trng an ton ca Java bng cc trnh bo an v cc trnh np lp. Mt s thut ng

9.3

Cng nh tt c cc chng trnh khc trong Java, chng trnh RMI cng c xy dng bi cc giao tip v lp. Giao tip nh ngha cc phng thc v cc lp thc thi cc phng thc . Ngoi ra lp cn thc hin mt vi phng thc khc. Nhng ch c nhng phng thc khai bo trong giao tip tha k t giao tip Remote hoc cc lp con ca n mi c Client gi t JVM khc. Trong mc ny ta nu mt s thut ng thng xuyn c s dng trong phn ny: Giao tip Remote: Mt giao tip khai bo cc phng thc cho php gi t xa. Trong Java giao tip Remote c cc c im sau: - Tha k giao tip c sn: java.rmi.Remote. - Mi phng thc trong giao tip Remote phi c khai bo a ra ngoi l RemoteException nh mnh throws java.rmi.RemoteException v c th c cc ngoi l khc. i tng Remote: mt i tng c to ra cho php nhng i tng khc trn mt my JVM khc gi ti n.

- 186 -

Phng thc Remote: i tng Remote cha mt s cc phng thc, nhng phng thc ny c th c gi t xa bi cc i tng trong JVM khc .

JVM

Local Object - Data - Method

JVM

Remote Object - Data- Remote Method

9.4

Cc lp trung gian Stub v Skeleton

Trong k thut lp trnh phn tn RMI, cc i tng trn cc my Java o khc nhau c th truyn tin vi nhau thng qua cc lp trung gian: Stub v Skeleton. Vai tr ca lp trung gian: Lp trung gian tn ti c hai pha client (ni gi phng thc ca cc i tng xa) v server (ni i tng tht s c ci t thc thi m lnh ca phng thc). Trong Java trnh bin dch rmic.exe c s dng to ra lp trung gian ny. Pha client lp trung gian ny gi l Stub (lp mc), pha server lp trung gian ny gi l Skeleton(lp ni) chng ging nh cc lp mi gii gip cc lp xa truyn tin vi nhau.

9.5

C ch hot ng ca RMI

Cc h thng RMI phc v cho vic truyn tin thng c chia thnh hai loi: client v server. Mt server cung cp dch v RMI, v client gi cc phng thc trn i tng ca dch v ny. Server RMI phi ng k vi mt dch v tra tm v ng k tn. Dch v ny cho php cc client truy tm chng, hoc chng c th tham chiu ti dch v trong mt m hnh khc. Mt chng trnh ng vai tr nh vy c tn l rmiregistry, chng trnh ny chy nh mt tin trnh c lp v cho php cc ng dng ng k dch v RMI hoc nhn mt tham chiu ti dch v c t tn. Mi khi server c ng k, n s ch cc yu cu RMI t cc client. Gn vi mi ng k dch v l mt tn c biu din bng mt xu k t

- 187 -

cho php cc client la chn dch v thch hp. Nu mt dch v chuyn t server ny sang mt server khc, client ch cn tra tm trnh ng k tm ra v tr mi. iu ny lm cho h thng c kh nng dung th li-nu mt dch v khng kh dng do mt my b sp, ngi qun tr h thng c th to ra mt th hin mi ca dch v trn mt h thng khc v ng k n vi trnh ng k RMI. Cc client RMI s gi cc thng ip RMI gi mt phng thc trn mt i tng t xa. Trc khi thc hin gi phng thc t xa, client phi nhn c mt tham chiu t xa. Tham chiu ny thng c c bng cch tra tm mt dch v trong trnh ng k RMI. ng dng client yu cu mt tn dch v c th, v nhn mt URL tr ti ti nguyn t xa. Khun dng di y c s dng biu din mt tham chiu i tng t xa:
rmi://hostname:port/servicename

Trong hostname l tn ca my ch hoc mt a ch IP, port xc nh dch v, v servicename l mt xu k t m t dch v. Mi khi c c mt tham chiu, client c th tng tc vi dch v t xa. Cc chi tit lin quan n mng hon ton c che du i vi nhng ngi pht trin ng dng-lm vic vi cc i tng t xa n gin nh lm vic vi cc i tng cc b. iu ny c th c c thng qua s phn chia h thng RMI thnh hai thnh phn, stub v skeleton. i tng stub l mt i tng y quyn, truyn ti yu cu i tng ti server RMI. Cn nh rng mi dch v RMI c nh ngha nh l mt giao tip, ch khng phi l mt chng trnh ci t, cc ng dng client ging nh cc chng trnh hng i tng khc. Tuy nhin ngoi vic thc hin cng vic ca chnh n, stub cn truyn mt thng ip ti mt dch v RMI xa, ch p ng, v tr v p ng cho phng thc gi. Ngi pht trin ng dng khng cn quan tm n ti nguyn RMI nm u, n ang chy trn nn no, n p ng y yu cu nh th no. Client RMI n gin gi mt phng thc trn i tng y quyn, i tng ny qun l tt c cc chi tit ci t.

- 188 -

Ti pha server, i tng skeleton c nhim v lng nghe cc yu cu RMI n v truyn cc yu cu ny ti dch v RMI. i tng skeleton khng cung cp bn ci t ca dch v RMI. N ch ng vai tr nh l chng trnh nhn cc yu cu, v truyn cc yu cu. Sau khi ngi pht trin to ra mt giao tip RMI, th anh ta phi cung cp mt phin bn ci t c th ca giao tip. i tng ci t ny c gi l i tng skeleton, i tng ny gi phng thc tng ng v truyn cc kt qu cho i tng stub trong client RMI. M hnh ny lm cho vic lp trnh tr nn n gin, v skeleton c tch bit vi ci t thc t ca dch v. Tt c nhng g m ngi pht trin dch v cn quan tm l m lnh khi to ( ng k dch v v chp nhn dch v), v cung cp chng trnh ci t ca giao tip dch v RMI. Vi cu hi cc thng ip c truyn nh th no, cu tr li tng i n gin. Vic truyn tin din ra gia cc i tng stub v skeleton bng cch s dng cc socket TCP. Mi khi c to ra, skeleton lng nghe cc yu cu n c pht ra bi cc i tng stub. Cc tham s trong h thng RMI khng ch hn ch i vi cc kiu d liu nguyn t-bt k i tng no c kh nng tun t ha u c th c truyn nh mt tham s hoc c tr v t phng thc t xa. Khi mt stub truyn mt yu cu ti mt i tng skeleton, n phi ng gi cc tham s (hoc l cc kiu d liu nguyn t, cc i tng hoc c hai) truyn i, qu trnh ny c gi l marshalling. Ti pha skeleton cc tham s c khi phc li to nn cc kiu d liu nguyn t v cc i tng, qu trnh ny cn c gi l unmarshaling. thc hin nhim v ny, cc lp con ca cc lp ObjectOutputStream v ObjectInputStream c s dng c v ghi ni dung ca cc i tng. JVM JVM

Stub

Skeleton

Client Object

Remote Object

Client

Server

- 189 -

S gi phng thc ca cc i tng xa thng qua lp trung gian c c th ho nh sau:

A1 A2 Computer A B1_stub

C1- stub

Computer C C 1

B1Skel

B 1

Ta c i tng C1 c ci t trn my C. Trnh bin dch rmic.exe s to ra hai lp trung gian C1_Skel v C1_Stub. Lp C1_Stub s c em v my A. Khi A1 trn my A gi C1 n s chuyn li gi n lp C1_Stub, C1_Stub chu trch nhim ng gi tham s, chuyn vo khng gian a ch tng thch vi i tng C1 sau gi phng thc tng ng.

Computer B

Nu c phng thc ca i tng C1 tr v s c lp C1_Skel ng gi tr ngc v cho C1_Stub chuyn giao kt qu cui cng li cho A1. Nu khi kt ni mng gp s c th lp trung gian Stub s thng bo li n i tng A1. Theo c ch ny A1 lun ngh rng n ang hot ng trc tip vi i tng C1 trn my cc b.

Trn thc t, C1_Stub trn my A ch lm lp trung gian chuyn i tham s v thc hin cc giao thc mng, n khng phi l hnh nh ca i tng C1. lm c iu ny, i tng C1 cn cung cp mt giao din tng ng vi cc phng thc cho php i tng A1 gi n trn my A.

- 190 -

C1Skel

9.6

Kin trc RMI

S khc bit cn bn gia cc i tng t xa v cc i tng cc b l cc i tng t xa nm trn mt my o khc. Thng thng, cc tham s i tng c truyn cho cc phng thc v cc gi tr i tng c tr v t cc phng thc thng qua cch truyn theo tham chiu. Tuy nhin cch ny khng lm vic khi cc phng thc gi v cc phng thc c gi khng cng nm trn mt my o. V vy, c ba c ch khc nhau c s dng truyn cc tham s cho cc phng thc t xa v nhn cc kt qu tr v t cc phng thc xa. Cc kiu nguyn t (int, boolean, double,) c truyn theo tham tr. Cc tham chiu ti cc i tng t xa c truyn di dng cc tham chiu cho php tt c pha nhn gi cc phng thc trn cc i tng t xa. Cc i tng khng thc thi giao tip t xa (ngha l cc i tng khng thc thi giao tip Remote) c truyn theo tham tr; ngha l cc bn sao y c truyn i bng cch s dng c ch tun t ha i tung. Cc i tng khng c kh nng tun t ha th khng th c truyn i ti cc phng thc xa. Cc i tng xa chy trn server nhng c th c gi bi cc i tng ang chy trn client. Cc i tng khng phi xa, cc i tng kh tun t chy trn cc h thng client.
qu trnh truyn tin l trong sut vi ngi lp trnh, truyn tin gia client v server c ci t theo m hnh phn tng nh hnh v di y Chng trnh Server Skeleton Tng tham chiu t xa Tng giao vn

ng logic

Chng trnh Client Stub Tng tham chiu t xa

Network

Tng giao vn

i vi ngi lp trnh, client dng nh truyn tin trc tip vi server. Thc t, chng trnh client ch truyn tin vi i tng stub l i tng y quyn ca i tng thc s nm trn h thng t xa. Stub chuyn cuc m thoi cho tng tham chiu, tng ny truyn tin trc tip vi tng giao vn. Tng giao vn trn client truyn d liu i trn mng my tnh ti tng giao vn bn pha server. Tng giao vn bn pha server truyn tin vi tng tham chiu, tng ny truyn tin mt phn ca phn mm server c gi l skeleton.

- 191 -

Skeleton truyn tin vi chnh server. Theo hng khc t server n client th lung truyn tin c i theo chiu ngc li. Cch tip cn c v phc tp nhng ta khng cn quan tm n vn ny. Tt c u c che du i, ngi lp trnh ch quan tm n vic lp cc chng trnh c kh nng gi phng thc t xa ging nh i vi chng trnh cc b. Trc khi c th gi mt phng thc trn mt i tng xa, ta cn mt tham chiu ti i tng . nhn c tham chiu ny, ta yu cu mt trnh ng k tn rmiregistry cung cp tn ca tham chiu. Trnh ng k ng vai tr nh l mt DNS nh cho cc i tng t xa. Mt client kt ni vi trnh ng k v cung cp cho n mt URL ca i tng t xa. Trnh ng k cung cp mt tham chiu ti i tng v client s dng tham chiu ny gi cc phng thc trn server. Trong thc t, client ch gi cc phng thc cc b trn trong stub. Stub l mt i tng cc b thc thi cc giao tip t xa ca cc i tng t xa. Tng tham chiu t xa thc thi giao thc tng tham chiu t xa c th. Tng ny c lp vi cc i tng stub v skeleton c th. Tng tham chiu t xa c nhim v hiu tng tham chiu t xa c ngha nh th no. i khi tng tham chiu t xa c th tham chiu ti nhiu my o trn nhiu host. Tng giao vn gi cc li gi trn Internet. Pha server, tng giao vn lng nghe cc lin kt n. Trn c s nhn li gi phng thc, tng giao vn chuyn li gi cho tng tham chiu trn server. Tng tham chiu chuyn i cc tham chiu c gi bi client thnh cc tham chiu cho cc my o cc b. Sau n chuyn yu cu cho skeleton. Skeleton c tham s v truyn d liu cho chng trnh server, chng trnh server s thc hin li gi phng thc thc s. Nu li gi phng thc tr v gi tr, gi tr c gi xung cho skeleton, tng tham chiu xa, v tng giao vn trn pha server, thng qua Internet v sau chuyn ln cho tng giao vn, tng tham chiu xa, stub trn pha client.

9.7

Ci t chng trnh

lp mt h thng client/server bng RMI ta s dng ba gi c bn sau: java.rmi, java.rmi.server, java.rmi.registry. Gi java.rmi bao gm cc giao tip, cc lp v cc ngoi l c s dng lp trnh cho pha client. Gi java.rmi.server cung cp cc giao tip, cc lp v cc ngoi l c s dng lp trnh cho pha server. Gi java.rmi.registry c cc giao tip, cc lp v cc ngoi l c s dng nh v v t tn cc i tng.

- 192 -

9.7.1 Ci t chng trnh pha Server


minh ha cho k thut lp trnh RMI y tc gi xin gii thiu cch lp mt chng trnh FileServer n gin cho php client ti v mt tp tin. Bc 1: c t giao tip Remote

import java.rmi.*; public interface FileInterface extends Remote { public byte[] RemoteException; } downloadFile(String fileName)throws

Bc 2: Vit lp thc thi giao tip

import java.rmi.*; import java.rmi.server.*; import java.io.*; public class FileInterface { private String name; public FileImpl(String s)throws RemoteException { super(); name=s; } public byte[] RemoteException { try{ File file=new File(fileName); //To mt mng b lu ni dung ca tp byte b[]=new byte[(int)file.length()]; BufferedInputStream FileInputStream(fileName)); bis.read(b,0,b.length); bis.close(); return b; bis=new BufferedInputStream(new downloadFile(String fileName)throws FileImpl extends UnicastRemoteObject implements

- 193 -

} catch(Exception e) { System.err.println(e); return null; } } }

Bc 3: Vit chng trnh pha server

import java.io.*; import java.rmi.*; import java.net.*; public class FileServer { public static void main(String[] args) throws Exception { FileInterface fi=new FileImpl("FileServer"); InetAddress dc=InetAddress.getLocalHost(); Naming.rebind("rmi://"+dc.getHostAddress() +"/FileServer",fi); System.out.println("Server ready for client requests..."); } }

Bc 4: Ci t client

import java.rmi.*; import java.io.*; public class FileClient { public static void main(String[] args) throws Exception { if(args.length!=2) { System.out.println("Su machineName "); dung:java FileClient fileName

- 194 -

System.exit(0); } String name="rmi://"+args[1]+"/FileServer"; FileInterface fi=(FileInterface)Naming.lookup(name); byte[] filedata=fi.downloadFile(args[0]); File file =new File(args[0]); BufferedOutputStream bos=new FileOutputStream(file.getName())); bos.flush(); bos.close(); } } BufferedOutputStream(new

bos.write(filedata,0,filedata.length);

9.8

Trin khai ng dng

trin khai ng dng RMI ta cn thc hin cc bc sau: Bc 1: Bin dch cc tp chng trnh

C:\MyJava>javac FileInterface.java C:\MyJava>javac FileImpl.java C:\MyJava>javac FileServer.java C:\MyJava>javac FileClient.java

Ta s thu c cc lp sau: FileInterface.class, FileImpl.class, FileServer.class, FileClient.class to ra cc lp trung gian ta dng lnh sau:
C:\MyJava>rmic FileImpl

Sau khi bin dch ta s thu c hai lp trung gian l FileImpl_Stub.class v FileImpl_Skel.class. Bc 2: T chc chng trnh

Ta t chc chng trnh trn hai my client v server nh sau:


Pha Server FileInterface.class FileImpl.class FileImpl_Skel.class Pha Client FileInterface.class FileImpl_Stub.class FileClient.class

- 195 -

FileServer.class

Bc 3: Khi ng chng trnh

y ta gi lp chng trnh trn cng mt my. Vic trin khai trn mng khng c g kh khn ngoi vic cung cp hostname hoc a ch IP ca server cung cp dch v Khi ng trnh ng k:
C:\MyJava>start rmiregistry

Khi ng server
C:\MyJava>start java FileServer

Khi ng client C:\MyJava>java FileClient D:\RapidGet.exe localhost

9.9

Cc lp v cc giao tip trong gi java.rmi

Khi vit mt applet hay mt ng dng s dng cc i tng xa, ngi lp trnh cn nhn thc rng cc giao tip v cc lp cn dng cho pha client nm trong gi java.rmi

9.9.1 Giao tip Remote


Giao tip ny khng khai bo bt k phng thc no. Cc phng thc c khai bo trong phng thc ny l cc giao tip c th c gi t xa.

9.9.2 Lp Naming
Lp java.rmi.Naming truyn tin trc tip vi mt trnh ng k ang chy trn server nh x cc URL rmi://hostname/myObject thnh cc i tng t xa c th trn host xc nh. Ta c th xem trnh ng k nh l mt DNS cho cc i tng xa. Mi im vo trong trnh ng k bao gm mt tn v mt tham chiu i tng. Cc client cung cp tn v nhn v mt tham chiu ti URL. URL rmi ging nh URL http ngoi tr phn giao thc c thay th bng rmi. Phn ng dn ca URL l tn gn vi i tng t xa trn server ch khng phi l tn mt tp tin. Lp Naming cung cp cc phng thc sau: Public static String[] list(String url) throws RemotException

Phng thc ny tr v mt mng cc xu k t, mi xu l mt URL c gn vi mt tham chiu. Tham s url l URL ca trnh ng k Naming.

- 196 -

Public

static

Remote

lookup(String

url)throws

RemotException,

NotBoundException, AccessException, MalformedURLException Client s dng phng thc ny tm kim mt i tng t xa gn lin vi tn i tng. Phng thc ny a ra ngoi l NotBoundException nu server xa khng nhn ra tn ca n. N a ra ngoi l RemoteException nu trnh khng th lin lc c vi trnh ng k . N a ra ngoi l AccessException nu server t chi tra tm tn cho host c th. Cui cng nu URL khng ng c php n s a ra ngoi l MalformedURLException. Public static void bind(String url, Remote object)throws RemotException, AlreadyBoundException, MalformedURLException, AccessException Server s dng phng thc bind() lin kt mt tn vi mt i tng xa. Nu vic gn l thnh cng th client c th tm kim i tng stub t trnh ng k. C rt nhiu tnh hung c th xy ra trong qu trnh gn tn. Phng thc ny a ra ngoi l MalformedURLException nu url khng ng c php. N a ra ngoi l RemoteException nu khng th lin lc c vi trnh ng k. N a ra ngoi l AccessException nu client khng c php gn cc i tng trong trnh ng k. Nu i tng URL gn vi mt i tng cc b n s a ra ngoi l AlreadyBoundException. Public static void rebind(String url, Remote obj)throws RemoteException, AccessException, MalformedURLException Phng thc ny ging nh phng thc bind() ngoi tr vic l n gn URL cho i tng ngay c khi URL c gn.

9.10

Cc lp v cc giao tip trong gi java.rmi.registry

Lm th no nhn c mt tham chiu ti i tng? Client tm ra cc i tng xa hin c bng cch thc hin truy vn vi trnh ng k ca server. Trnh ng k cho ta bit nhng i tng no ang kh dng bng cch truy vn trnh ng k ca server. Ta bit lp java.rmi.Naming cho php chng trnh giao tip vi trnh ng k. Giao tip Registry v lp LocateRegistry cho php cc client tm kim cc i tng xa trn mt server theo tn. RegistryImpl l lp con ca lp RemoteObject, lp ny lin kt

- 197 -

cc tn vi cc i tng RemoteObject. Client s dng lp LocateRegistry tm kim RegistryImpl cho mt host v cng c th.

9.10.1 Giao tip Registry


Giao tip ny cung cp nm phng thc: Bind() gn mt tn vi mt i tng t xa c th List() lit k tt c cc tn c ng k vi trnh ng k Lookup() tm mt i tng t xa c th vi mt URL cho trc gn vi n Rebind() gn mt tn vi mt i tng xa khc Unbind() loi b mt tn c gn cho mt i tng xa trong trnh ng k

Registry.REGISTRY_PORT l cng mc nh lng nghe cc cc yu cu. Gi tr mc nh l 1099.

9.10.2 Lp LocateRegistry
Lp java.rmi.registry.LocateRegistry cho php client tm trong trnh ng k trc tin. Public static Registry getRegistry() throws RemoteException Public static Registry getRegistry(int port) throws RemoteException Public static Registry getRegistry(String host) throws RemoteException Public static Registry getRegistry(String host, int port) throws RemoteException Public static Registry getRegistry(String host, int port, RMIClientSocketFactory factory) throws RemoteException Mi phng thc trn tr v mt i tng Registry c s dng nhn cc i tng t xa thng qua tn. V d client c tm thy i tng ta c ng k i tng vi trnh ng k thng qua lp Registry:
Registry r=LocateRegistry.getRegistry(); r.bind(MyName,this);

Client mun gi phng thc trn i tng t xa c th dng cc lnh sau:


Registry r=LocateRegistry.getRegistry(www.somehose.com);

- 198 -

RemoteObjectInterface obj=(RemoteObjectInterface)r.lookup(MyName); Obj.invokeRemoteMethod();

V d di y minh ha cch to ra mt trnh ng k ngay trong server


import java.io.*; import java.rmi.*; import java.net.*; import java.rmi.registry.*; public class FileServer { public static void main(String[] args) throws Exception { FileInterface fi=new FileImpl("FileServer"); InetAddress dc=InetAddress.getLocalHost(); LocateRegistry.createRegistry(1099); Naming.bind("rmi://"+dc.getHostAddress()+"/FileServer",fi); System.out.println("Server ready for client requests..."); } }

Nh vy khi thc thi chng trnh ta khng cn phi khi ng trnh ng k v vic to ra trnh ng k v khi ng n c tin hnh ngay trong chng trnh pha server.

9.11

Cc lp v cc giao tip trong gi java.rmi.server

9.11.1 Lp RemoteObject
V mt k thut i tng t xa khng phi l mt th hin ca lp RemoteObject. Thc t, phn ln cc i tng t xa l th hin ca cc lp con ca lp RemoteObject.

9.11.2 Lp RemoteServer
Lp ny l lp con ca lp RemoteObject; n l lp cha ca lp UnicastRemoteObject. Lp ny c cc constructor ny: Protected RemoteServer() Protected RemoteServer(RemoteRef r)

Nhn cc thng tin v client

- 199 -

Lp RemoteServer c mt phng thc xc nh thng tin v client m ta ang truyn tin vi n: public static String getClientHost() throws ServerNotActiveException

Phng thc ny tr v hostname ca client m gi phng thc t xa.

9.11.3 Lp UnicastRemoteObject
Lp UnicastRemoteObject l mt lp con c th ca lp RemoteServer. to ra mt i tng xa, ta phi tha k lp UnicastRemoteServer v khai bo lp ny thc thi giao tip Remote.

9.12

Kt lun

RMI l mt cng ngh phn tn cho php cc phng thc trn cc my o Java c gi t xa. y l cch n gin truyn tin gia mt ng dng ny vi ng dng khc so vi truyn tin trc tip vi TCP socket, cch truyn tin ny i hi c hai pha u s dng cng mt giao thc. Thay v vit cc chng trnh ci t giao thc, nhng ngi pht trin c th tng tc vi cc phng thc i tng c nh ngha bi mt giao tip dch v RMI. Mi khi c c mt tham chiu ti i tng t xa, tham chiu ny c th c xem nh l mt i tng cc b, y l cch trc quan pht trin cc ng dng mng.

- 200 -

TI LIU THAM KHO


Ting Vit

[1] [2] [3] [4] [5] [6]

Elliotte Rusty Harold, Java Network Programming Nguyn Phng Lan- Hong c Hi, Java lp trnh mng, Nh xut bn Gio dc Darrel Ince & Adam Freemat, Programming the Internet with Java, Addison-Wesley Mary Campione&Kathy Walrath&Alison Huml, Java Tutorial, Third Edition: A Short Course on the Basics, Addison Wesley The Complete Java. Nguyn Thc Hi, Mng my tnh v cc h thng m, Nh xut bn Gio dc on Vn Ban, Lp trnh hng i tng vi Java, Nh xut bn Khoa hc v K thut Ting Anh

[7]

Douglas E.Comer, David L.Stevens, Client-Server Programming And Applications. In book: Internetworking with TCP/IPVolume III, Pearson Education, Singapore, 2004.

[8] [9]

Herbert Schildt, JavaTM 2: The Complete Reference Fifth Edition, Tata McGrawHill Publishing Company Limited, India, 2002. Elliote Rusty Harold, JavaTM Network Programming, Third Edition, Oreilly, 2005.

[10] Qusay H. Mahmoud, Advanced Socket Programming, http://java.sun.com, December


2001

[11] Shengxi Zhou, Transport Java objects over the network with datagram packets,
http://www.javaworld.com, 2006

You might also like