Professional Documents
Culture Documents
GIO TRNH
LP TRNH MNG
Lu hnh ni b
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
- 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
- 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
- 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
-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
- 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
- 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 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
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
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.
- 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
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,...
- 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), ...
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
- 16 -
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.
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
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.
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)
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
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 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
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
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
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 -
Tn min .aero .biz .com .coop .info .museum .name Doanh nghip Cc t chc thng mi Cc quan h hp tc
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
- 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.
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
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.
- 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 -
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
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
Kt qu in ra l:
Chao ngon ngu lap trinh Java
- 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:
- 29 -
2.4
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.
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).
- 30 -
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;
V d m rng kiu
char c = A; int k = c;
V d thu hp kiu
- 31 -
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
- 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 -
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; } } }
- <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); } } }
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
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.
- 37 -
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.
- 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
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);
- 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.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.
- 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"); } }
- 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]);
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()); } };
- 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 }
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 -
2.8
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
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.
v khi l ni
catch
- 51 -
finally,
c pht sinh exception hay khng. Nu trong khi th lnh trong khi
finally
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 -
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
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
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
...
- 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()); } } }
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()
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...
catch
tng ng vi
finally
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
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
catch
vi loi li l
catch (Throwable T) {
- 58 -
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]); } }
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 -
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
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...
- 61 -
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 -
- 63 -
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).
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 -
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
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
Thit b
Mng
- 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
FileOutputStream
BufferedOutputStream
OutputStream
FilterOutputStream
DataOutputStream
ObjectOutputstream
PrintStream
PipedOutputStream
- 67 -
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
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.
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.
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.
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)
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)
ByteArrayInputStream: cha
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
- 69 -
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.
lm vng m.
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
- 70 -
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
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.
3.2.3 Cc v d
dng cc stream, trc ht cn import package java.io.
import java.io.*;
- 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()];
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); } } }
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 -
} }
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();
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
PushbackReader
FileReader
PipedReader
StringReader
- 75 -
BufferedWriter
CharArrayWriter
FilterWriter
Writer
OutputStreamWriter
FileWriter
PipedWriter
PrintWriter
StringWriter
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.
boolean markSupported()
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 -
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 -
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.
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
FileReader(String name)
- 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
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
PipedWriter() Piped Writer PipedWriter (PipedReader snk) connect(PipedReader snk) String Reader String StringReader(String s)
- 79 -
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...
- 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
cho thao tc c d liu dng byte. thao tc ghi d liu dng byte.
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
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.
- 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
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()
To mt stream vng m ghi d liu dng byte. To mt stream vi vng m kch thc
sz
c d liu dng k t.
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...
- 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
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
- 88 -
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()
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()
- 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.
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
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.
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.
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 -
- 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 -
4.1
(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.
- 95 -
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 -
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
u tin thp nht v cao nht c lu trong hai hng (kiu s nguyn) l
Thread.MIN_PRIORITY v Thread.MAX_PRIORITY.
- 98 -
t.interrupt();
Nu thread ang trng thi sleep, vic dng n s lm pht sinh 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
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
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.
4.5
Runnable.
Khi , class phi hin thc phng thc void run() ca interface ny.
- 99 -
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
- 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
- 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...
- 102 -
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.
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
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
Tuyn trnh
Tuyn trnh
Tuyn trnh
Tuyn trnh
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.
- 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.
- 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(); } } }
- 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
- 109 -
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
- 110 -
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); }
- 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; } } }
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.
- 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
5.2
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); }
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); } } } {
- 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
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
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 -
5.3
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.
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 -
- 122 -
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.
- 123 -
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 -
6.1
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
- 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
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
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
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.
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 (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
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);
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
Socket
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.
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.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();
- 134 -
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.
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); }
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 -
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)
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
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 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());
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
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 -
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
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(); } } }
- 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 -
7.1
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
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
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.
- 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:
TCP
Nhiu hn
- 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.
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);
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 -
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 -
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); }
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)
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 -
7.4
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
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
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 -
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
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 -
} }
- 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 -
8.1
Tun t ha i tng
- 172 -
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).
- 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
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.
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);
- 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);
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
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().
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 -
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 -
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
JVM
9.4
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 -
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
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
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 -
import java.rmi.*; public interface FileInterface extends Remote { public byte[] RemoteException; } downloadFile(String fileName)throws
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 -
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 RMI ta cn thc hin cc bc sau: Bc 1: Bin dch cc tp chng trnh
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
- 195 -
FileServer.class
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
9.9
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.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
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.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);
- 198 -
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
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)
- 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
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 -
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.
[11] Shengxi Zhou, Transport Java objects over the network with datagram packets,
http://www.javaworld.com, 2006