Lập trình Socket cho giao thức TCP

Embed Size (px)

Citation preview

Chng 6

Lp trnh Socket cho giao thc TCP1. M hnh client/serverM hnh c ph bin nht v c chp nhn rng ri trong cc h thng phn tn l m hnh client/server. Trong m hnh ny s c mt tp cc tin trnh m mi tin trnh ng vai tr nh l mt trnh qun l ti nguyn cho mt tp hp cc ti nguyn cho trc v mt tp hp cc tin trnh client trong mi tin trnh thc hin mt tc v no cn truy xut ti ti nguyn phn cng hoc phn mm dng chung. Bn thn cc trnh qun l ti nguyn cn phi truy xut ti cc ti nguyn dng chung c qun l bi mt tin trnh khc, v vy mt s tin trnh va l tin trnh client va l tin trnh server. Cc tin trnh pht ra cc yu cu ti cc server bt k khi no chng cn truy xut ti mt trong cc ti nguyn ca cc server. Nu yu cu l ng n th server s thc hin hnh ng c yu cu v gi mt p ng tr li ti tin trnh client. M hnh client/server cung cp mt cch tip cn tng qut chia s ti nguyn trong cc h thng phn tn. M hnh ny c th c ci t bng rt nhiu mi trng phn cng v phn mm khc nhau. Cc my tnh c s dng chy cc tin trnh client/server c nhiu kiu khc nhau v khng cn thit phi phn bit gia chng; c tin trnh client v tin trnh server u c th chy trn cng mt my tnh. Mt tin trnh server c th s dng dch v ca mt server khc. M hnh truyn tin client/server hng ti vic cung cp dch v. Qu trnh trao i d liu bao gm: 1. Truyn mt yu cu t tin trnh client ti tin trnh server 2. Yu cu c server x l 3. Truyn p ng cho client M hnh truyn tin ny lin quan n vic truyn hai thng ip v mt dng ng b ha c th gia client v server. Tin trnh server phi nhn thc c thng ip c yu cu bc mt ngay khi n n v hnh ng pht ra yu cu trong client phi c tm dng (b phong ta) v buc tin trnh client trng thi ch cho t khi n nhn c p ng do server gi v bc ba. M hnh client/server thng c ci t da trn cc thao tc c bn l gi (send) v nhn (receive).

119

Client Server

Request message

Wait

Reply Execution

Request message

Tin trnh ang x l

Tin trnh ang phong taHnh 4.1 Qu trnh giao tip client v server c th din ra theo mt t rong hai ch : b phong ta (blocked) v khng b phong ta (non-blocked). Ch b phong ta (blocked): Trong ch b phong ta, khi tin trnh client hoc server pht ra lnh gi d liu (send), vic thc thi ca tin trnh s b tm ngng cho ti khi tin trnh nhn pht ra lnh nhn d liu (receive). Tng t i vi tin trnh nhn d liu, nu tin trnh no (client hoc server) pht ra lnh nhn d liu, m ti thi im cha c d liu gi ti th vic thc thi ca tin trnh cng s b tm ngng cho ti khi c d liu gi ti. Ch khng b phong ta (non-blocked) Trong ch ny, khi tin trnh client hay server pht ra lnh gi d liu thc s, vic thc thi ca tin trnh vn c tin hnh m khng quan tm n vic c tin trnh no pht ra lnh nhn d liu hay khng. Tng t cho trng hp nhn d liu, khi tin trnh pht ra lnh nhn d liu, n s nhn d liu hin c, vic thc thi ca tin trnh vn c tin hnh m khng quan tm n vic c tin trnh no pht ra lnh gi d liu tip theo hay khng.

2. Cc kin trc Client/Server2.1. Client/Server hai tng (two-tier client/server) Kin trc client/server n gin nht l kin trc hai tng. Trong thc t hu ht cc kin trc client/server l kin trc hai tng. Mt ng dng hai tng cung cp nhiu trm lm vic vi mt tng trnh din thng nht, tng ny truyn tin vi tng lu tr d liu tp trung. Tng trnh din thng thng l client, v tng lu tr d liu l server. Hu ht cc ng dng Internet nh l email, telnet, ftp thm ch l c Web l cc ng dng hai tng. Phn ln cc lp trnh vin trnh ng dng vit cc ng dng client/server c xu th s dng kin trc ny.

120

Trong ng dng hai tng truyn thng, khi lng cng vic x l c dnh cho pha client trong khi server ch n gin ng vai tr nh l chng trnh kim sot lung vo ra gia ng dng v d liu. Kt qu l khng ch hiu nng ca ng dng b gim i do ti nguyn hn ch ca PC, m khi lng d liu truyn i trn mng cng tng theo. Khi ton b ng dng c x l trn mt PC, ng dng bt buc phi yu cu nhiu d liu trc khi a ra bt k kt qu x l no cho ngi dng. Nhiu yu cu d liu cng lm gim hiu nng ca mng. Mt vn thng gp khc i vi ng dng hai tng l vn bo tr. Ch cn mt thay i nh i vi ng dng cng cn phi thay i li ton b ng dng client v server.

Hnh 4.2 2.2. Client/Server ba tng Ta c th trnh c cc vn ca kin trc client/server hai tng bng cch m rng kin trc thnh ba tng. Mt kin trc ba tng c thm mt tng mi tc bit vic x l d liu v tr trung tm.

Hnh 4.3

121

Theo kin trc ba tng, mt ng dng c chia thnh ba tng tch bit nhau v mt logic. Tng u tin l tng trnh din thng bao gm cc giao din ha. Tng th hai, cn c gi l tng trung gian hay tng tc nghip. Tng th ba cha d liu cn cho ng dng. Tng th ba v c bn l chng trnh thc hin cc li gi hm tm kim d liu cn thit. Tng trnh din nhn d liu v nh dng n hin th. S tch bit gia chc nng x l vi giao din to nn s linh hot cho vic thit k ng dng. Nhiu giao din ngi dng c xy dng v trin khai m khng lm thay i logic ng dng. Tng th ba cha d liu cn thit cho ng dng. D liu ny c th bao gm bt k ngun thng tin no, bao gm c s d liu nh Oracale, SQL Server hoc ti liu XML. 2.3. Kin trc n-tng Kin trc n-tng c chia thnh cc tng nh sau: Tng giao din ngi dng: qun l tng tc ca ngi dng vi ng dng Tng logic trnh din: Xc nh cch thc hin th giao din ngi dng v cc yu cu ca ngi dng c qun l nh th no. Tng logic tc nghip: M hnh ha cc quy tc tc nghip, Tng cc dch v h tng: Cung cp mt chc nng b tr cn thit cho ng dng nh cc thnh phn (truyn thng ip, h tr giao tc).

3. M hnh truyn tin socketServer Socket() 1 Client Socket()

Bind()

2

Bind()

Listen()

3 4 Connect()

Accept()

5

Cc chc nng gi v nhn

6

Cc chc nng gi v nhn

Close()

7

Close()

Hnh 4.4

122

Khi lp trnh, ta cn quan tm n ch b phong ta, v n c th dn n tnh hung mt tin trnh no s ri vo vng lp v hn ca qu trnh gi hoc nhn. Trong chng 1 chng ta bit hai giao thc TCP v UDP l cc giao thc tng giao vn truyn d liu. Mi giao thc c nhng u v nhc im ring. Chng 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. Khi lp trnh cho TCP ta s dng cc socket lung, cn i vi giao thc UDP ta s s dng lp DatagramSocket v DatagramPacket. Truyn tin hng lin kt ngha l cn c giai on thit lp lin kt v gii phng lin kt trc khi truyn tin. 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 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. Tht may mn, ta khng cn phi t thc hin cng vic ny. Socket l mt cuc cch mng ca Berkeley UNIX. 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. V mt lch s Socket l mt s m rng ca mt trong nhng tng quan trng nht ca UNIX: tt c cc thao tc vo/ra ging nh vo ra tp tin i vi ngi lp trnh, cho d ta ang lm vic vi bn phm, mn hnh ha, mt file thng thng, hay mt lin kt mng. Cc Socket che du ngi lp trnh khi cc chi tit mc thp ca mng nh mi 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

Lp Socket ca Java c s dng bi c client v server, 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: Mt socket mi c to ra bng cch s dng hm Socket(). Socket c gng lin kt vi mt host xa. 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

123

l song cng (full-duplex)-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.

4. Socket cho Client 4.1. Cc constructor public Socket(String host, int port) throws UnknownHostException, IOException Hm ny to mt socket TCP vi host v cng xc nh, v thc hin lin kt vi host xa. V d: try{ Socket s = new Socket( www.vnn.vn,80); } catch(UnknownHostException e){ System.err.println(e); } catch(IOException e){ System.err.println(e); } Trong hm ny tham s host l hostname kiu String, nu host khng xc nh hoc my ch tn min khng hot ng th constructor a ra ngoi l UnknownHostException. V mt l do no m khng th m c socket th constructor s a ra ngoi l IOException. C nhiu nguyn nhn khin cho mt lin kt tht bi: host m ta ang c gng kt ni ti khng chp nhn lin kt, kt ni Internet c th b ngt, hoc vn nh tuyn c th ngn nga cc gi tin ca ta ti ch. 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) { String host="localhost"; if(args.length>0){ host=args[0]; } for(int i=0;istart java EchoClient1

Hnh 4.7

8. ng dng a tuyn on trong lp trnh JavaCc 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

136

{ private Socket socket; private BufferedReader in; private PrintWriter out; public EchoServe (Socket s) throws IOException { socket = s; System.out.println("Serving: "+socket); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // Cho php auto-flush: out = new PrintWriter(new BufferedWriter(new OutputStreamWriter( 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 {

137

socket.close(); } catch(IOException e) {} } } } public class TCPServer1 { static int PORT=0; . public static void main(String[] args) throws IOException { 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();

138

} } } Chng trnh pha client import java.net.*; import java.io.*; public class TCPClient1 { public static void main(String[] args) throws IOException { if (args.length != 2) { System.out.println("S dng: java TCPClient hostid port#"); 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); BufferedReader in = new BufferedReader(new InputStreamReader( 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 = new DataInputStream(new BufferedInputStream(System.in)); try {

139

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); String strout = in.readLine(); { // Compare Both Strings System.out.println("Received: "+strout); } else System.out.println("Echo bad -- string unequal"+ strout); } // of for ;; } catch (IOException e) { e.printStackTrace(); } // 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) // Send the message // Recive it back

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

140

{ System.err.println("Can't open socket"); e.printStackTrace(); System.exit(1); } } }

9. Kt lunChng 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.

141