Bai Giang LT Mang

You might also like

You are on page 1of 117

CHNG 1: CC KI N TH C C B N V M NG MY TNH.......................................3 1.1. M hnh tham kh o 7 t ng OSI........................................................................................3 1.2. H giao th c TCP/IP........................................................................................................5 1.3.

So snh gi a hai giao th c TCP v UDP .........................................................................6 1.4. C ng giao th c.................................................................................................................7 1.5. a ch IP, cc a ch IP dnh ring................................................................................7 1.6. a ch tn mi n: lo i A, lo i MX.. .................................................................................8 1.7. M t s giao th c t ng ng d ng: HTTP, SMTP, POP3, FTP... ...................................8 CHNG 2: L P TRNH M NG TRONG .NET FRAMEWORK ........................................9 2.1. Socket h ng k t n i (TCP Socket) ................................................................................9 2.1.1. Gi i thi u v NameSpace System.Net v System.Net.Sockets ..............................10 2.1.2. Vi t chng trnh cho pha my ch .......................................................................11 2.1.3. Vi t chng trnh cho pha my khch...................................................................13 2.1.4. S d ng cc lu ng nh p xu t v i Socket................................................................14 2.2. Socket khng h ng k t n i (UDP Socket)...................................................................17 2.2.1. Vi t chng trnh cho pha my ch .......................................................................17 2.2.2. Vi t chng trnh cho pha my khch...................................................................18 2.2.3. S d ng l p System.IO.MemoryStream t o vng m nh p xu t.....................20 2.3. S d ng cc l p h tr c xy d ng t l p Soket .....................................................20 2.3.1. L p TCPClient........................................................................................................21 2.3.2. L p TCPListener ....................................................................................................22 2.3.3. L p UDPClient .......................................................................................................24 2.4. Socket khng ng b ....................................................................................................26 2.4.1. M hnh x l s ki n c a windows .......................................................................26 2.4.2. S d ng Socket khng ng b ..............................................................................27 2.4.3. V d v Socket khng ng b ..............................................................................28 2.4.4. S d ng cc phng th c Non-blocking ................................................................35 2.5. S d ng Thread trong cc ng d ng m ng ....................................................................39 2.5.1. S d ng Thread trong chng trnh .Net ................................................................40 2.5.2. S d ng Thread trong cc chng trnh Server ......................................................41 2.5.3. S d ng Thread g i/nh n d li u.......................................................................41 2.5.4. S d ng ThreadPool trong cc chng trnh .Net ..................................................43 2.5.5. S d ng ThreadPool trong cc chng trnh Server...............................................47 2.6. K thu t IP Multicasting................................................................................................48 2.6.1. Broadcasting l g?..................................................................................................48 2.6.2. S d ng Broadcasting g i d li u n nhi u my trong m ng c c b ..............48 2.6.3. Multicasting l g? ..................................................................................................49 2.6.4. Socket Multicasting trong .Net ...............................................................................50 2.7 Bi t p p d ng ...............................................................................................................53 CHNG 3: XY D NG NG D NG M NG ...................................................................55 3.1. Giao th c ICMP.............................................................................................................55 3.1.1. S d ng Raw Socket...............................................................................................55 3.1.2. S d ng giao th c ICMP v Raw Socket xy d ng chng trnh Ping.............57 3.1.3. S d ng giao th c ICMP v Raw Socket xy d ng chng trnh TraceRoute .58 3.2. Giao th c SMTP, POP3.................................................................................................60 3.2.1. C b n v h th ng Mail v giao th c SMTP, POP3 .............................................60 3.2.2. Ci t SMTP, POP3 Client/Server ........................................................................60 3.3. Giao th c HTTP.............................................................................................................67 3.3.1. C b n v giao th c HTTP .....................................................................................67 3.3.2. Ci t HTTP Client/Server....................................................................................68 3.4. Giao th c FTP................................................................................................................74 3.4.1. C b n v giao th c FTP ........................................................................................74 3.4.2. Ci t FTP Client/Server.......................................................................................84 1

3.5. DNS (Domain Name Server) .........................................................................................88 3.5.1. V n phn gi i tn mi n ......................................................................................88 3.5.2. Tri n khai DNS MX (Mail Exchange) ...................................................................89 3.6 Th o lu n v cc ng d ng khc th ng g p .................................................................93 3.7 Bi t p p d ng ...............................................................................................................93 CHNG 4: XY D NG NG D NG NHI U L P ..........................................................94 4.1. M hnh 2 l p (two tier), 3 l p (three tier) v n l p. .....................................................94 4.2. Remoting........................................................................................................................98 4.2.1. Gi i thi u v Remoting.........................................................................................102 4.2.2. Khai bo, ci t v ng k giao di n t xa ........................................................102 4.2.3. Tri u g i phng th c t xa .................................................................................107 4.3. Web Serive...................................................................................................................107 4.3.1. Gi i thi u v Web Serives ....................................................................................107 4.3.2. Giao th c SOAP ...................................................................................................109 4.3.3. Xy d ng Web Services........................................................................................112 4.3.4. Tri u g i Web Services t ng d ng .NET, Java v cc ngn ng khc .............114 4.4 Th o lu n v cc ng d ng phn tn ............................................................................116 4.5. Bi t p p d ng ............................................................................................................116

CHNG 1: CC KI N TH C C B N V M NG MY TNH
1.1. M hnh tham kh o 7 t ng OSI

M hnh k t n i h th ng m c T ch c qu c t v tiu chu n ho ISO (International Organizaiton for Standardization) a ra nh m cung c p m t m hnh chu n cho cc nh s n xu t v cung c p s n ph m vi n thng p d ng theo pht tri n cc s n ph m vi n thng. t ng m hnh ho c t o ra cn nh m h tr cho vi c k t n i gi a cc h th ng v modun ho cc thnh ph n ph c v m ng vi n thng. a. Ch c nng c a m hnh OSI: - Cung c p ki n th c v ho t ng c a k t n i lin m ng - a ra trnh t cng vi c thi t l p v th c hi n m t giao th c cho k t n i cc thi t b trn m ng. M hnh OSI cn c m t s thu n l i sau : Chia nh cc ho t ng ph c t p c a m ng thnh cc ph n cng vi c n gi n. Cho php cc nh thi t k c kh nng pht tri n trn t ng modun ch c nng. Cung c p cc kh nng nh ngha cc chu n giao ti p c tnh tng thch cao plug and play v tch h p nhi u nh cung c p s n ph m. b. C u trc m hnh OSI: M hnh OSI g m 7 l p (level), m i l p th c hi n cc ch c nng ring cho ho t ng k t n i m ng. Hnh 1-1 M t b y l p OSI. 4 l p u nh ngha cch th c cho u cu i thi t l p k t n i v i nhau trao i d li u. 3 l p trn dng pht tri n cc ng d ng u cu i k t n i v i nhau v ng i dng. Aplication Application (Upper Layer) Presentation Session Transport Layer Network Layer Data Link Physical Cc l p trn 3 l p trn cng c a m hnh OSI th ng c g i l cc l p ng d ng (Application layers) hay cn g i l cc l p cao. Cc l p ny th ng lin quan t i giao ti p v i ng i dng, nh d ng c a d li u v phng th c truy nh p cc ng d ng . Hnh 1-2 M t cc l p trn v cung c p thng tin v i cc ch c nng c a n qua v d : - L p ng d ng: ch c nng giao Telnet, HTTP
3

Data Lower Layer

Application

ti p gi a ng i s d ng v cc chng trnh ng d ng - L p trnh by: cch th c chu n ASSCII ho d li u v trnh by s li u EBCDIC - C ch c nng c bi t l m ho JPEC d li u ng i s dung - L p phin: thi t l p, duy tr v NFS, SQL hu b m t phin lm vi c

Presentation

Session Transport Layer Network Layer Data Link Physical

Application layer : y l l p cao nh t trong m hnh. N l ni m ng i s d ng ho c k t n i cc chng trnh ng d ng v i cc th t c cho php truy nh p vo m ng. Presentation layer : L p presentation cung c p cc m v ch c nng chuy n i m c cung c p b i l p ng d ng. Cc ch c nng m b o r ng d li u t l p ng d ng trong m t h th ng c th c c b i l p ng d ng c a m t h th ng khc. VD : dng m ho d li u t l p ng d ng : nh m ho nh jpeg , gif. M cho php ta c th hi n ln trang web . Session layer : c s d ng thi t l p, duy tr v k t thc phin lm vi c gi a cc l p presentation. Vi c trao i thng tin l p ny bao g m yu c u d ch v v p ng yu c u c a cc ng d ng trn thi t b khc. Cc l p d i. 4 l p d i c a m hnh OSI s d ng nh ngha lm th no d li u c truy n i trong cc dy n i v t l, cc thi t b m ng v i n tr m u cu i cu i cng l n cc l p ng d ng. Qu n sch ny ta ch quan tm n 4 l p cu i. V s xem xt t ng l p m t cch chi ti t giao thi p gi a cc l p trong m hnh OSI: S d ng phng php protocal stack k t n i gi a hai thi t b trong m ng. Protocal stack l m t t p h p cc quy nh dng nh ngha lm th no d li u truy n qua m ng. V d v i : TCP/IP m i Layer cho php d li u truy n qua. Cc l p trao i cc thng tin cung c p cu c lin l c gi a hai thi t b trong m ng. Cc l p giao ti p v i nhau s d ng Protocal Data Unit (PDU). Thng tin i u khi n c a PDU c thm

vo v i d li u l p trn. V thng tin i u khi n ny n m trong tr ng g i l tr ng header v trailer.


Hnh 1-3 Data encapsulation

Application Presentation Upper Layer Data TCP Header Upper Layer Data Session Transport Segment

IP Header

Data

Network

Packet

LLC Header

Data

FCS

Data Link

Frame

MAC Header

Data

FCS

Physical

Bits

0101110101001000010
1.2. H giao th c TCP/IP

Cc t ng c a giao th c TCP/IP so v i c c t ng c a m hnh OSI Application: Xc nh n quy n, nn d li u v cc d ch v cho ng i dng Transport: X l d li u gi a cc h th ng va cung c p vi c truy c p m ng cho cc ng d ng Network: Tm ng cho cc packet
5

Link: M c OS ho c cc thi t b giao ti p m ng trn m t my tnh

M t s i m khc nhau c a TCP/IP v m hnh OSI + L p ng d ng trong TCP/IP x l ch c nng c a l p 5,6,7 trong m hnh OSI + L p transport trong TCP/IP cung c p c ch UDP truy n khng tin c y, transport trong OSI lun m b o truy n tin c y + TCP/IP l m t t p c a cc protocols (m t b giao th c) + TCP/IP xy d ng tr c OSI Quy trnh ng gi d li u trong m hnh TCP/IP nh sau:

1.3. So snh gi a hai giao th c TCP v UDP

1.4. C ng giao th c

L m t s nm trong kho ng 1..65535 dng phn bi t gi a 2 ng d ng m ng v i nhau g n v i a ch IP v Socket M t s c ng v cc giao th c thng d ng: + FTP: 21 + Telnet: 23 + SMTP: 25 + POP3: 110 + HTTP:80
1.5. a ch IP, cc a ch IP dnh ring
0 1 2 3 4 Class A Class B Class C Class D Class E 0 1 0 1 1 0 1 1 1 0 1 1 1 1 0 Netid Netid Netid Multicast address Reverved for future use 8 16 Hostid Hostid Hostid 24

1.6. a ch tn mi n: lo i A, lo i MX..

1.7. M t s giao th c

t ng ng d ng: HTTP, SMTP, POP3, FTP...

- Chng ta s nghin c u chi ti t cc giao th c ny

chng 3
8

CHNG 2: L P TRNH M NG TRONG .NET FRAMEWORK


2.1. Socket h ng k t n i (TCP Socket)

Socket l m t giao di n l p trnh ng d ng (API) m ng Thng qua giao di n ny chng ta c th l p trnh i u khi n vi c truy n thng gi a hai my s d ng cc giao th c m c th p l TCP, UDP Socket l s tr u t ng ho m c cao, c th t ng t ng n nh l thi t b truy n thng hai chi u g i nh n d li u gi a hai my tnh v i nhau. Cc lo i Socket Socket h ng k t n i (TCP Socket) Socket khng h ng k t n i (UDP Socket) Raw Socket

c i m c a Socket h ng k t n i C 1 ng k t n i o gi a 2 ti n trnh M t trong 2 ti n trnh ph i i ti n trnh kia yu c u k t n i. C th s d ng lin l c theo m hnh Client/Server Trong m hnh Client/Server th Server l ng nghe v ch p nh n m t yu c uk tn i M i thng i p g i u c xc nh n tr v Cc gi tin chuy n i tu n t
c i m c a Socket khng h ng k t n i Hai ti n trnh lin l c v i nhau khng k t n i tr c ti p Thng i p g i i ph i km theo a ch c a ng i nh n Thng i p c th g i nhi u l n Ng i g i khng ch c ch n thng i p t i tay ng i nh n Thng i p g i sau c th n ch tr c thng i p g i tr c .

S hi u c ng c a Socket

c th th c hi n cc cu c giao ti p, m t trong hai qu trnh ph i cng b s hi u c ng c a socket m mnh s d ng. M i c ng giao ti p th hi n m t a ch xc nh trong h th ng. Khi qu trnh c gn m t s hi u c ng, n c th nh n d li u g i n c ng ny t cc qu trnh khc. Qu trnh cn l i cng yu c u t o ra m t socket. 2.1.1. Gi i thi u v NameSpace System.Net v System.Net.Sockets Cung c p m t giao di n l p trnh n gi n cho r t nhi u cc giao th c m ng. C r t nhi u l p l p trnh Ta quan tm l p IPAdress, IPEndPoint, DNS, L p IPAdress M t s Field c n ch : Any: Cung c p m t a ch IP ch ra r ng Server ph i l ng nghe trn t t c cc Card m ng Broadcast: Cung c p m t a ch IP qu ng b Loopback: Tr v m t a ch IP l p AdressFamily: Tr v h a ch c a IP hi n hnh L p IPAddress M t s phng th c c n ch : Phng th c kh i t o IPAddress(Byte[]) IPAddress(Int64) IsLoopback: Cho bi t a ch c ph i a ch l p khng Parse: Chuy n IP d ng xu v IP chu n ToString: Tr a ch IP v d ng xu TryParse: Ki m tra IP d ng xu c h p l khng? L p IPEndPoint M t s phng th c c n ch : Phng th c kh i t o IPEndPoint (Int64, Int32) IPEndPoint (IPAddress, Int32) Create: T o m t EndPoint t m t a ch Socket ToString : Tr v a ch IP v s hi u c ng theo khun d ng aCh : C ng, v d : 192.168.1.1:8080 L p DNS M t s thnh ph n c a l p: HostName: Cho bi t tn c a my c phn gi i GetHostAddress: Tr v t t c IP c a m t tr m GetHostEntry: Gi i p tn ho c a ch truy n vo v tr v i t ng IPHostEntry
10

GetHostName: L y v tn c a my tnh c c b NameSpace System.Net.Sockets M t s l p hay dng: TcpClient, UdpClient, TcpListener, Socket, NetworkStream, t o ra Socket Socket(AddressFamily af, SocketType st, ProtocolType pt)
SocketType Dgram Stream Raw Raw Protocoltype Udp Tcp Icmp Raw Description Connectionless communication Connection-oriented communication Internet Control Message Protocol Plain IP packet communication

using System.Net; using System.Net.Sockets; class SockProp { public static void Main() { IPAddress ia = IPAddress.Parse("127.0.0.1"); IPEndPoint ie = new IPEndPoint(ia, 8000); Socket test = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Console.WriteLine("AddressFamily: {0}", test.AddressFamily); Console.WriteLine("SocketType: {0}", test.SocketType); Console.WriteLine("ProtocolType: {0}", test.ProtocolType); Console.WriteLine("Blocking: {0}", test.Blocking); test.Blocking = false; Console.WriteLine("new Blocking: {0}", test.Blocking); Console.WriteLine("Connected: {0}", test.Connected); test.Bind(ie); IPEndPoint iep = (IPEndPoint)test.LocalEndPoint; Console.WriteLine("Local EndPoint: {0}", iep.ToString()); test.Close(); Console.ReadKey(); } } 2.1.2. Vi t chng trnh cho pha my ch Vi t chng trnh cho pha my ch T o m t Socket Lin k t v i m t IPEndPoint c c b L ng nghe k t n i Ch p nh n k t n i G i nh n d li u theo giao th c thi t k
11

ng k t n i sau khi hon thnh v tr l i tr ng thi l ng nghe ch k tn im i Vi t chng trnh cho pha my ch IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); Socket newsock = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Socket client = newsock.Accept(); //G i nh n d li u theo giao th c thi t k . newsock.Close();
Chng trnh Server:

using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; class Server{ static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(10); Console.WriteLine("Cho ket noi tu client"); Socket client = server.Accept(); Console.WriteLine("Chap nhan ket noi tu:{0}", client.RemoteEndPoint.ToString()); string s = "Chao ban den voi Server"; //Chuyen chuoi s thanh mang byte byte[] data = new byte[1024]; data = Encoding.ASCII.GetBytes(s); //gui nhan du lieu theo giao thuc da thiet ke client.Send(data,data.Length,SocketFlags.None); while (true) { data = new byte[1024]; int recv = client.Receive(data); if (recv == 0) break; //Chuyen mang byte Data thanh chuoi va in ra man hinh s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Clien gui len:{0}", s); //Neu chuoi nhan duoc la Quit thi thoat if (s.ToUpper().Equals("QUIT")) break; //Gui tra lai cho client chuoi s s = s.ToUpper(); data = new byte[1024];
12

data = Encoding.ASCII.GetBytes(s); client.Send(data, data.Length, SocketFlags.None); } client.Shutdown(SocketShutdown.Both); client.Close(); server.Close(); }


}

2.1.3. Vi t chng trnh cho pha my khch Vi t chng trnh cho pha my khch Xc nh a ch c a Server T o Socket K t n i n Server G i nh n d li u theo giao th c thi t k ng Socket Vi t chng trnh cho pha my khch IPEndPoint ipep = new IPEndPoint(Ipaddress.Parse("192.168.1.6"), 9050); Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); server.Connect(ipep);
Chng trnh Client:

using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; class Client { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(iep); byte[] data = new byte[1024]; int recv = client.Receive(data); string s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Server gui:{0}", s); string input; while (true) { input = Console.ReadLine(); //Chuyen input thanh mang byte gui len cho server data = new byte[1024]; data = Encoding.ASCII.GetBytes(input); client.Send(data, data.Length, SocketFlags.None); if (input.ToUpper().Equals("QUIT")) break; data = new byte[1024]; recv = client.Receive(data);
13

s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Server gui:{0}", s);


} client.Disconnect(true); client.Close(); } }

2.1.4. S d ng cc lu ng nh p xu t v i Socket T Socket ta c th t o ra lu ng nh p xu t v i Socket l s d ng l p NetworkStream


Property CanRead CanSeek CanWrite DataAvailable Description Is true if the NetworkStream supports reading Is always false for NetworkStreams Is true if the NetworkStream supports writing Is true if there is data available to be read

V d chng trnh Client/Server s d ng NetworkStream g i v nh n d li u Chng trnh Client s d ng NetworkStream: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets;
14

class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2009); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(iep); NetworkStream ns = new NetworkStream(client); byte[] data = new byte[1024]; while (true) { string input = Console.ReadLine(); data = Encoding.ASCII.GetBytes(input); ns.Write(data, 0, data.Length); if (input.ToUpper().Equals("QUIT")) break; data = new byte[1024]; int rec = ns.Read(data, 0, data.Length); string s = Encoding.ASCII.GetString(data, 0, rec); Console.WriteLine(s); } client.Close(); } } Chng trnh Server s d ng NetworkStream: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { IPEndPoint iep=new IPEndPoint(IPAddress.Parse("127.0.0.1"),2009); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(10); Socket client = server.Accept(); byte[] data; NetworkStream ns = new NetworkStream(client); while (true) { data = new byte[1024]; int rec = ns.Read(data, 0, data.Length); string s = Encoding.ASCII.GetString(data, 0, rec); Console.WriteLine(s); data = new byte[1024]; s = s.ToUpper(); if (s.Equals("QUIT")) break; data = Encoding.ASCII.GetBytes(s); ns.Write(data, 0, data.Length); }
15

client.Close(); server.Close(); } } Trn c s c a NetworkStream ta c th n i thm cc lu ng nh p xu t theo h ng k t nh StreamReader, StreamWriter Sau y l m t v d v chng trnh Client/Server s d ng lu ng nh p xu t, chng trnh Server chp php Client g i ln yu c u, n u yu c u l GetDate khng phn bi t ch hoa ch th ng th Server tr v cho Client ngy hi n t i, n u yu c u l GetTime khng phan bi t hoa th ng th Server tr v gi hi n t i, n u l Quit th Server ng t k t n i v i Client, khng ph i cc tr ng h p trn th thng bo khng hi u lnh. Chng trnh pha Client: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; class DateTimeClient { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(iep); NetworkStream ns = new NetworkStream(client); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); while (true) { string input = Console.ReadLine(); sw.WriteLine(input); sw.Flush(); if (input.ToUpper().Equals("QUIT")) break; string kq = sr.ReadLine(); Console.WriteLine(kq); } sr.Close(); sw.Close(); ns.Close(); client.Close(); } } Chng trnh pha Server: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net;
16

using System.Net.Sockets; using System.IO; class DateTimeServer{ static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2009); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(10); Socket client = server.Accept(); NetworkStream ns = new NetworkStream(client); StreamReader sr = new StreamReader(ns StreamWriter sw = new StreamWriter(ns); string kq=""; while (true) { string s = sr.ReadLine(); s=s.ToUpper(); if (s.Equals("QUIT")) break; if (s.Equals("GETDATE")) kq = DateTime.Now.ToString("dd/MM/yyyy"); else if (s.Equals("GETTIME")) kq = DateTime.Now.ToString("hh:mm:ss"); else kq = "Khong hieu lenh"; sw.WriteLine(kq); sw.Flush(); } sr.Close(); sw.Close(); client.Close(); } }
2.2. Socket khng h ng k t n i (UDP Socket)

Chng trnh pha my ch T o m t Socket Lin k t v i m t IPEndPoint c c b G i nh n d li u theo giao th c thi t k ng Socket Chng trnh pha my khch Xc nh a ch Server T o Socket G i nh n d li u theo giao th c thi t k ng Socket 2.2.1. Vi t chng trnh cho pha my ch using System;
17

using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); server.Bind(iep); //tao ra mot Endpot tu xa de nhan du lieu ve IPEndPoint RemoteEp = new IPEndPoint(IPAddress.Any, 0); EndPoint remote=(EndPoint)RemoteEp; byte[] data = new byte[1024]; int recv = server.ReceiveFrom(data, ref remote); string s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("nhan ve tu Client:{0}", s); data = Encoding.ASCII.GetBytes("Chao client"); server.SendTo(data, remote); while (true) { data=new byte[1024]; recv = server.ReceiveFrom(data, ref remote); s = Encoding.ASCII.GetString(data, 0, recv); if (s.ToUpper().Equals("QUIT")) break; Console.WriteLine(s); data=new byte[1024]; data=Encoding.ASCII.GetBytes(s); server.SendTo(data,0,data.Length,SocketFlags.None,remote); } server.Close(); } } 2.2.2. Vi t chng trnh cho pha my khch using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); String s = "Chao server"; byte[] data = new byte[1024]; data = Encoding.ASCII.GetBytes(s); client.SendTo(data, iep); EndPoint remote = (EndPoint)iep;
18

data = new byte[1024]; int recv = client.ReceiveFrom(data, ref remote); s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Nhan ve tu Server{0}",s); while (true) { s = Console.ReadLine(); data=new byte[1024]; data = Encoding.ASCII.GetBytes(s); client.SendTo(data, remote); if (s.ToUpper().Equals("QUIT")) break; data = new byte[1024]; recv = client.ReceiveFrom(data, ref remote); s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(s); } client.Close(); } } S d ng Socket khng h ng k t n i vi t chng trnh chat gia 2 my nh sau: (Sau ny chng ta c th s d ng l p UdpClient) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; public partial class Form1 : Form { private Socket udp1; private IPEndPoint ipremote, iplocal; public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } private void btStart_Click(object sender, EventArgs e) { udp1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); iplocal = new IPEndPoint(IPAddress.Parse("127.0.0.1"), int.Parse(txtLocalPort.Text)); udp1.Bind(iplocal); ipremote = new IPEndPoint(IPAddress.Parse(txtIp.Text), int.Parse(txtRemotePort.Text)); Thread tuyen = new Thread(new ThreadStart(NhanDL)); tuyen.Start();
19

} private void btSend_Click(object sender, EventArgs e) { byte[] data = new byte[1024]; data = Encoding.ASCII.GetBytes(txtSend.Text); udp1.SendTo(data, ipremote); } private void NhanDL() { while (true) { byte[] data = new byte[1024]; IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 0); EndPoint remote = (EndPoint)ipe; int rec = udp1.ReceiveFrom(data, ref remote); string s = Encoding.ASCII.GetString(data, 0, rec); txtNoidung.Text += s + "\r\n"; } } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(txtSend.Text.Substring(0, txtSend.Text.IndexOf(" "))); } }

2.2.3. S d ng l p System.IO.MemoryStream t o vng m nh p xu t


2.3. S d ng cc l p h tr c xy d ng t l p Soket 20

2.3.1. L p TCPClient M c ch c a l p UDPClient trn l dng cho l p trnh v i giao th c UDP, v i giao th c ny th hai bn khng c n ph i thi t l p k t n i tr c khi g i do v y m c tin c y khng cao. m b o tin c y trong cc ng d ng m ng, ng i ta cn dng m t giao th c khc, g i l giao th c c k t n i : TCP (Transport Control Protocol). Trn Internet ch y u l dng lo i giao th c ny, v d nh Telnet, HTTP, SMTP, POP3 l p trnh theo giao th c TCP, MS.NET cung c p hai l p c tn l TCPClient v TCPListener. - Cc thnh ph n c a l p TcpClient + Phng th c kh i t o:

Constructor Method Name TcpClient () TcpClient (IPEndPoint) Description T o m t i t ng TcpClient. Cha t thng s g. T o m t TcpClient v g n cho n m t EndPoint c c b . (Gn a ch my c c b v s hi u c ng s d ng trao i thng tin v sau) T o m t i t ng TcpClient v k t n i n m t my c a ch v s hi u c ng c truy n vo.. RemoteHost c th l a ch IP chu n ho c tn my.

TcpClient (RemoteHost: String, Int32)


+ M t s thu c tnh:

Name Available Client

Description Cho bi t s byte nh n v t c. Tr v Socket m ng v c s n

ng v i TCPClient hi n hnh.

Connected Tr ng thi cho bi t k t n i c n Server hay cha ?


+ M t s phng th c:

Name Close Connect (RemoteHost, Port)

Description Gi i phng i t ng TcpClient nhng khng ng k t n i. K t n i n m t my TCP khc c Tn v s hi u c ng.

21

GetStream

Tr v NetworkStream t gip ta g i hay nh n d li u. (Th ng lm tham s khi t o StreamReader v StreamWriter) . Khi g n vo StreamReader v StreamWriter r i th ta c th g i v nh n d li u thng qua cc phng th c Readln, writeline tng ng c a cc l p ny.

Ta s d ng l p TcpClient vi t l i chng trnh DateTimeClient nh sau: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; class DateTimeClient { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); TcpClient client = new TcpClient(); client.Connect(iep); StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); while (true) { string input = Console.ReadLine(); sw.WriteLine(input); sw.Flush(); if (input.ToUpper().Equals("QUIT")) break; string kq = sr.ReadLine(); Console.WriteLine(kq); } sr.Close(); sw.Close(); client.Close(); } } 2.3.2. L p TCPListener TCPListerner l m t l p cho php ng i l p trnh c th xy d ng cc ng d ng Server (V d nh SMTP Server, FTP Server, DNS Server, POP3 Server hay server t nh ngha .). ng d ng server khc v i ng d ng Client ch n lun lun th c hi n l ng nghe v ch p nh n cc k t n i n t Client.
22

Cc thnh ph n c a l p TcpListener: + Phng th c kh i t o:

Constructor method Name TcpListener (Port: Int32) TcpListener (IPEndPoint) TcpListener (IPAddress, Int32)
+ Cc phng th c khc

Description T o m t TcpListener v l ng nghe t i c ng ch nh. T o m t TcpListener v i gi tr Endpoint truy n vo. T o m t TcpListener v l ng nghe cc k t n i n t i a ch IP v c ng ch nh.

Name AcceptSocket

Description Ch p nh n m t yu c u k t n i ang ch .

AcceptTcpClient Ch p nh n m t yu c u k t n i ang ch . ( ng d ng s d ng t i l nh ny cho n khi no c m t k t n i n) Pending Start Stop Cho bi t li u c k t n i no ang ch i khng ? (True = c). B t u l ng nghe cc yu c u k t n i. D ng vi c nghe.

S d ng l p TcpListener ta vi t l i chng trnh DateTime Server nh sau: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; class DateTimeServer{ static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2009); TcpListener server = new TcpListener(iep); server.Start(); TcpClient client = server.AcceptTcpClient(); StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); string kq=""; while (true) {
23

string s = sr.ReadLine(); s=s.ToUpper(); if (s.Equals("QUIT")) break; if (s.Equals("GETDATE")) kq = DateTime.Now.ToString("dd/MM/yyyy"); else if (s.Equals("GETTIME")) kq = DateTime.Now.ToString("hh:mm:ss"); else kq = "Khong hieu lenh"; sw.WriteLine(kq); sw.Flush(); } sr.Close(); sw.Close(); client.Close(); } } 2.3.3. L p UDPClient
Giao thc UDP (User Datagram Protocol hay User Define Protocol) l mt giao thc phi kt ni (Connectionless) c ngha l mt bn c th gi d liu cho bn kia m khng cn bit l bn sn s ng hay cha ? (Ni cch khc l khng cn thit lp kt ni gia hai bn khi tin h nh trao i thng tin). Giao thc n y khng tin cy bng giao thc TCP nhng tc li nhanh v d c i t. Ngo i ra, vi giao thc UDP ta cn c th gi cc gi tin qung b (Broadcast) cho ng thi nhiu my. Trong .NET, lp UDPClient (nm trong System.Net.Sockets) ng gi cc chc nng ca giao thc UDP. Constructor methosd UdpClient () Description To mt i tng (th hin) mi ca lp UDPClient. To mt i tng (th hin) mi ca lp UDPClient. Thuc mt dng a ch (AddressFamily) c ch nh. To mt UdpClient v gn (bind) mt cng cho n. To mt UdpClient v gn (bind) mt IPEndpoint (gn a ch IP v cng) cho n. To mt UdpClient v gn s hiu cng, AddressFamily

UdpClient (AddressFamily)

UdpClient (Int32) UdpClient (IPEndPoint)

UdpClient (Int32, AddressFamily)

24

UdpClient (String, Int32)

To mt UdpClient v thit lp vi mt trm t xa mc nh.

PUBLIC Method Name BeginReceive BeginSend Close Connect EndReceive EndSend Receive Description Nhn d liu Khng ng b t my xa. Gi khng ng b d liu ti my xa ng kt ni. Thit lp mt Default remote host. Kt thc nhn d liu khng ng b trn Kt thc vic gi d liu khng ng b trn Nhn d liu (ng b) do my xa gi. (ng b c ngha l cc lnh ngay sau lnh Receive ch c thc thi nu Receive nhn c d liu v . Cn nu n cha nhn c d ch mt cht th n vn c ch (blocking)) Gi d liu (ng b) cho my xa.

Send

V d s d ng UdpClient vi t chng trnh Chat gi a 2 my: Do chng trnh 2 my l nh nhau ta ch c n vi t m t chng trnh copy ra s d ng. Hnh nh c a n nh sau:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;
25

using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace UdpChat { public partial class Form1 : Form { public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } private void btSend_Click(object sender, EventArgs e) { UdpClient send = new UdpClient(); IPEndPoint iepRemote = new IPEndPoint(IPAddress.Parse(txtIp.Text), int.Parse(txtRemotePort.Text)); byte[] data = new byte[1024]; data = Encoding.UTF8.GetBytes(txtSend.Text); send.Send(data, data.Length, iepRemote); txtReceive.Text += "Sender: "+txtSend.Text + "\r\n"; txtSend.Clear(); if (txtSend.Text.ToUpper().Equals("QUIT")) this.Dispose(); } private void btConnect_Click(object sender, EventArgs e) { Thread tuyen = new Thread(new ThreadStart(NhanDl)); tuyen.Start(); } private void NhanDl() { UdpClient receiver = new UdpClient(int.Parse(txtLocalPort.Text)); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); while (true) { byte[] data = new byte[1024]; data = receiver.Receive(ref iep); string s = Encoding.UTF8.GetString(data); if (s.Trim().ToUpper().Equals("QUIT")) break; txtReceive.Text += "Receiver: "+ s + "\r\n"; } } } }
2.4. Socket khng ng b

2.4.1. M hnh x l s ki n c a windows

26

M hnh x l s ki n c a Windows c th hi n qua hnh sau:

Nh v y thng qua m hnh ny ta c th hi n khi s ki n s y ra trn cc Control V d : using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;

y nhi m cho m t th t c no th c

namespace EventDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += new EventHandler(NhanTiep); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Bac da nhan em"); } private void NhanTiep(object sender, EventArgs e) { MessageBox.Show("Bac lai nhan em roi"); } } } v d trn chng ta ngoi s ki n Click c a button 1 chng ta thm m t x ki n khi button1 c nh n l s ki n NhanTiep. 2.4.2. S d ng Socket khng ng b l p trnh khng ng b v i Socket chng ta s d ng cc phng th c cho vi c s d ng b t ng b
27

Cc phng th c cho vi c l p trnh b t ng b c chia lm 2 l i th ng b t u b ng Begin v End: Phng th c b t u b ng Begin, b t u m t ch c nng v c ng k v i phng th c AsyncCallback B t u b ng End ch ch c nng hon thnh khi AsyncCallback c g i.
Requests Started By BeginAccept() BeginConnect() BeginReceive() BeginReceiveFrom() BeginSend() BeginSendTo() Description of Request To accept an incoming connection To connect to a remote host To retrieve data from a socket To retrieve data from a specific remote host To send data from a socket To send data to a specific remote host Requests Ended BY EndAccept() EndConnect() EndReceive() EndReceiveFrom() EndSend() EndSendTo()

- ch p nh n k t n i b t ng b ta s d ng phng th c BeginAccept() v EndAccept() nh sau: Phng th c BeginAccept() v EndAccept() IAsyncResult BeginAccept(AsyncCallback callback, object state) Socket EndAccept(IAsyncResult iar); Th ng c dng nh sau: Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); sock.Bind(iep); sock.Listen(5); sock.BeginAccept(new AsyncCallback(CallAccept), sock); Trong phng th c CallAccept th ng c vi t nh sau: private static void CallAccept(IAsyncResult iar) { Socket server = (Socket)iar.AsyncState; Socket client = server.EndAccept(iar); ... } - thi t l p k t n i theo cch b t ng b chng ta s d ng phng th c BeginConnect() v EndConnect() nh sau: Phng th c BeginConnect() v EndConnect()
28

Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep =new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock); Trong phng th c Connected th ng c vi t nh sau: public static void Connected(IAsyncResult iar) { Socket sock = (Socket)iar.AsyncState; try { sock.EndConnect(iar); } catch (SocketException) { Console.WriteLine("Unable to connect to host"); } } - g i d li u b t ng b chng ta lm nh sau: + Phng th c BeginSend() v EndSend() + BeginSend() IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags sockflag, AsyncCallback callback, object state) V d : sock.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendData), sock); + EndSend() int EndSend(IAsyncResult iar) Trong phng th c SendData th ng c vi t nh sau: private static void SendData(IAsyncResult iar) { Socket server = (Socket)iar.AsyncState; int sent = server.EndSend(iar); } Tng t nh giao th c h ng k t n i n u ta s d ng g i d li u theo giao th c khng h ng k t n i chng ta cng th c hi n tng t nh sau: Phng th c BeginSendTo() v EndSendTo() IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, SocketFlags sockflag, EndPoint ep, AsyncCallback callback, object state) V d : IPEndPoint iep = new EndPoint(IPAddress.Parse("192.168.1.6"), 9050); sock.BeginSendTo(data, 0, data.Length, SocketFlags.None, iep, new AsynCallback(SendDataTo), sock); int EndSendTo(IAsyncResult iar) - nh n d li u b t ng b ta th c hi n nh sau: + Nh n d li u v i giao th c h ng k t n i: Phng th c BeginReceive v EndReceive()
29

sock.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ReceivedData), sock); V i ReceivedData c nh ngha nh sau: void ReceivedData(IAsyncResult iar) { Socket remote = (Socket)iar.AsyncState; int recv = remote.EndReceive(iar); string receivedData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(receivedData); } + Nh n d li u b t ng b v i giao th c khng h ng k t n i. Phng th c BeginReceiveFrom() and EndReceiveFrom() sock.BeginReceive(data, 0, data.Length, SocketFlags.None, ref iep, new AsyncCallback(ReceiveData), sock); void ReceiveData(IasyncResult iar){ Socket remote = (Socket)iar.AsyncState; int recv = remote.EndReceiveFrom(iar); string stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } 2.4.3. V d v Socket khng ng b Sau y chng ta s s d ng cc phng th c khng ng b vi t chng trnh Client/Server theo Socket b t ng b , m i khi Client g i d li u ln Server, n s in ra v g i tr l i cho Client. M hnh c a client/server s d ng cc phng th c b t ng b nh sau:

30

Chng trnh pha Client: using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Windows.Forms; class AsyncTcpClient:Form { private TextBox newText; private TextBox conStatus; private ListBox results; private Socket client; private byte[] data = new byte[1024]; private int size = 1024; public AsyncTcpClient() { Text = "Asynchronous TCP Client"; Size = new Size(400, 380); Label label1 = new Label(); label1.Parent = this; label1.Text = "Enter text string:"; label1.AutoSize = true; label1.Location = new Point(10, 30); newText = new TextBox(); newText.Parent = this; newText.Size = new Size(200, 2 * Font.Height); newText.Location = new Point(10, 55); results = new ListBox(); results.Parent = this; results.Location = new Point(10, 85); results.Size = new Size(360, 18 * Font.Height); Label label2 = new Label(); label2.Parent = this;
31

label2.Text = "Connection Status:"; label2.AutoSize = true; label2.Location = new Point(10, 330); conStatus = new TextBox(); conStatus.Parent = this; conStatus.Text = "Disconnected"; conStatus.Size = new Size(200, 2 * Font.Height); conStatus.Location = new Point(110, 325); Button sendit = new Button(); sendit.Parent = this; sendit.Text = "Send"; sendit.Location = new Point(220,52); sendit.Size = new Size(5 * Font.Height, 2 * Font.Height); sendit.Click += new EventHandler(ButtonSendOnClick); Button connect = new Button(); connect.Parent = this; connect.Text = "Connect"; connect.Location = new Point(295, 20); connect.Size = new Size(6 * Font.Height, 2 * Font.Height); connect.Click += new EventHandler(ButtonConnectOnClick); Button discon = new Button(); discon.Parent = this; discon.Text = "Disconnect"; discon.Location = new Point(295,52); discon.Size = new Size(6 * Font.Height, 2 * Font.Height); discon.Click += new EventHandler(ButtonDisconOnClick); } void ButtonConnectOnClick(object obj, EventArgs ea) { conStatus.Text = "Connecting..."; Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock); } void ButtonSendOnClick(object obj, EventArgs ea) { byte[] message = Encoding.ASCII.GetBytes(newText.Text); newText.Clear(); client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), client); } void ButtonDisconOnClick(object obj, EventArgs ea) { client.Close(); conStatus.Text = "Disconnected"; } void Connected(IAsyncResult iar) {
32

client = (Socket)iar.AsyncState; try { client.EndConnect(iar); conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString(); client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client); } catch (SocketException) { conStatus.Text = "Error connecting"; } } void ReceiveData(IAsyncResult iar) { Socket remote = (Socket)iar.AsyncState; int recv = remote.EndReceive(iar); string stringData = Encoding.ASCII.GetString(data, 0, recv); results.Items.Add(stringData); } void SendData(IAsyncResult iar) { Socket remote = (Socket)iar.AsyncState; int sent = remote.EndSend(iar); remote.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), remote); } public static void Main() { Application.Run(new AsyncTcpClient()); } } Chng trnh pha Server: using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Windows.Forms; class AsyncTcpSrvr :Form { private TextBox conStatus; private ListBox results; private byte[] data = new byte[1024]; private int size = 1024; private Socket server; public AsyncTcpSrvr() { Text = "Asynchronous TCP Server"; Size = new Size(400, 380);
33

results = new ListBox(); results.Parent = this; results.Location = new Point(10, 65); results.Size = new Size(350, 20 * Font.Height); Label label1 = new Label(); label1.Parent = this; label1.Text = "Text received from client:"; label1.AutoSize = true; label1.Location = new Point(10, 45); Label label2 = new Label(); label2.Parent = this; label2.Text = "Connection Status:"; label2.AutoSize = true; label2.Location = new Point(10, 330); conStatus = new TextBox(); conStatus.Parent = this; conStatus.Text = "Waiting for client..."; conStatus.Size = new Size(200, 2 * Font.Height); conStatus.Location = new Point(110, 325); Button stopServer = new Button(); stopServer.Parent = this; stopServer.Text = "Stop Server"; stopServer.Location = new Point(260,32); stopServer.Size = new Size(7 * Font.Height, 2 * Font.Height); stopServer.Click += new EventHandler(ButtonStopOnClick); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); server.Bind(iep); server.Listen(5); server.BeginAccept(new AsyncCallback(AcceptConn), server); } void ButtonStopOnClick(object obj, EventArgs ea) { Close(); } void AcceptConn(IAsyncResult iar) { Socket oldserver = (Socket)iar.AsyncState; Socket client = oldserver.EndAccept(iar); conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString(); string stringData = "Welcome to my server"; byte[] message1 = Encoding.ASCII.GetBytes(stringData); client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client); } void SendData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState;
34

int sent = client.EndSend(iar); client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client); } void ReceiveData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; int recv = client.EndReceive(iar); if (recv == 0) { client.Close(); conStatus.Text = "Waiting for client..."; server.BeginAccept(new AsyncCallback(AcceptConn), server); return; } string receivedData = Encoding.ASCII.GetString(data, 0, recv); results.Items.Add(receivedData); byte[] message2 = Encoding.ASCII.GetBytes(receivedData); client.BeginSend(message2, 0, message2.Length, SocketFlags.None, new AsyncCallback(SendData), client); } public static void Main() { Application.Run(new AsyncTcpSrvr()); } } 2.4.4. S d ng cc phng th c Non-blocking l p trnh b t ng b chng ta c th s d ng cc phng th c Non bloking nh phng th c Poll() v phng th c Select: + Phng th c Poll() bool Poll(int microseconds, SelectMode mode); SelectRead: Poll() tr v true n u m t trong nh ng i u ki n sau c tho : N u phng th c Accept() thnh cng N u c d li u trn Socket N u k t n i ng SelectWrite: Poll() tr v true n u tho m t trong nh ng i u ki n sau: Phng th c Connect() thnh cng N u c d li u trn Socket g i SelectError: Poll() tr v true n u m t trong nh ng i u ki n sau c tho : N u phng th c Connect() th t b i N u c d li u ngoi bng thng chu n g i n nhng thu c tnh OutOfBandInline khng c thi t l p l true. + Phng th c Select():
35

Socket.Select(IList checkRead, IList checkWrite, IList checkError, int microseconds) checkRead monitors the specified sockets for the ability to read data from the socket. checkWrite monitors the specified sockets for the ability to write data to the socket. checkError monitors the specified sockets for error conditions. V d ng d ng Server s d ng phng th c Poll() using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpPollSrvr { public static void Main() { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Waiting for a client..."); bool result; int i = 0; while (true) { i++; Console.WriteLine("polling for accept#{0}...", i); result = newsock.Poll(1000000, SelectMode.SelectRead); if (result) { break; } } Socket client = newsock.Accept(); IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Connected with {0} at port {1}", newclient.Address, newclient.Port); string welcome = "Welcome to my test server"; data = Encoding.ASCII.GetBytes(welcome); client.Send(data, data.Length, SocketFlags.None);
36

i = 0; while (true) { Console.WriteLine("polling for receive #{0}...", i); i++; result = client.Poll(3000000, SelectMode.SelectRead); if (result) { data = new byte[1024]; i = 0; recv = client.Receive(data); if (recv == 0) break; Console.WriteLine( Encoding.ASCII.GetString(data, 0, recv)); client.Send(data, recv, 0); } } Console.WriteLine("Disconnected from {0}", newclient.Address); client.Close(); newsock.Close(); } } Sau y chng ta s vi t m t chng trnh Server s d ng phng th c Select() ch p nh n 2 k t n i n t client v x l t ng k t n i. Chng trnh Select Server: using System; using System.Collections; using System.Net; using System.Net.Sockets; using System.Text; class SelectTcpSrvr { public static void Main() { ArrayList sockList = new ArrayList(2); ArrayList copyList = new ArrayList(2); Socket main = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); byte[] data = new byte[1024]; string stringData;
37

int recv; main.Bind(iep); main.Listen(2); Console.WriteLine("Waiting for 2 clients..."); Socket client1 = main.Accept(); IPEndPoint iep1 = (IPEndPoint)client1.RemoteEndPoint; client1.Send(Encoding.ASCII.GetBytes("Welcome to my server")); Console.WriteLine("Connected to {0}", iep1.ToString()); sockList.Add(client1); Console.WriteLine("Waiting for 1 more client..."); Socket client2 = main.Accept(); IPEndPoint iep2 = (IPEndPoint)client2.RemoteEndPoint; client2.Send(Encoding.ASCII.GetBytes("Welcome to my server")); Console.WriteLine("Connected to {0}", iep2.ToString()); sockList.Add(client2); main.Close(); while (true) { copyList = new ArrayList(sockList); Console.WriteLine("Monitoring {0} sockets...", copyList.Count); Socket.Select(copyList, null, null, 10000000); foreach (Socket client in copyList) { data = new byte[1024]; recv = client.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Received: {0}", stringData); if (recv == 0) { iep = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Client {0} disconnected.", iep.ToString()); client.Close(); sockList.Remove(client); if (sockList.Count == 0) { Console.WriteLine("Last client disconnected, bye"); return; } } else client.Send(data, recv, SocketFlags.None);
38

} } } } Chng trnh Client: using System; using System.Collections; using System.Net; using System.Net.Sockets; using System.Text; class SelectTcpClient { public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); byte[] data = new byte[1024]; string stringData; int recv; sock.Connect(iep); Console.WriteLine("Connected to server"); recv = sock.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Received: {0}", stringData); while (true) { stringData = Console.ReadLine(); if (stringData == "exit") break; data = Encoding.ASCII.GetBytes(stringData); sock.Send(data, data.Length, SocketFlags.None); data = new byte[1024]; recv = sock.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Received: {0}", stringData); } sock.Close(); } }
2.5. S d ng Thread trong cc ng d ng m ng 39

M t s khi ni m - a nhi m (Multitasking): L kh nng h iu hnh lm nhi u cng vi c t i m t th i i m - Ti n trnh (Process): Khi ch y m t ng d ng, h i u hnh s c p pht ring cho ng d ng b nh v cc ti nguyn khc. B nh v ti nguyn v t l ring bi t ny c g i l m t ti n trnh. Cc ti nguyn v b nh c a m t ti n trnh th ch ti n trnh c php truy c p. - Tuy n (Thread): Trong h th ng, m t ti n trnh c th c m t ho c nhi u chu i th c hi n tch bi t nhau v c th ch y ng th i. M i chu i th c hi n ny c g i l m t tuy n (Thread). Trong m t ng d ng, Thread kh i t o u tin g i l Thread s c p hay Thread chnh. 2.5.1. S d ng Thread trong chng trnh .Net s d ng Thread trong .Net ta s d ng NameSpace System.Threading - M t s phng th c th ng dng
Public Method M t Name Abort() Join() K t thc Thread Bu c chng trnh ph i ch cho thread k t thc (Block) th m i th c hi n ti p (cc cu l nh ng sau Join). Ti p t c ch y thread b t m ngng - suspended. Static method : T m d ng thread trong m t kho ng th i gian. B t u ch y (kh i ng) m t thread. Sau khi g i phng th c ny, tr ng thi c a thread chuy n t tr ng thi hi n hnh sang Running. T m ngng (ngh ) thread. (Phng th c ny b lo i kh i phin b n VS.NET 2005)

Resume() Sleep() Start()

Suspend()

- M t s thu c tnh th ng dng:


Public Property Name CurrentThread IsAlive IsBackground M t

This static property: Tr v thread hi n hnh ang ch y. Tr v gi tr cho bi t tr ng thi th c thi c a thread hi n hnh. Sets or gets gi tr cho bi t l thread l background hay foreground thread. Gets a value indicating whether a thread is part of a thread pool. Sets or gets gi tr ch nh u tin (dnh nhi u hay t CPU cho thread). Cao nh t l 4, th p nh t l 0. 40

IsThreadPoolThread Priority

Public Property Name ThreadState

M t

L y v tr ng thi c a thread (ang d ng, hay ang ch y)

- T o m t tuy n trong C# Thread newThread=newThread(new ThreadStart(newMethod)); . } void newMethod() { ... } 2.5.2. S d ng Thread trong cc chng trnh Server - a tuyn hay c ng d ng trong cc chng trnh Server, cc chng trnh i h i t i m t th i i m ch p nh n nhi u k t n i n t cc Client. - cc chng trnh Server c th x l nhi u Client t i m t th i i m ta c m hnh ng d ng a tuy n nh sau:

Sau y chng ta vi t l i chng trnh DateTimeServer c s d ng Thread nh sau:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2009); TcpListener server = new TcpListener(iep); server.Start(); while (true) {
41

//chap nhan ket noi TcpClient client= server.AcceptTcpClient(); //Tao ra tuyen moi de xu ly moi Client new ClientThread(client); } server.Stop(); } } class ClientThread { private Thread tuyen; private TcpClient client; public ClientThread(TcpClient client) { this.client = client; tuyen = new Thread(new ThreadStart(GuiNhanDL)); tuyen.Start(); } private void GuiNhanDL() { StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw= new StreamWriter(client.GetStream()); string kq=""; while(true) { string s=sr.ReadLine(); s=s.ToUpper(); if(s.Equals("QUIT")) break; if(s.Equals("GETDATE")) kq=DateTime.Now.ToString("dd/MM/yyyy"); else if(s.Equals("GETTIME")) kq=DateTime.Now.ToString("hh:mm:ss"); else kq="Khong hieu lenh"; sw.WriteLine(kq); sw.Flush(); } client.Close(); } } 2.5.3. S d ng Thread g i/nh n d li u ng d ng a tuy n trong vi c g i nh n d li u chng ta vi t chng trnh Chat theo giao th c TCP nh sau:

42

ng d ng m hnh x l s ki n c a Windows v a tuy n v Socket khng ng b ta ch c n vi t m t chng trnh sau d ch ra, ta ch y ng d ng nh n Listen n s l ng nghe trong vai tr Server cn khi ta ch y v nh n Connect n s ng vai tr Client v k t n i t i Server.

Vn b n chng trnh nh sau: using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;
43

using System.Windows.Forms; class TcpChat:Form { private static TextBox newText; private static ListBox results; private static Socket client; private static byte[] data = new byte[1024]; public TcpChat() { Text = "TCP Chat Program"; Size = new Size(400, 380); Label label1 = new Label(); label1.Parent = this; label1.Text = "Enter text string:"; label1.AutoSize = true; label1.Location = new Point(10, 30); newText = new TextBox(); newText.Parent = this; newText.Size = new Size(200, 2 * Font.Height); newText.Location = new Point(10, 55); results = new ListBox(); results.Parent = this; results.Location = new Point(10, 85); results.Size = new Size(360, 18 * Font.Height); Button sendit = new Button(); sendit.Parent = this; sendit.Text = "Send"; sendit.Location = new Point(220,52); sendit.Size = new Size(5 * Font.Height, 2 * Font.Height); sendit.Click += new EventHandler(ButtonSendOnClick); Button connect = new Button(); connect.Parent = this; connect.Text = "Connect"; connect.Location = new Point(295, 20); connect.Size = new Size(6 * Font.Height, 2 * Font.Height); connect.Click += new EventHandler(ButtonConnectOnClick); Button listen = new Button(); listen.Parent = this; listen.Text = "Listen"; listen.Location = new Point(295,52); listen.Size = new Size(6 * Font.Height, 2 * Font.Height); listen.Click += new EventHandler(ButtonListenOnClick); } void ButtonListenOnClick(object obj, EventArgs ea) { results.Items.Add("Listening for a client..."); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
44

IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); newsock.Bind(iep); newsock.Listen(5); newsock.BeginAccept(new AsyncCallback(AcceptConn), newsock); } void ButtonConnectOnClick(object obj, EventArgs ea) { results.Items.Add("Connecting..."); client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); client.BeginConnect(iep, new AsyncCallback(Connected), client); } void ButtonSendOnClick(object obj, EventArgs ea) { byte[] message = Encoding.ASCII.GetBytes(newText.Text); newText.Clear(); client.BeginSend(message, 0, message.Length, 0, new AsyncCallback(SendData), client); } void AcceptConn(IAsyncResult iar) { Socket oldserver = (Socket)iar.AsyncState; client = oldserver.EndAccept(iar); results.Items.Add("Connection from: " + client.RemoteEndPoint.ToString()); Thread receiver = new Thread(new ThreadStart(ReceiveData)); receiver.Start(); } void Connected(IAsyncResult iar) { try { client.EndConnect(iar); results.Items.Add("Connected to: " + client.RemoteEndPoint.ToString()); Thread receiver = new Thread(new ThreadStart(ReceiveData)); receiver.Start(); } catch (SocketException) { results.Items.Add("Error connecting"); } } void SendData(IAsyncResult iar) { Socket remote = (Socket)iar.AsyncState; int sent = remote.EndSend(iar); } void ReceiveData() { int recv;
45

string stringData; while (true) { recv = client.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, recv); if (stringData == "bye") break; results.Items.Add(stringData); } stringData = "bye"; byte[] message = Encoding.ASCII.GetBytes(stringData); client.Send(message); client.Close(); results.Items.Add("Connection stopped"); return; } public static void Main() { Application.Run(new TcpChat()); } } 2.5.4. S d ng ThreadPool trong cc chng trnh .Net
Method BindHandle() Description Binds an operating system handle to the thread pool Gets the number of worker threads available for use in the thread pool Gets the maximum number of worker threads available in the thread pool Queues a user delegate to the thread pool Registers a delegate waiting for a WaitHandle object Queues an unsafe user delegate to the thread pool but does not propagate the calling stack onto the worker thread Registers an unsafe delegate waiting for a WaitHandle object

GetAvailableThreads()

GetMaxThreads()

QueueUserWorkItem()

RegisterWaitForSingleObject()

UnsafeQueueUserWorkItem()

UnsafeRegisterWaitForSingleObject()
using System; using System.Threading; class ThreadPoolSample {

46

public static void Main() { ThreadPoolSample tps = new ThreadPoolSample(); } public ThreadPoolSample() { int i; ThreadPool.QueueUserWorkItem(new WaitCallback(Counter)); ThreadPool.QueueUserWorkItem(new WaitCallback(Counter2)); for(i = 0; i < 10; i++) { Console.WriteLine("main: {0}", i); Thread.Sleep(1000); } } void Counter(object state) { int i; for (i = 0; i < 10; i++) { Console.WriteLine(" thread: {0}", i); Thread.Sleep(2000); } } void Counter2(object state) { int i; for (i = 0; i < 10; i++) { Console.WriteLine(" thread2: {0}", i); Thread.Sleep(3000); } } }

2.5.5. S d ng ThreadPool trong cc chng trnh Server


using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; class ThreadPoolTcpSrvr { private TcpListener client; public ThreadPoolTcpSrvr() { client = new TcpListener(9050); client.Start(); Console.WriteLine("Waiting for clients..."); while(true) { while (!client.Pending()) { Thread.Sleep(1000); } ConnectionThread newconnection = new ConnectionThread(); newconnection.threadListener = this.client; ThreadPool.QueueUserWorkItem(new WaitCallback(newconnection.HandleConnection)); } } public static void Main() { ThreadPoolTcpSrvr tpts = new ThreadPoolTcpSrvr();

47

} } class ConnectionThread { public TcpListener threadListener; private static int connections = 0; public void HandleConnection(object state) { int recv; byte[] data = new byte[1024]; TcpClient client = threadListener.AcceptTcpClient(); NetworkStream ns = client.GetStream(); connections++; Console.WriteLine("New client accepted: {0} active connections", connections); string welcome = "Welcome to my test server"; data = Encoding.ASCII.GetBytes(welcome); ns.Write(data, 0, data.Length); while(true) { data = new byte[1024]; recv = ns.Read(data, 0, data.Length); if (recv == 0) break; ns.Write(data, 0, recv); } ns.Close(); client.Close(); connections; Console.WriteLine("Client disconnected: {0} active connections", connections); } }

2.6. K thu t IP Multicasting

2.6.1. Broadcasting l g? Broadcast, ti ng Vi t g i l qu ng b. Trong h th ng m ng h u tuy n, qu ng b l thu t ng dng ch vi c g i m t gi thng tin n t t cc nt m ng trong m ng. th c hi n hnh th c qu ng b, a ch n c a gi tin s l a ch qu ng b. C hai lo i l: Local Broadcast v Global Broadcast 2.6.2. S d ng Broadcasting g i d li u n nhi u my trong m ng c c b
G i gi d li u Broadcast

using System; using System.Net; using System.Net.Sockets; using System.Text; class BadBroadcast { public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050); byte[] data = Encoding.ASCII.GetBytes("This is a test message"); sock.SendTo(data, iep); sock.Close(); }
48

}
Chng ta ph i thi t l p nh sau:

class Broadcst { public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050); IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050); string hostname = Dns.GetHostName(); byte[] data = Encoding.ASCII.GetBytes(hostname); sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); sock.SendTo(data, iep1); sock.SendTo(data, iep2); sock.Close(); } }
Nh n gi d li u Broadcast

class RecvBroadcst { public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); sock.Bind(iep); EndPoint ep = (EndPoint)iep; Console.WriteLine("Ready to receive"); byte[] data = new byte[1024]; int recv = sock.ReceiveFrom(data, ref ep); string stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); data = new byte[1024]; recv = sock.ReceiveFrom(data, ref ep); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("received: {0} from: {1}",stringData, ep.ToString()); sock.Close(); } } 2.6.3. Multicasting l g? M t a ch multicast cho php thi t b g i d li u t i m t t p xc nh tr c cc host, c bi t n nh cc nhm multicast, trong cc m ng con khc nhau.
M t s a ch Multicast a ch multicast Ch c nng 224.0.0.0 224.0.0.1 224.0.0.2 a ch c s T t c cc h th ng trn m ng con ny T t c cc Router trn m ng con ny

49

224.0.0.5 224.0.1.9 224.0.1.24

Cc DR trong OSPF Nhm a ch RIPv2 Nhm a ch WINS server

C 2 k thu t Multicast c s d ng + Peer to Peer

+ Central Server

2.6.4. Socket Multicasting trong .Net S d ng phng th c SetSocketOption()


50

Socket option c th c s d ng Thm m t Socket vo nhm Multicast Lo i m t Socket kh i nhm Multicast SetSocketOption(SocketOptionLevel,SocketOptionName, optionValue) SocketOptionName AddMembership DropMembership S d ng phng th c SetSocketOption() Socket option c th c s d ng optionValue l m t i t ng c a l p MulticastOption MulticastOption(IPAddress) MulticastOption(IPAddress,IPAddress) V d thm m t Socket vo nhm Multicast 224.100.0.1 sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.100.0.1"));
G i d li u Multicast class MultiSend{ public static void Main() { Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050); byte[] data = Encoding.ASCII.GetBytes("This is a test message"); server.SendTo(data, iep); server.Close(); } } Nh n d li u Multicast

class MultiRecv{ public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Console.WriteLine("Ready to receive"); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); EndPoint ep = (EndPoint)iep; sock.Bind(iep); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.100.0.1"))); byte[] data = new byte[1024]; int recv = sock.ReceiveFrom(data, ref ep); string stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); sock.Close(); } }
51

G i d li u Multicast v i TTL class NewMultiSend{ public static void Main() { Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9051); IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050); server.Bind(iep); byte[] data = Encoding.ASCII.GetBytes("This is a test message"); server.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.100.0.1"))); server.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 50); server.SendTo(data, iep2); server.Close(); } } Multicast v i l p UdpClient JoinMulticastGroup() DropMulticastGroup() JoinMulticastGroup() l phng th c overload JoinMulticastGroup(IPAddress) JoinMulticastGroup(IPAddress, int) class UdpClientMultiSend{ public static void Main() { UdpClient sock = new UdpClient(); IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050); byte[] data = Encoding.ASCII.GetBytes("This is a test message"); sock.Send(data, data.Length, iep); sock.Close(); } } class UdpClientMultiRecv { public static void Main() { UdpClient sock = new UdpClient(9050); Console.WriteLine("Ready to receive"); sock.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); byte[] data = sock.Receive(ref iep); string stringData = Encoding.ASCII.GetString(data, 0, data.Length); Console.WriteLine("received: {0} from: {1}", stringData, iep.ToString()); sock.Close(); } }
52

2.7 Bi t p p d ng

class MulticastChat : Form{ TextBox newText; ListBox results; Socket sock; Thread receiver; IPEndPoint multiep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050); public MulticastChat() { Text = "Multicast Chat Program"; Size = new Size(400, 380); Label label1 = new Label(); label1.Parent = this; label1.Text = "Enter text string:"; label1.AutoSize = true; label1.Location = new Point(10, 30); newText = new TextBox(); newText.Parent = this; newText.Size = new Size(200, 2 * Font.Height); newText.Location = new Point(10, 55); results = new ListBox(); results.Parent = this; results.Location = new Point(10, 85); results.Size = new Size(360, 18 * Font.Height); Button sendit = new Button(); sendit.Parent = this; sendit.Text = "Send"; sendit.Location = new Point(220, 52); sendit.Size = new Size(5 * Font.Height, 2 * Font.Height); sendit.Click += new EventHandler(ButtonSendOnClick); Button closeit = new Button(); closeit.Parent = this; closeit.Text = "Close"; closeit.Location = new Point(290, 52); closeit.Size = new Size(5 * Font.Height, 2 * Font.Height); closeit.Click += new EventHandler(ButtonCloseOnClick); sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); sock.Bind(iep); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
53

new MulticastOption(IPAddress.Parse("224.100.0.1"))); receiver = new Thread(new ThreadStart(packetReceive)); receiver.IsBackground = true; receiver.Start(); } void ButtonSendOnClick(object obj, EventArgs ea) { byte[] message = Encoding.ASCII.GetBytes(newText.Text); newText.Clear(); sock.SendTo(message, SocketFlags.None, multiep); } void ButtonCloseOnClick(object obj, EventArgs ea) { receiver.Abort(); sock.Close(); Close(); } void packetReceive() { EndPoint ep = (EndPoint)multiep; byte[] data = new byte[1024]; string stringData; int recv; while (true) { recv = sock.ReceiveFrom(data, ref ep); stringData = Encoding.ASCII.GetString(data, 0, recv); results.Items.Add("from " + ep.ToString() + ": " + stringData); } } public static void Main() { Application.Run(new MulticastChat()); } }

54

CHNG 3: XY D NG
3.1. Giao th c ICMP

NG D NG M NG

Gi i thi u giao th c ICMP (Internetwork Control Message Protocol) - Giao th c ICMP ho t ng trn layer 2 - Internetwork trong m hnh TCP/IP ho c layer 3 - Network trong m hnh OSI Cho php ki m tra v xc nh l i c a Layer 3 Internetwork trong m hnh TCP/IP b ng cch nh ngha ra cc lo i thng i p c th s d ng xc nh xem m ng hi n t i c th truy n c gi tin hay khng. Trong th c t , ICMP c n cc thnh ph n c a m i gi tin IP c th ho t ng c. C u trc c a gi tin IP v ICMP

+ Type: c th l m t query hay m t l i + Code: Xc nh y l lo i query hay thng i p l i + Checksum: Ki m tra v s a l i cho d li u ICMP + Message: Tu thu c vo Type v Code

3.1.1. S d ng Raw Socket


Gi tin ICMP khng s d ng TCP ho c UDP nn chng ta khng th s d ng cc l p c h tr nh TcpClient hay UdpClient m ph i s d ng m t Raw Socket Mu n t o Raw Socket khi t o ra Socket b n s d ng SocketType.Raw, giao th c ICMP T o Raw Socket nh sau Socket sock = ProtocolType.Icmp); Raw Socket Format Value Ggp Icmp Description Gateway-to-Gateway Protocol Internet Control Message Protocol 55 new Socket(AddressFamily.InterNetwork, SocketType.Raw,

Idp Igmp IP Ipx ND Pup Raw Spx SpxII Unknown Unspecified

IDP Protocol Internet Group Management Protocol A raw IP packet Novell IPX Protocol Net Disk Protocol Xerox PARC Universal Protocol (PUP) A raw IP packet Novell SPX Protocol Novell SPX Version 2 Protocol An unknown protocol An unspecified protocol

G i gi d li u Raw ICMP l giao th c khng h ng k t n i S d ng phng th c SendTo() c a l p Socket g i C ng trong giao th c ICMP khng quan tr ng IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 0); sock.SendTo(packet, iep); Nh n gi d li u Raw S d ng phng th c ReceiveForm c a l p Socket D li u nh n v l m t gi tin IP chng ta ph i tch ra l y gi tin ICMP Raw Socket khng t ng nh d ng gi tin ICMP cho chng ta. Chng ta ph i t lm Data Variable Type Code Checksum Message Size 1 byte 1 byte 2 bytes multibyte Type Byte Byte Unsigned 16-bit integer Byte array

nh ngha l p v phng th c kh i t o m c nh class ICMP { public byte Type; public byte Code; public UInt16 Checksum; public int Messagesize; public byte[] Message = new byte[1024]; public ICMP() { } } T o ra gi tin ICMP ICMP packet = new ICMP(); 56

packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; public ICMP(byte[] data, int size) { Type = data[20]; Code = data[21]; Checksum = BitConverter.ToUInt16(data, 22); MessageSize = size - 24; Buffer.BlockCopy(data, 24, Message, 0, MessageSize); } public byte[] getBytes() { byte[] data = new byte[MessageSize + 9]; Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1); Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1); Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2); Buffer.BlockCopy(Message, 0, data, 4, MessageSize); return data; } public UInt16 getChecksum() { UInt32 chcksm = 0; byte[] data = getBytes(); int packetsize = MessageSize + 8; int index = 0; while (index < packetsize) { chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index)); index += 2; } chcksm = (chcksm >> 16) + (chcksm & 0xffff); chcksm += (chcksm >> 16); return (UInt16)(~chcksm); }

3.1.2. S d ng giao th c ICMP v Raw Socket xy d ng chng trnh Ping

57

class Program { static void Main(string[] args) { byte[] data = new byte[1024]; int recv; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(argv[0]), 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("test packet"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length); packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getChecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); } catch (SocketException) { Console.WriteLine("No response from remote host"); return; } ICMP response = new ICMP(data, recv); Console.WriteLine("response from: {0}", ep.ToString()); Console.WriteLine(" Type {0}", response.Type); Console.WriteLine(" Code: {0}", response.Code); int Identifier = BitConverter.ToInt16(response.Message, 0); 58

int Sequence = BitConverter.ToInt16(response.Message, 2); Console.WriteLine(" Identifier: {0}", Identifier); Console.WriteLine(" Sequence: {0}", Sequence); string stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4); Console.WriteLine(" data: {0}", stringData); host.Close(); } }

3.1.3. S d ng giao th c ICMP v Raw Socket xy d ng chng trnh TraceRoute


class TraceRoute { public static void Main(string[] argv) { byte[] data = new byte[1024]; int recv, timestart, timestop; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPHostEntry iphe = Dns.Resolve(argv[0]); IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("test packet"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length); packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getCchecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); int badcount = 0; for (int i = 1; i < 50; i++) { host.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, i); timestart = Environment.TickCount; host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); timestop = Environment.TickCount; ICMP response = new ICMP(data, recv); if (response.Type == 11) Console.WriteLine("hop {0}: response from {1}, {2}ms", i, ep.ToString(), timestop - timestart); if (response.Type == 0) { Console.WriteLine("{0} reached in {1} hops, {2}ms.", ep.ToString(), i, timestop - timestart); break; 59

} badcount = 0; } catch (SocketException) { Console.WriteLine("hop {0}: No response from remote host", i); badcount++; if (badcount == 5) { Console.WriteLine("Unable to contact remote host"); break; } } } host.Close(); } } 3.2. Giao th c SMTP, POP3

3.2.1. C b n v h th ng Mail v giao th c SMTP, POP3

60

* Giao th c SMTP M t s l nh c b n c a giao th c SMTP:


L nh HELO M t Hello. S d ng xc nh ng i g i i n. L nh ny ny i km v i tn c a host g i i n. Trong ESTMP (extended protocol), th l nh ny s l EHLO. Kh i t o m t giao d ch g i th. N k t h p "from" xc nh ng i g i th. Xc nh ng i nh n th. Thng bo b t u n i dung th c s c a b c i n (ph n thn c a th). D li u c m thnh d ng m 128-bit ASCII v n c k t thc v i m t dng n ch a d u ch m (.). Hu b giao d ch th S d ng xc th c ng i nh n th. N l l nh "no operation" xc nh khng th c hi n hnh ng g Thot kh i ti n trnh k t thc Cho host nh n bi t r ng th cn ph i g i n u cu i khc.

MAIL RCPT DATA

RSET VRFY NOOP QUIT SEND

M t s l nh khng yu c u ph i c c xc nh b ng RFC 821


SOML Send or mail. Bo v i host nh n th r ng th ph i g i n u cu i khc ho c h p th. SAML Send and mail. Ni v i host nh n r ng b c i n ph i g i t i ng i dng u cu i v h p th. EXPN S d ng m r ng cho m t mailing list. HELP Yu c u thng tin gip t u nh n th. TURN Yu c u host nh n gi vai tr l host g i th.

- M tr ng thi c a SMTP Khi m t MTA g i m t l nh SMTP t i MTA nh n th MTA nh n s tr l i v i m t m tr ng thi cho ng i g i bi t ang c vi c g x y ra u nh n. V d i y l b ng m tr ng thi c a SMTP theo tiu chu n RFC 821. M c c a tr ng thi c
61

xc nh b i s u tin c a m (5xx l l i n ng, 4xx l l i t m th i, 1xx3xx l ho t ng bnh th ng). - M t s m tr ng thi c a SMTP 211 Tnh tr ng h th ng, hay reply gip h th ng 214 Thng i p gip . 220 <domain> d ch v s n sng 221 <domain> d ch v ng knh giao chuy n 250 Hnh ng mail yu c u OK, hon thnh 251 User khng c c b ; s h ng n <forward-path> 354 Kh i ng vi c nh p mail; k t thc v i <CLRF>. <CLRF> 421 <domain> d ch v khng s d ng c, ng knh giao chuy n 450 Khng l y hnh ng mail yu c u; mailbox khng hi u l c 451 Khng nh n hnh ng c yu c u; lu tr c a h th ng khng . 500 L i c php; khng ch p nh n l nh 501 L i c php trong tham s hay i s 502 L nh khng c cung c p 503 Dng l nh sai 504 Tham s c a dng l nh khng c cung c p 550 Khng nh n hnh ng c yu c u ; mailbox khng hi u l c [nh mailbox khng tm th y hay khng truy c p c] 551 User khng c c b ; vui lng th <forward-path> 552 B qua hnh ng m mail yu c u, v t qu ch nh lu tr 554 Khng nh n hnh ng c yu c u; tn mailbox khng c ch p nh n. [nh sai c php mailbox] giao chuy n sai. - nh d ng c a m t b c th thng th ng khng c ph n nh km nh sau:

* Giao th c POP3 Giao th c dng l y th, POP3 Server l ng nghe trn c ng 110, m t trong RFC 1939
62

- M t s l nh c a POP3 USER Xc nh username PASS Xc nh password STAT Yu c u v tr ng thi c a h p th nh s l ng th v l n c a th LIST Hi n danh sch c a th RETR Nh n th DELE Xo m t b c th xc nh NOOP Khng lm g c RSET Khi ph c l i nh th xo (rollback) QUIT Th c hi n vi c thay i v thot ra 3.2.2. Ci t SMTP, POP3 Client/Server Vi t chng trnh g i Mail n gi n theo giao th c SMTP using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; class Program { static void Main(string[] args) { string nguoigui, nguoinhan, tieude,body; string diachimaychu; int portmaychu; Console.Write("Nhap di chu SMTP Server:"); diachimaychu = Console.ReadLine(); Console.Write("Nhap cong cua may chu:"); portmaychu = int.Parse(Console.ReadLine()); Console.Write("Nhap dia chi nguoi gui:"); nguoigui = Console.ReadLine(); Console.Write("Nhap dia chi nguoi nhan:"); nguoinhan = Console.ReadLine(); Console.Write("Nhap tieu de buc thu:"); tieude = Console.ReadLine(); Console.Write("Nhap noi dung buc thu:"); body= Console.ReadLine(); //Tao Endpoit cua may chu IPEndPoint iep = new IPEndPoint(IPAddress.Parse(diachimaychu), portmaychu); TcpClient client = new TcpClient(); client.Connect(iep); string Data = "Helo"; StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine());
63

//Gui dia chi nguyoi gui Data = "MAIL FROM: <" + nguoigui + ">"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Gui dia chi nguyoi gui Data = "RCPT TO: <" + nguoinhan + ">"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Bat dau gui noi dung buc thu Data = "Data"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Gui noi dung buc thu Data = "SUBJECT:" + tieude + "\r\n" + body + "\r\n" + "." + "\r\n"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Ngat ket noi Data = "QUIT"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); sr.Close(); sw.Close(); client.Close(); Console.ReadLine(); } }

64

Vi t chng trnh l y th n gi n theo giao th c POP3

using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.IO; using System.Net; using System.Net.Sockets; namespace MyPop3 { public partial class Form1 : Form { TcpClient popclient; StreamReader sr; StreamWriter sw; public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false;
65

} private void btLogin_Click(object sender, EventArgs e) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse(txtPOP.Text), int.Parse(txtPort.Text)); popclient = new TcpClient(); popclient.Connect(iep); sr = new StreamReader(popclient.GetStream()); sw = new StreamWriter(popclient.GetStream()); sr.ReadLine(); string data = ""; data = "User " + txtUser.Text; sw.WriteLine(data); sw.Flush(); sr.ReadLine(); data = "PASS " + txtPass.Text; sw.WriteLine(data); sw.Flush(); sr.ReadLine(); data = "LIST"; sw.WriteLine(data); sw.Flush(); lstHeader.Items.Clear(); string s = sr.ReadLine(); char[] ch = { ' ' }; string[] tam = s.Split(ch); //MessageBox.Show("so buc thu la:" + tam[1]); while ((s = sr.ReadLine()) != ".") { lstHeader.Items.Add(s); } } private void lstHeader_SelectedIndexChanged(object sender, EventArgs e) { int i = lstHeader.SelectedIndex + 1; //Lay buc thu ve va tien hanh phan tich string data = "RETR " + i.ToString(); sw.WriteLine(data); sw.Flush(); string s; //MessageBox.Show(sr.ReadLine()); //Lay phan header while ((s = sr.ReadLine().Trim()) != null) { //MessageBox.Show(s); if (s.Length == 0) break; if (s.ToUpper().StartsWith("DATE")) { DateTime dt=DateTime.Parse(s.Substring(5, s.Length - 5)); txtDate.Text = dt.ToShortDateString() +" " +dt.ToLongTimeString(); } if (s.ToUpper().StartsWith("FROM"))
66

txtFrom.Text = s.Substring(5, s.Length - 5); if (s.ToUpper().StartsWith("TO")) txtTo.Text = s.Substring(3, s.Length - 3); if (s.ToUpper().StartsWith("SUBJECT")) txtSubject.Text = s.Substring(8, s.Length - 8); } //Lay phan body textBox4.Clear(); //MessageBox.Show("Lay body"); while (!sr.EndOfStream) { s = sr.ReadLine().Trim(); if (s.Equals(".")) break; textBox4.Text += s + "\r\n"; } //MessageBox.Show("Het noi dung buc thu"); } } }
3.3. Giao th c HTTP

3.3.1. C b n v giao th c HTTP HTTP (Hypertext Transfer Protocol) giao th c truy n siu vn b n. HTTP l giao th c t ng ng d ng cho Web. N ho t ng theo m hnh client/server. - Client: browser yu c u, nh n, hi n th cc i t ng Web. - Server: Web server g i cc i t ng

Hai phin b n c a giao th c HTTP hi n c ph bi n l HTTP1.0 c c t trong RFC 1945 v HTTP1.1 c c t trong RFC 2068. HTTP l giao th c khng tr ng thi server khng lu l i cc yu c u c a client. HTTP s d ng giao th c TCP c a t ng giao v n. Cc b c ti n hnh t khi client k t n i t i server sau g i v nh n k t qu t server g i v nh sau:
67

+ client kh i t o k t n i TCP (t o socket) v i server, qua c ng 80 + server ch p nh n k t n i TCP t client + Cc thng i p HTTP (thng i p t ng ng d ng) c trao i gi a browser (HTTP client) v Web server (HTTP server) + ng k t n i TCP. Chng ta xem m t v d v qu trnh trao i gi a browser v Web server nh sau:

User nh p URL
www.someSchool.edu/someDepartment/home.index

(bao g m text, tham chi u t i 10 nh d ng jpeg)

1a. HTTP client kh i t o k t n i


TCP t i HTTP server (ti n trnh)t i a ch www.someSchool.edu. C ng m c nh l 80.

1b. HTTP server i ch


www.someSchool.edu i k t n i TCP c ng 80, ch p nh n k t n i, thng bo l i cho client.

2. HTTP client g i thng i p yu


c u HTTP (bao g m URL) vo trong TCP connection socket

3. HTTP server nh n thng i p yu


c u,l y cc i t ng c yu c u g i vo trong thng i p tr l i, (someDepartment/home.index) g i thng i p vo socket

4. HTTP server ng k t n i TCP. 5. HTTP client nh n thng i p tr l i bao g m t p html, hi n th html.Phn tch t p html file, tm 10 jpeg i t ng c tham chi u

time

6. Cc b c t 1 n 5 c l p
l i cho t ng i t ng trong 10 i t ng jpeg C hai ki u thng i p HTTP l yu c u (Request) v tr l i (Response). Cc thng i p c nh d ng ki u m ASCII. nh d ng thng i p yu c u HTTP

68

Dng yu c u (l nh GET, POST, HEAD) Nh ng dng header

GET /somedir/page.html HTTP/1.0 User-agent: Mozilla/4.0 Accept: text/html, image/gif,image/jpeg Accept-language:fr (CR,LF)

CR,LF,k hi u k t thc thng i p

nh d ng thng i p tr l i HTTP

Dng tr ng thi (m tr ng thi)

Nh ng dng header

HTTP/1.0 200 OK Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun 1998 ... Content-Length: 6821 Content-Type: text/html data data data data data ...

d li u,e.g., t p html c yu c u

69

Qu trnh trao i gi a Browser v Web Server c th c minh h a nh hnh sau:

M tr ng thi trong thng i p HTTP Response: c ghi i p response t server v client. M t s m th ng g p: 200 OK Yu c u thnh cng,cc i t ng c yu c u

dng u tin trong thng

ph n sau thng i p.

301 Moved Permanently i t ng c yu c u c chuy n v a ch m i c a i t ng c t trong tr ng Location: 400 Bad Request Server khng hi u c thng i p yu c u 404 Not Found Ti li u c yu c u khng c trong server 505 HTTP Version Not Supported Server khng h tr version c a giao th c HTTP. - ki m tra cc l nh c a HTTP bn pha Client chng ta c th th c hi n nh sau: + Telnet t i Web server
70

telnet www.eurecom.fr 80

T o k t n i TCP c ng 80 (c ng m c nh cho HTTP server) at www.eurecom.fr.


G i thng i p yu c u l y t p Index.html trong th m c ~ross v client

+ L nh GET trong thng i p HTTP


GET /~ross/index.html HTTP/1.0

+ Xem thng i p response c g i v t Server - G cc l nh khc ki m tra. 3.3.2. Ci t HTTP Client/Server a. Chng trnh HTTP Client using System; using System.IO; using System.Net.Sockets; using System.Windows.Forms; namespace HttpView { public partial class MainForm : Form { [STAThread] public static void Main(string[] args){ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } public MainForm(){ // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // // TODO: Add constructor code after the InitializeComponent() call. // } // G i yu c u v nh n v ph n h i t web server void BtGoClick(object sender, EventArgs e){ //Thm ti n t http:// n u khng c if (txtAddress.Text.StartsWith("http://", StringComparison.OrdinalIgnoreCase) == false) txtAddress.Text = "http://" + txtAddress.Text; TcpClient client = new TcpClient(); try{ client.Connect(GetHost(txtAddress.Text), GetPort(txtAddress.Text)); } catch{
71

rtfBody.Text = "Khng th k t n i n server"; return; } StreamWriter OutStream = new StreamWriter(client.GetStream()); StreamReader InpStream = new StreamReader(client.GetStream()); // G i i yu c u b ng phng th c GET OutStream.WriteLine("GET " + txtAddress.Text + " HTTP/1.0"); OutStream.WriteLine("Content-Type:text/html"); OutStream.WriteLine("Content-Language:en"); OutStream.WriteLine(); OutStream.Flush(); //L y ph n Header rtfHeader.Text = ""; string s; while (null != (s = InpStream.ReadLine())){ if (s.Equals("")) break; rtfHeader.Text += s; } //L y ph n Body rtfBody.Text = ""; int c; while (true){ c = InpStream.Read(); if (c == -1) break; rtfBody.Text += (char)c; } client.Close(); } // Khi g Enter th g i i yu c u void TxtAddressKeyPress(object sender, KeyPressEventArgs e){ if ((int)e.KeyChar == 13) btGo.PerformClick(); } // L y v tn my trong URL internal string GetHost(string url){ url = url.ToLower(); Uri tmp = new Uri(url); return tmp.Host; } // L y v s hi u c ng trong URL internal int GetPort(string url){ Uri tmp = new Uri(url); return tmp.Port; } } } b. Chng trnh HTTP Server using System; using System.IO;
72

using System.Net; using System.Net.Sockets; public class SimpleWebServer { public void StartListening(int port) { IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 8080); TcpListener server = new TcpListener(LocalEndPoint); server.Start(); while (true) { TcpClient client = server.AcceptTcpClient(); // Cho doi ket noi processClientRequest(client); } } //X l yu c u c a m i my khch private void processClientRequest(TcpClient client) { Console.WriteLine("May khach su dung cong: " + (client.Client.RemoteEndPoint as IPEndPoint).Port + "; Dia chi IP may khach: " + client.Client.RemoteEndPoint.ToString() + "\n"); Console.WriteLine("Yeu cau: "); readRequest(client); sendResponse(client); client.Close(); } // c ph n header c a gi d li u g i t my khch private void readRequest(TcpClient client) { StreamReader request = new StreamReader(client.GetStream()); String nextLine; while (null != (nextLine = request.ReadLine())) { if (nextLine.Equals("")) { break; } else { Console.WriteLine(nextLine); } } Console.WriteLine("---------------------------------------"); } //Ph n h i yu c u cho my khch private void sendResponse(TcpClient client) { StreamWriter response = new StreamWriter(client.GetStream()); response.Write(_mainPage); response.Flush(); } //M i ph n h i v trnh duy t private const String _mainPage = "HTTP/1.0 200 OK\n" +
73

"Content-type: text/html\n" + "Connection: close\n" + "\n<HTML>\n" + "<HEAD>\n" + "<TITLE>Hello World</TITLE>\n" + "</HEAD>\n" + "<BODY> <a href = \"localhost\"> Hello World </a></BODY>\n" + "</HTML> \n\n"; } class TestWebServer { public static void Main(String[] args) { SimpleWebServer webServer1 = new SimpleWebServer(); webServer1.StartListening(8080); } }
3.4. Giao th c FTP

3.4.1. C b n v giao th c FTP Giao th c FTP l m t giao th c trao i file kh ph bi n Khi ni m v ho t ng c b n c a FTP: Nh ng ng i pht tri n giao th c FTP c n ph i cn b ng nhu c u gi a vi c pht tri n m t b giao th c v a c nhi u ch c nng v v a n gi n trong tri n khai. Do , FTP khng n gi n nh a em trai c a n l giao th c TFTP. Ho t ng c a giao th c ny c th chia ra thnh nhi u thnh ph n nh , ho t ng cng nhau th c hi n cc cng vi c nh kh i t o k t n i, truy n thng tin i u khi n v truy n l nh. N i dung m bi vi t ny h ng t i l a t i ng i c nh ng khi ni m quan tr ng nh t ng sau giao th c FTP, cng nh gi i thch t ng quan v nguyn l ho t ng c a n. 1 - M hnh ho t ng c a FTP, cc thnh ph n trong giao th c, v cc thu t ng c b n Giao th c FTP c m t m t cch n gi n thng qua m hnh ho t ng c a FTP. M hnh ny ch ra cc nguyn t c m m t thi t b ph i tun theo khi tham gia vo qu trnh trao i file, cng nh v hai knh thng tin c n ph i thi t l p gi a cc thi t b . N cng m t cc thnh ph n c a FTP c dng qu n l cc knh ny c hai pha truy n v nh n. Do , m hnh ny t o cho ta m t kh i i m l t ng xem xt ho t ng c a FTP m c khi qut.

Ti n trnh Server-FTP v User-FTP

74

FTP l m t giao th c d ng client/server truy n th ng, tuy nhin thu t ng client thng th ng c thay th b ng thu t ng user ng i dng do th c t l ng i s d ng m i l i t ng tr c ti p thao tc cc l nh FTP trn my clients. B ph n m m FTP c ci t trn m t thi t b c g i l m t ti n trnh. Ph n m m FTP c ci t trn my Server c g i l ti n trnh Server-FTP, v ph n trn my client c g i l ti n trnh User-FTP. Knh i u khi n v knh d li u trong FTP M t khi ni m c t y u m ta c n ph i n m v FTP l: m c d giao th c ny s d ng k t n i TCP, nhng n khng ch dng m t knh TCP nh ph n l n cc giao th c truy n thng khc. M hnh FTP chia qu trnh truy n thng gi a b ph n Server v i b ph n client ra lm hai knh logic: - Knh i u khi n: y l knh logic TCP c dng kh i t o m t phin k t n i FTP. N c duy tr xuyn su t phin k t n i FTP v c s d ng ch truy n cc thng tin i u khi n, nh cc l nh v cc h i p trong FTP. N khng c dng truy n file - Knh d li u: M i khi d li u c truy n t server t i client, m t knh k t n i TCP nh t nh l i c kh i t o gi a chng. D li u c truy n i qua knh k t n i ny do n c g i l knh d li u. Khi file c truy n xong, knh ny c ng t. Vi c s d ng cc knh ring l nh v y t o ra s linh ho t trong vi c truy n truy n d li u m ta s th y trong cc ph n ti p theo. Tuy nhin, n cng t o cho FTP ph c t p nh t nh. Cc ti n trnh v thu t ng trong FTP Do cc ch c nng i u khi n v d li u s d ng cc knh khc nhau, nn m hnh ho t ng c a FTP cng chia ph n m m trn m i thi t b ra lm hai thnh ph n logic tng ng v i m i knh. Thnh ph n Protocol Interpreter (PI) l thnh ph n qu n l knh i u khi n, v i ch c nng pht v nh n l nh. Thnh ph n Data Transfer Process (DTP) c ch c nng g i v nh n d li u gi a pha client v i server. Ngoi ra, cung c p cho ti n trnh bn pha ng i dng cn c thm thnh ph n th ba l giao di n ng i dng FTP - thnh ph n ny khng c pha server. Do , c hai ti n trnh x y ra pha server, v ba ti n trnh pha client. Cc ti n

trnh ny c g n v i m hnh FTP m t chi ti t ho t ng c a giao th c FTP. D i y l hnh i chi u cc ti n trnh vo trong m hnh FTP:
75

Cc ti n trnh pha server: Cc ti n trnh pha server bao g m hai giao th c: - Server Protocol Interpreter (Server-PI): ch u trch nhi m qu n l knh i u khi n trn server. N l ng nghe yu c u k t n i h ng t i t users trn c ng dnh ring. Khi k t n i c thi t l p, n s nh n l nh t pha User-PI, tr l i l i, v qu n l ti n trnh truy n d li u trn server. - Server DataTransfer Process (Server-DTP): lm nhi m v g i ho c nh n file t b ph n User-DTP. Server-DTP v a lm nhi m thi t l p k t n i knh d li u v l ng nghe m t k t n i knh d li u t user. N tng tc v i server file trn h th ng c c b c v chp file. Cc ti n trnh pha client: - User Protocol Interpreter (User-PI): ch u trch nhi m qu n l knh i u khi n pha client. N kh i t o phin k t n i FTP b ng vi c pht ra yu c u t i pha Server-PI. Khi k t n i c thi t l p, n x l cc l nh nh n c trn giao di n ng i dng, g i chng t i Server-PI, v nh n ph n h i tr l i. N cng qu n l ti n trnh User-DTP. - User Data Transfer Process (User-DTP): l b ph n DTP n m pha ng i dng, lm nhi m v g i ho c nh n d li u t Server-DTP. User-DTP c th thi t l p ho c
76

l ng nghe yu c u k t n i knh d li u trn server. N tng tc v i thi t b lu tr file pha client. - User Interface: cung c p giao di n x l cho ng i dng. N cho php s d ng cc l nh n gi n h ng ng i dng, v cho php ng i i u khi n phin FTP theo di c cc thng tin v k t qu x y ra trong ti n trnh. 2 - Thi t l p knh i u khi n v ch ng th c ng i dng trong FTP: M hnh ho t ng c a FTP m t r cc knh d li u v i u khi n c thi t l p gi a FTP client v FTP server. Tr c khi k t n i c s d ng th c s truy n file, knh i u khi n c n ph i c thi t l p. M t ti n trnh ch nh sau c dng t o k t n i v t o ra phin FTP lu b n gi a cc thi t b truy n files. Nh trong cc giao th c client/server khc, FTP server tun theo m t lu t passive trong knh i u khi n. B ph n Server Protocol Interpreter (Server-PI) s l ng nghe c ng TCP dnh ring cho k t n i FTP l c ng 21. Pha User-PI s t o k t n i b ng vi c m m t k t n i TCP t thi t b ng i dng t i server trn c ng . N s d ng m t c ng b t k lm c ng ngu n trong phin k t n i TCP.

Khi TCP c ci t xong, knh i u khi n gi a cc thi t b s c thi t l p, cho php cc l nh c truy n t User-PI t i Server-PI, v Server-PI s p tr k t qu l cc m thng bo. B c u tin sau khi knh i vo ho t ng l b c ng nh p c a ng i dng (login sequence). B c ny c hai m c ch: - Access Control - i u khi n truy c p: qu trnh ch ng th c cho php h n ch truy c p t i server v i nh ng ng i dng nh t nh. N cng cho php server i u khi n lo i truy c p nh th no i v i t ng ng i dng. - Resource Selection - Ch n ngu n cung c p: B ng vi c nh n d ng ng i dng t o k t n i, FTP server c th a ra quy t nh s cung c p nh ng ngu n no cho ng i dng c nh n d ng . Trnh t truy c p v ch ng th c FTP Quy lu t ch ng th c trong FTP kh n gi n, ch l cung c p username/password. Trnh t c a vi c ch ng th c nh sau: 1 - ng i dng g i m t username t User-PI t i Server-PI b ng l nh USER. Sau password c a ng i dng c g i i b ng l nh PASS. 2 - Server ki m tra tn ng i dng v password trong database ng i dng c a n. N u ng i dng h p l , server s g i tr m t thng bo t i ng i dng r ng phin k t
77

n i .c m . N u ng i dng khng h p l , server yu c u ng i dng th c hi n l i vi c ch ng th c. Sau m t s l n ch ng th c sai nh t nh, server s ng t k t n i. Gi s qu trnh ch ng th c thnh cng, server sau s thi t l p k t n i cho php t ng lo i truy c p i v i ng i dng c c p quy n. M t s ng i dng ch c th truy c p vo m t s file nh t nh, ho c vo m t s lo i file nh t nh. M t s server c th c p quy n cho m t s ng i dng c v vi t ln server, trong khi ch cho php c i v i nh ng ng i dng khc. Ng i qu n tr m ng c th nh m p ng ng cc nhu c u truy c p FTP.

M t khi k t n i c thi t l p, server c th th c hi n cc l a ch n ti nguyn d a vo nh n di n ng i dng. V d : trn m t h th ng nhi u ng i dng, ng i qu n tr c th thi t l p FTP khi c b t c ng i dng no k t n i t i, anh ta s t ng c a t i "home directory" c a chnh anh ta. L nh ty ch n ACCT (account) cng cho php ng i dng ch n m t ti kho n c nhn no n u nh anh ta c nhi u hn m t ti kho n. M r ng v b o m t FTP Gi ng nh ph n l n cc giao th c c, phng php ng nh p n gi n c a FTP l m t s k th a t nh ng giao th c th i k u c a Internet. Ngy nay, n khng cn b o m tnh an ton c n thi t trn mi tr ng Internet ton c u v username v password c g i qua knh k t n i i u khi n d i d ng clear text. i u ny lm cho cc thng tin ng nh p c th b nghe ln. Chu n RFC 2228 v cc ph n m r ng cho b o m t FTP nh ra thm nhi u ty ch n ch ng th c v m ha ph c t p cho nh ng ai mu n tng thm m c an ton vo trong ph n m m FTP c a h . 3 - Qu n l knh d li u FTP, k t n i knh d li u d ng ch ng (m c nh) v b ng cng v i vi c s d ng c ng Knh i u khi n c t o ra gi a Server-PI v User-PI s d ng qu trnh thi t l p k t n i v ch ng th c c duy tr trong su t phin k t n i FTP. Cc l nh v cc h i p c trao i gi a b ph n PI (Protocol Interpreter) qua knh i u khi n, nhng d li u th khng. M i khi c n ph i truy n d li u gi a server v client, m t knh d li u c n ph i c t o ra. Knh d li u k t n i b ph n User-DTP v i Server-DTP. K t n i ny c n thi t
78

cho c ho t ng chuy n file tr c ti p (g i ho c nh n m t file) cng nh i v i vi c truy n d li u ng m, nh l yu c u m t danh sch file trong th m c no trn server. Chu n FTP ch nh hai phng th c khc nhau t o ra knh d li u. Khc bi t chnh c a hai phng th c l m t thi t b : pha client hay pha server l pha a ra yu c u kh i t o k t n i. i u ny nghe qua c v kh n gi n, nhng k th c n l i kh quan tr ng. K t n i knh d li u d ng ch ng Phng th c u tin i khi cn c g i l k t n i knh d li u d ng thng th ng (v n l phng php m c nh) v i khi c g i l k t n i d ng ch ng ( i chi u v i d ng k t n i b ng m ta s xt ph n sau). Trong d ng k t n i ny, pha Server-DTP kh i t o k nh d li u b ng vi c m m t c ng TCP cho pha User-DTP. Pha server s d ng c ng c dnh ring, l c ng 20 cho knh d li u. Trn my client, m t gi tr c ng c ch n theo m c nh chnh l c ng c s d ng i v i knh i u khi n, tuy nhin pha client s lun ch n hai c ng ring bi t cho hai knh ny. Gi s pha User-PI thi t l p m t k t n i i u khi n t c ng b t k c a n l 1678 t i c ng i u khi n trn server l c ng 21. Khi , t o m t knh d li u cho vi c truy n d li u, pha Server-PI s bo cho pha Server-DTP kh i t o m t knh k t n i TCP t c ng 20 t i c ng 1678 c a pha client. Sau khi pha client ch p nh n knh c kh i t o, d li u s c truy n i. Th c t , vi c s d ng cng m t c ng cho c knh d li u v knh i u khi n khng ph i l m t hay, n lm cho ho t ng c a FTP tr nn ph c t p. Do , pha client nn ch nh s d ng m t c ng khc b ng vi c s d ng l nh PORT tr c khi truy n d li u. V d : gi s pha client ch nh c ng 1742 v i l nh PORT. Pha Server-DTP sau s t o ra m t k t n i t c ng 20 c a n t i c ng 1742 pha client thay v c ng 1678 nh m c nh. Qu trnh ny c m t trong hnh d i y.

79

Thng th ng, i v i knh d li u FTP, pha server s kh i t o vi c truy n d li u b ng cch m k t n i d li u t i client. Trong tr ng h p trn, pha client tr c tin s a ra l nh PORT yu c u server s d ng c ng 1742. Sau , server s m k t n i knh d li u t c ng 20 m c nh c a n t i c ng 1742 pha client. D li u sau s c truy n gi a cc thi t b qua cc c ng ny. K t n i knh d li u d ng b ng Phng php k ti p c g i l k t n i d li u d ng b ng. Pha client s nh n server l pha b ng, lm nhi m v ch p nh n m t yu c u k t n i knh d li u c kh i t o t pha client. Server tr l i l i pha client v i a ch IP cng nh a ch c ng m n s s d ng. Pha Server-DTP sau s l ng nghe m t k t n i TCP t pha User-DTP trn c ng ny. M c nh, pha client s d ng cng m t c ng i v i c hai knh i u khi n v d li u nh trong tr ng h p k t n i ch ng trn. Tuy nhin, y, m t l n n a pha client c th ch n s d ng m t gi tr c ng khc cho knh d li u. Ta s xt l i v d trn m t l n n a, v i c ng i u khi n pha client l 1678 t i c ng 21 pha server.
80

Nhng l n ny truy n d li u theo phng th c k t n i b ng, nh m t trong hnh d i y:

Pha client s s d ng l nh PASV yu c u server r ng n mu n dng phng th c i u khi n d li u b ng. Pha Server-PI s tr l i l i pha client v i m t gi tr c ng m client s s d ng, t c ng 2223 trn n. Sau pha Server PI s h ng cho pha Server-DTP l ng nghe trn c ng 2223. Pha User-PI cng s h ng cho pha UserDTP t o m t phin k t n i t c ng 1742 pha client t i c ng 2223 pha server. Sau khi Server ch p nh n k t n i ny, d li u b t u c truy n i.

Cc v n v tnh hi u qu v tnh b o m t trong vi c ch n m t phng th c k t n i V n pha no l pha kh i t o k t n i knh d li u a ra m t cu h i: s khc nhau gi a hai phng th c l g? i u ny cng gi ng nh vi c h i ai th c hi n m t cu c i n tho i n i b . Cu tr l i l s b o m t. Vi c FTP s d ng nhi u hn m t k t n i TCP c th gi i quy t cc v n v ph n m m cng nh v ph n c ng m ng i dng c n ph i c m b o s an ton cho h th ng c a h .

Khi xem xt vi c g s x y ra trong tr ng h p knh d li u ch ng nh trong v d pha trn:


81

i v i pha client, c m t knh k t n i i u khi n c thi t l p t c ng 1678 client t i c ng 21 server. Nhng knh d li u l i c kh i t o t pha server. Do , client s nh n c m t yu c u k t n i t i c ng 1678 (ho c c ng no khc). M t s client s nghi ng v vi c nh n c nh ng k t n i t i nh v y, v trong tnh hu ng thng th ng, client m i l pha kh i t o k t n i ch khng ph i p tr k t n i. Do cc knh k t n i TCP h ng t i c th mang theo nh ng m i e d a nh t nh, m t s client c th s ngn ch n cc lu ng k t n i h ng t i b ng vi c s d ng t ng l a.

T i sao ng i ta l i khng lm cho pha client lun ch p nh n k t n i t m t ch s port c dng trong knh i u khi n? V n y l v client th ng dng cc c ng khc nhau cho m i phin k t n i b ng vi c s d ng cu l nh PORT. V t i sao i u ny l i c th c hi n? V theo lu t TCP: sau khi m t k t n i c ng l i , c m t kho ng th i gian tr ng tr c khi c ng c th c s d ng l i i u ny ngn ng a tnh tr ng cc phin k t n i lin ti p b l n v i nhau. i u ny s t o ra tr khi g i nhi u file do pha client th ng dng cc gi tr c ng khc nhau cho m i k t n i. i u ny r t hi u qu nhng cng d n t i vi c firewall c a client s h i c ch p nh n phin k t n i t i v i nhi u gi tr c ng khng n nh hay khng.

Vi c dng k t n i ki u knh gin ti p s gi m thi u v n ny m t cch hi u qu . Ph n l n cc t ng l a c nhi u v n lin quan t i k t n i h ng v v i cc gi tr c ng b t k, hn l g p v n v i cc k t n i h ng i. Ta c th xem chi ti t hn v v n ny trong chu n RFC 1579. Chu n ny khuy n ngh r ng pha client nn s d ng k t n i ki u b ng lm d ng m c nh thay v s d ng ki u k t n i d ng ch ng cng v i l nh PORT, ngn ch n tnh tr ng block theo c ng. T t nhin, phng th c k t n i ki u b ng khng hon ton gi i quy t c v n , chng ch y v n v pha server m thi. Pha server, gi y ph i i m t v i vi c c nhi u knh k t n i h ng v trn hng lo t cc c ng khc nhau. Tuy nhin vi c x l cc v n b o m t trn m t nhm nh server v n d hn nhi u so v i vi c ph i i m t v i m t l ng l n cc v n t nhi u client. FTP server ph i c c u hnh ch p nh n phng th c truy n b ng t client, do cch thng th ng thi t l p trn server l thi t l p ch p nh n m t s c ng k t n i h ng v trn server trong khi v n kha cc yu c u k t n i h ng v trn cc c ng khc. 4 - Cc phng th c truy n d li u trong FTP Khi knh d li u c thi t l p xong gi a Server-DTP v i User-DTP, d li u s c truy n tr c ti p t pha client t i pha server, ho c ng c l i, d a theo cc l nh
82

c s d ng. Do thng tin i u khi n c g i i trn knh i u khi n, nn ton b knh d li u c th c s d ng truy n d li u. (T t nhin, hai knh logic ny c k t h p v i nhau l p d i cng v i t t c cc k t n i TCP/UDP khc gi a hai thi t b , do i u ny khng h n c i thi n t c truy n d li u so v i khi truy n trn ch m t knh n ch lm cho hai vi c truy n d li u v i u khi n tr nn c l p v i nhau m thi) FTP c ba phng th c truy n d li u, nu ln cch m d li u c truy n t m t thi t b t i thi t b khc trn m t knh d li u c kh i t o, l: stream mode, block mode, v compressed mode Stream mode Trong phng th c ny, d li u c truy n i d i d ng cc byte khng c u trc lin ti p. Thi t b g i ch n thu n y lu ng d li u qua k t n i TCP t i pha nh n. Khng c m t tr ng tiu nh t nh c s d ng trong phng th c ny lm cho n kh khc so v i nhi u giao th c g i d li u r i r c khc. Phng th c ny ch y u d a vo tnh tin c y trong truy n d li u c a TCP. Do n khng c c u trc d ng header, nn vi c bo hi u k t thc file s n gi n c th c hi n vi c pha thi t b g i ng t knh k t n i d li u khi truy n xong. Trong s ba phng thc, stream mode l phng th c c s d ng nhi u nh t trong tri n khai FTP th c t . C m t s l do gi i thch i u . Tr c h t, n l phng th c m c nh v n gi n nh t, do vi c tri n khai n l d dng nh t. Th hai, n l phng php ph bi n nh t, v n x l v i cc file u n thu n nh l x l dng byte, m khng t i n i dung c a cc file. Th ba, n l phng th c hi u qu nh t v n khng t n m t l ng byte overload thng bo header. Block mode y l phng th c truy n d li u mang tnh quy chu n hn, v i vi c d li u c chia thnh nhi u kh i nh v c ng gi thnh cc FTP blocks. M i block ny c m t tr ng header 3 byte bo hi u di, v ch a thng tin v cc kh i d li u ang c g i. M t thu t ton c bi t c s d ng ki m tra cc d li u c truy n i v pht hi n, kh i t o l i i v i m t phin truy n d li u b ng t.

Compressed mode y l m t phng th c truy n s d ng m t k thu t nn kh n gi n, l run-length encoding c tc d ng pht hi n v x l cc o n l p trong d li u c truy n i
83

gi m chi u di c a ton b thng i p. Thng tin khi c nn, s c x l nh trong block mode, v i tr ng header. Trong th c t , vi c n n d li u th ng c s d ng nh ng ch khc, lm cho phng th c truy n ki u compressed mode tr nn khng c n thi t n a. V d : n u b n ang truy n i m t file qua internet v i modem tng t , modem c a b n thng th ng s th c hi n vi c nn l p 1; cc file l n trn FTP server cng th ng c nn s n v i m t s nh d ng nh ZIP, lm cho vi c nn ti p t c khi truy n d li u tr nn khng c n thi t. 3.4.2. Ci t FTP Client/Server
Trn c s giao th c FTP chng ta th c hi n ci t FTP Client/Server minh h a cho giao th c Chng trnh Simple FTP Server:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { string rootDir = "C:/MyFTP"; IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2121); TcpListener server = new TcpListener(iep); server.Start(); TcpClient client = server.AcceptTcpClient(); StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); sw.WriteLine("220 Chao mung ket noi toi MyFTP"); sw.Flush(); while (true) { string request = sr.ReadLine(); string command=""; if(request.Length!=0) command = request.Substring(0, 4); switch (command.ToUpper().Trim()) { case "USER": { sw.WriteLine("331. Nhap pass vao"); sw.Flush(); //sw.Close(); Console.WriteLine(request); break; } case "PASS": { sw.WriteLine("230. Dang nhap thanh cong"); sw.Flush(); Console.WriteLine(request); break; }
84

case "MKD": { string folderName = request.Substring(4, request.Length - 4); folderName = rootDir + "/" + folderName.Trim(); try { Directory.CreateDirectory(folderName); sw.WriteLine("150 Tao thu muc thanh cong"); sw.Flush(); }catch(IOException){ sw.WriteLine("550 Tao thu muc co loi"); sw.Flush(); } break; } case "RETR": { string fileName = request.Substring(4, request.Length - 4); fileName = rootDir + "/" + fileName.Trim(); try { if (File.Exists(fileName)) { //Gui noi dung file ve cho client xu ly sw.WriteLine("150 Truyen File thanh cong"); sw.Flush(); FileStream fs = new FileStream(fileName, FileMode.Open); long totalLenght = fs.Length; byte[] data = new byte[totalLenght]; fs.Read(data, 0, data.Length); sw.Write(totalLenght); char[] kt = Encoding.ASCII.GetChars(data); sw.Write(kt,0,data.Length); sw.Flush(); fs.Close(); } else { sw.WriteLine("550 File khong ton tai tren server"); sw.Flush(); } } catch (IOException) { sw.WriteLine("550 Khong truyen duoc file"); sw.Flush(); } break; } case "STOR": { string fileName = request.Substring(request.LastIndexOf("/"),request.Length-request.LastIndexOf("/")); fileName = rootDir + "/" + fileName.Trim(); try { FileStream fs = new FileStream(fileName, FileMode.CreateNew); long totalLength=sr.Read(); byte[] data = new byte[totalLength]; char[] kt = Encoding.ASCII.GetChars(data);
85

int sobyte = sr.Read(kt, 0, data.Length); fs.Write(data, 0, sobyte); fs.Close(); sw.WriteLine("150 Up file thanh cong"); sw.Flush(); } catch (IOException) { sw.WriteLine("550 Khong truyen duoc file"); sw.Flush(); } break; } case "QUIT": { client.Close(); break; } default: { sw.WriteLine("Sai lenh"); sw.Flush(); break; } } } } } Chng trnh Simple FTP Client: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; namespace FtpClient { class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2121); TcpClient client = new TcpClient(); client.Connect(iep); StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); Console.WriteLine(sr.ReadLine()); string input; string command = ""; Console.WriteLine("Dang nhap bang USER Ten user, PASS Ten password"); Console.WriteLine("Tao thu muc bang MKD ten thu muc can tao"); Console.WriteLine("Upload bang cach STOR tenfile"); Console.WriteLine("Download bang cach RETR tenfile"); while (true) { input = Console.ReadLine();
86

command = input.Substring(0, 4).Trim().ToUpper(); switch (command) { case "STOR": { //Doc file gui cho server sw.WriteLine(input); sw.Flush(); FileInfo fl=null; try { fl = new FileInfo(input.Substring(4, input.Length - 4).Trim()); } catch (IOException) { Console.WriteLine("File khong ton tai"); } long totalLength = fl.Length; FileStream fs = fl.OpenRead(); sw.Write(totalLength); byte[] data = new byte[totalLength]; int bytes = fs.Read(data, 0, data.Length); char[] kt = Encoding.ASCII.GetChars(data); sw.Write(kt, 0, data.Length); sw.Flush(); fs.Close(); Console.WriteLine(sr.ReadLine()); break; } case "RETR": { sw.WriteLine(input); sw.Flush(); string s = sr.ReadLine(); Console.WriteLine(s); if (s.Substring(0, 3).Equals("150")) { Console.Write("Nhap vao noi luu tep:"); string filename = Console.ReadLine(); FileStream fs = new FileStream(filename, FileMode.CreateNew); //Doc tep ve; long totalLength = sr.Read(); byte[] data = new byte[totalLength]; char[] kt= new char[data.Length] ; int sobyte = sr.Read(kt, 0, data.Length); data=Encoding.ASCII.GetBytes(kt); fs.Write(data, 0, data.Length); fs.Close(); } break; } default: { sw.WriteLine(input); sw.Flush(); Console.WriteLine(sr.ReadLine()); break;
87

} } if (input.ToUpper().Equals("QUIT")) break; } sr.Close(); sw.Close(); client.Close(); } } }


3.5. DNS (Domain Name Server)

3.5.1. V n phn gi i tn mi n Domain Name System: L h c s d li u phn tn ho t ng c th b c b i cc name servers L giao th c t ng ng d ng : host, routers yu c u t i name servers xc nh tn mi n (nh x a ch <->tn mi n) Note : l m t ch c nng c a Internet, ho t ng nh l giao th c t ng ng d ng R t ph c t p. Q: nh x gi a a ch IP v tn? T i sao khng t p trung s ki m sot c a DNS ? i m h ng duy nh t - n u name-server ch t th c m ng Internet s ch t theo. T n ng truy n. C s d li u t p trung s xa v i a s vng B o tr ph c t p. Ph i chia tr ! Khng c server no c th lu ton b c tn mi n v a ch IP tng ng local name servers: M i ISP,cng ty c local (default) name server Cu h i truy v n c a host v DNS s c chuy n t i local name server Ch c nng c a name server: i v i host: lu a ch IP v tn mi n tng ng c a host C th tm tn mi n ng v i a ch IP v ng c l i c yu c u b i cc local name server khng th xc nh c tn. root name server: c yu c u n u c authoritative name server khng xc nh. Nh n v x l mapping Tr v mapping cho local name server

88

a NSI Herndon, VA c PSInet Herndon, VA d U Maryland College Park, MD g DISA Vienna, VA h ARL Aberdeen, MD
j NSI (TBD) Herndon, VA

k RIPE London i NORDUnet Stockholm m WIDE Tokyo

e NASA Mt View, CA f Internet Software C. Palo Alto,


CA

b USC-ISI Marina del Rey, CA l ICANN Marina del Rey, CA

root name server

host surf.eurecom.fr mu n bi t a ch IP c a gaia.cs.umass.edu 1. Yu c u t i local DNS server, dns.eurecom.fr 2. dns.eurecom.fr yu c u t i root name server n u c n thi t 3. root name server yu c u authoritative name server, dns.umass.edu, n u c n thi t.

2 5 3

local name server


dns.eurecom.fr

authorititive name server dns.umass.edu

requesting host
surf.eurecom.fr

gaia.cs.umass.edu

89

Root name server:


C th khng bi t authoritative name server C th bi t name server trung gian ,nh c th yu c u tm authoritative name server

2 7 3

local name server


dns.eurecom.fr

intermediate name server dns.umass.edu

requesting host
surf.eurecom.fr

authoritative name server dns.cs.umass.edu

gaia.cs.umass.edu

DNS example

- Truy v n trong DNS c chia thnh cc lo i nh sau:

Truy v n quy query: Name server l ni phn gi i a ch /tn.N u n khng phn gi i trong n i b ,n s g i yu c u n name server khc. Cng vi c c a name server li u c qu n ng? Truy v n tng tc: N u khng phn gi i c a ch IP/name,name server s g i tr thng i p r ng Ti khng bi t,hy th h i anh b n c nh ti l A.A l a ch IP c a name server k ti p n.
- C u trc b n ghi DNS nh sau:

2 3 4 7

iterated query

local name server intermediate name server


dns.eurecom.fr dns.umass.edu

authoritative name server dns.cs.umass.edu

requesting host
surf.eurecom.fr gaia.cs.umass.edu

90

DNS: c s d li u phn tn lu cc b n ghi ngu n (RR)


nh d ng c a RR : (name, value, type, ttl) Type=A name : hostname value : IP address Type=NS name : domain (e.g. foo.com) value : a ch IP authoritative name server cho tn mi n Type=CNAME name : tn b danh cho m t tn th c no : e.g www.ibm.com l tn b danh c a servereast.backup2.ibm.com value : l tn th c Type=MX value : tn c a mailserver

3.5.2. Tri n khai DNS MX (Mail Exchange) Chng ta i vi t chng trnh cho php l y v thng tin c a mail server using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btFind_Click(object sender, EventArgs e) { byte[] DNSQuery; byte[] DNSReply; UdpClient dnsClient = new UdpClient(tbServer.Text, 53); DNSQuery = makeQuery(DateTime.Now.Millisecond * 60, tbDomain.Text); dnsClient.Send(DNSQuery, DNSQuery.GetLength(0)); IPEndPoint endpoint = null; DNSReply = dnsClient.Receive(ref endpoint); this.tbStatus.Text = makeResponse(DNSReply, tbDomain.Text); } public byte[] makeQuery(int id, string name) { byte[] data = new byte[512]; byte[] Query; data[0] = (byte)(id >> 8); data[1] = (byte)(id & 0xFF); data[2] = (byte)1; data[3] = (byte)0; data[4] = (byte)0; data[5] = (byte)1;
91

data[6] = (byte)0; data[7] = (byte)0; data[8] = (byte)0; data[9] = (byte)0; data[10] = (byte)0; data[11] = (byte)0; string[] tokens = name.Split(new char[] { '.' }); string label; int position = 12; for (int j = 0; j < tokens.Length; j++) { label = tokens[j]; data[position++] = (byte)(label.Length & 0xFF); byte[] b = System.Text.Encoding.ASCII.GetBytes(label); for (int k = 0; k < b.Length; k++) { data[position++] = b[k]; } } data[position++] = (byte)0; data[position++] = (byte)0; data[position++] = (byte)15; data[position++] = (byte)0; data[position++] = (byte)1; Query = new byte[position + 1]; for (int i = 0; i <= position; i++) { Query[i] = data[i]; } return Query; } public string makeResponse(byte[] data, string name) { int qCount = ((data[4] & 0xFF) << 8) | (data[5] & 0xFF); int aCount = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF); int position = 12; for (int i = 0; i < qCount; ++i) { name = ""; position = proc(position, data, ref name); position += 4; } string Response = ""; for (int i = 0; i < aCount; ++i) { name = ""; position = proc(position, data, ref name); position += 12; name = ""; position = proc(position, data, ref name); Response += name + "\r\n"; } return Response; } private int proc(int position, byte[] data, ref string name) { int len = (data[position++] & 0xFF); if (len == 0) { return position; } int offset;
92

do { if ((len & 0xC0) == 0xC0) { if (position >= data.GetLength(0)) { return -1; } offset = ((len & 0x3F) << 8) | (data[position++] & 0xFF); proc(offset, data, ref name); return position; } else { if ((position + len) > data.GetLength(0)) { return -1; } name += Encoding.ASCII.GetString(data, position, len); position += len; } if (position > data.GetLength(0)) { return -1; } len = data[position++] & 0xFF; if (len != 0) { name += "."; } } while (len != 0); return position; } }
3.6 Th o lu n v cc ng d ng khc th ng g p 3.7 Bi t p p d ng

93

CHNG 4: XY D NG

NG D NG NHI U L P

4.1. M hnh 2 l p (two tier), 3 l p (three tier) v n l p.

Tr c y, i v i cc ph n m m c s d ng lin quan n d li u, th ng khi lm ng i l p trnh th ng tch h p vi c giao ti p v i ng i s d ng , x l r i ghi xu ng d li u trn cng m t form (y l m hnh m t l p). Nhng trong ki n trc 3 l p (m hnh 3 l p), ph i c vi c phn bi t r ch ri gi a cc l p ny. M hnh 3 l p c th c m t nh sau:

- L p th nh t : L p giao di n (giao ti p v i ng i s d ng) : ch thu n x l vi c giao ti p v i ng i s d ng, nh p xu t, m khng th c hi n vi c tnh ton, ki m tra, x l, hay cc thao tc lin quan n c s d li u. - L p th hai : L p x l : L p ny chuyn th c hi n cc x l , ki m tra cc rng bu c, cc qui t c ng x c a ph n m m , cc ch c nng c t y u, Vi c th c hi n ny c l p v i cch thi t k cng nh ci t giao di n. Thng tin cho l p ny th c hi n cc x l c a mnh c l y t l p giao di n. - L p th ba : L p d li u : L p ny chuyn th c hi n cc cng vi c lin quan n d li u. D li u c th l y t c s d li u (Access, SQL Server ) ho c t p tin (text, binary, XML ). i v i c s d li u, l p ny th c hi n k t n i tr c ti p v i c s d li u v th c hi n t t c cc thao tc lin quan n c s d li u m ph n m m c n thi t. i v i t p tin, l p ny th c hi n vi c c, ghi t p tin theo yu c u c a ph n m m. Vi c th c hi n ny do l p x l g i.

94

R rng, v i m hnh ny, cc cng vi c c a t ng l p l c l p v i nhau. Vi c thay i m t l p khng lm thay i cc l p cn l i, thu n ti n hn cho qu trnh pht tri n v b o tr ph n m m. M t s lu : Phn bi t vai tr Business Layer v khi ni m x l M i Layer v n c x l ring, c trng c a Layer i khi vi c quy t nh 1 x l n m layer no ch mang tnh ch t tng i Chng ta cng c n phn bi t khi ni m 3 tier v 3 layer: 3 tier l m hnh 3 l p v t l cn 3 layer l m hnh logic.
Presentation
Local Browser

GUI

Web

Physical view

Logical view

Web

Application

Web

Business logic Data Access

Business tier

Data tier

Data

V d minh h a: Xy d ng chng trnh tnh t ng 2 phn s theo ki n trc 3 l p. Theo d li u c a phn s c c ln t t p tin XML, k t qu sau khi c tnh s c ghi xu ng t p tin XML. Cch lm thng th ng l m i vi c u c y vo trong 1 form v x l tr c ti p trong form . Tuy nhin, khi c s thay i x y ra v giao di n, x l, hay d li u th vi c ch nh s a kh kh khn. Do v y, vi c xy d ng theo ki n trc 3 l p s kh c ph c nh c i m ny. Ki n trc c a chng trnh nh sau:

95

Xy d ng l p th hi n phn s (TH_PHANSO) S d ng User Control ci t cho TH_PHANSO. Thm User Control vo project b ng cch ch n Project > Add User Control. t tn User Control . Ta c TH_PHANSO.cs

96

Do th hi n t s v th hi n m u s u l TextBox do trong l p TH_PHANSO c n thi t l p cc properties l tuso v mauso c ki u int. public int tuso{ set{ this.txtTuSo.Text = value.ToString(); } get{ return int.Parse(this.txtTuSo.Text); } } public int mauso { set { this.txtMauSo.Text = value.ToString(); } get { return int.Parse(this.txtMauSo.Text); } } L p lu tr phn s (LT_PHANSO) T p tin XML lu tr c nh d ng nh sau: <?xml version ="1.0" encoding = "utf-8"?> <PHANSO> <Tu_so>5</Tu_so> <Mau_so>3</Mau_so> </PHANSO> th c hi n vi c c v ghi d li u XML ta s d ng DOM. Khai bo tuso v mauso th c hi n vi c lu tr public int tuso; public int mauso; Th c hi n ci t hm kh i t o m c nh v i tham s truy n vo l ng d n file XML public LT_PHANSO(string strFilename) { // // TODO: Add constructor logic here // XmlDocument doc = LT_XML.DocTaiLieu(strFilename); if(doc == null) { tuso = 0;
97

mauso = 0; return; } XmlElement ele = doc.DocumentElement; tuso = int.Parse(ele.SelectSingleNode("Tu_so").InnerText); mauso = int.Parse(ele.SelectSingleNode("Mau_so").InnerText); } Th c hi n ci t hm ghi phn s v i tham s truy n vo l ng d n file XML public void GhiPhanSo(string strFilename) { XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement("PHANSO"); doc.AppendChild(root); XmlElement ele_Tuso = root.OwnerDocument.CreateElement("Tu_so"); ele_Tuso.InnerText = this.tuso.ToString(); root.AppendChild(ele_Tuso); XmlElement ele_Mauso = root.OwnerDocument.CreateElement("Mau_so"); ele_Mauso.InnerText = this.mauso.ToString(); root.AppendChild(ele_Mauso); LT_XML.GhiTaiLieu(strFilename,doc); } L p lu tr XML (LT_XML) Vi c load v save XmlDocument c tch ra thnh m t l p ring l l p LT_XML public static XmlDocument DocTaiLieu(string strFilename) { XmlDocument kq = new XmlDocument(); try { kq.Load(strFilename); } catch{ return null; } return kq; } public static void GhiTaiLieu(string strFilename, XmlDocument doc) { try{ doc.Save(strFilename); } catch{ } } L p x l phn s (XL_PHANSO)
98

L p ny s th c hi n ci t cc hm lin quan n x l v tnh ton trn phn s nh nh ngha php c ng 2 phn s , rt g n phn s hay c p nh t gi tr t i t ng th hi n. Khai bo 2 i t ng l n l t thu c v l p LT_PHANSO v TH_PHANSO gip t o lin k t v i t ng x l v i 2 t ng cn l i l t ng d li u v t ng giao di n. private LT_PHANSO lt_ps = null; private TH_PHANSO th_ps = null; Ci t hm kh i t o m c nh t o lin k t v i i t ng th hi n v i t ng x l public XL_PHANSO(LT_PHANSO lt_ps, TH_PHANSO th_ps) { this.lt_ps = lt_ps; this.th_ps = th_ps; this.th_ps.tuso = this.lt_ps.tuso; this.th_ps.mauso = this.lt_ps.mauso; } Ci t phng th c ghi public void Ghi(string strFilename) { this.lt_ps.tuso = this.th_ps.tuso; this.lt_ps.mauso = this.th_ps.mauso; this.lt_ps.GhiPhanSo(strFilename); } Ci t ton t + public static XL_PHANSO operator +(XL_PHANSO ps1,XL_PHANSO ps2) { XL_PHANSO kq = new XL_PHANSO(new LT_PHANSO(), new TH_PHANSO()); kq.th_ps.tuso = ps1.th_ps.tuso * ps2.th_ps.mauso + ps2.th_ps.tuso * ps1.th_ps.mauso; kq.th_ps.mauso = ps1.th_ps.mauso * ps2.th_ps.mauso; return kq; } Ci t hm c p nh t t i t ng x l phn s khc public void CapNhat(XL_PHANSO ps) { this.th_ps.tuso = ps.th_ps.tuso; this.th_ps.mauso = ps.th_ps.mauso; } Ci t hm rt g n phn s public void RutGon() { int tuso = this.th_ps.tuso; int mauso = this.th_ps.mauso; int maxUC = TimMaxUocChung(tuso,mauso); tuso = tuso/maxUC; mauso = mauso/maxUC;
99

this.th_ps.tuso = tuso; this.th_ps.mauso = mauso; } rt g n ta c n tnh c chung l n nh t, c th ci t hm ny chung v i l p XL_PHANSO public int TimMaxUocChung(int a, int b) { while(a!=b) { if(a>b) a -= b; else b -= a; } return a; } Th c hi n ci t mn hnh chnh (MainFrm)

Trong form chnh s th c hi n khai bo 3 i t ng x l phn s private PhanSo.XL_PHANSO xl_PhanSo1; private PhanSo.XL_PHANSO xl_PhanSo2; private PhanSo.XL_PHANSO xl_PhanSo3; Th c hi n kh i t o 3 i t ng x l phn s v a khai bo public MainFrm() { // // Required for Windows Form Designer support InitializeComponent(); xl_PhanSo1 = new XL_PHANSO(new LT_PHANSO("phanso1.xml"), tH_PHANSO1);
100

xl_PhanSo2 = new XL_PHANSO(new LT_PHANSO("phanso2.xml"), tH_PHANSO2); xl_PhanSo3 = new XL_PHANSO(new LT_PHANSO(""),tH_PHANSO3); } Vi t hm x l cho cc nt ch c nng trn form: Hm x l cho nt C ng private void btnCong_Click(object sender, System.EventArgs e) { XL_PHANSO kq = xl_PhanSo1 + xl_PhanSo2; xl_PhanSo3.CapNhat(kq); xl_PhanSo3.Ghi(ketqua.xml); xl_PhanSo3.RutGon(); } Hm x l cho nt Thoat private void btnThoat_Click(object sender, System.EventArgs e) { this.Close(); } T o cc t p tin phanso1.xml, phanso2.xml, c nh d ng nh v d trn. Th c hi n bin d ch v ch y th chng trnh. Nh n xt : Th c hi n ci t v i ki n trc 3 l p s gip chng trnh d dng thay i, ti s d ng l i chng trnh. V d : TH_PHANSO khng th hi n t s v m u s b ng TextBox n a m thay b ng control khc (v d nh MyControl th cng khng nh h ng, lc ch c n thay i code trong ph n property t s v m u s m thi. public int tuso{ set{ this.MyControl.Value = value.ToString(); } get{ return int.Parse(this.MyControl.Value); } } public int mauso { set { this.MyControl.Value = value.ToString(); } get { return int.Parse(this.MyControl.Value); } } Khi khng lu tr b ng XML m chuy n sang dng c s d li u th ta ch c n thay code ph n LT_PHANSO, m khng c n thay i code ph n TH_PHANSO, cng nh XL_PHANSO.
101

Ch : Khng ph thu c phng php l p trnh. M i nghi p v khng nh t thi t ch c gi i quy t b i 3 i t ng. Khng l m t ki n trc siu vi t.
4.2. Remoting

4.2.1. Gi i thi u v Remoting .NET Remoting l g? - Tr c h t .NET Remoting l m t k thu t .NET c gi i thi u t .NET framework 1.1. Cng v i .NET Webservice, .NET remoting l l a ch n cho gi i php x l tnh ton t xa. .NET Remoting l m t k thu t cho php m t i t ng ny truy xu t n m t i t ng khc n m cc Application Domain khc nhau. V n u gi i thch theo ki u bnh dn, ta c th s d ng .NET Remoting g i m t chng trnh ho c m t service ch y trn m t my vi tnh khc x l m t ci g v tr k t qu tnh ton l i cho ta.

Hnh 4.1: .NET Remoting Overview

.NET Remoting v Distributed COM - Vo nm m t ngn chn trm h i , ng i ta th ng th c hi n vi c giao ti p gi a cc process b ng cch s d ng Distributed COM hay cn g i l DCOM. DCOM r t h u ch cho nh ng chng trnh ch y trn cc my tnh cng lo i v n m trong cng m t m ng. Tuy nhin, DCOM tr nn l i th i v n khng th ch y trn Internet. DCOM d a trn m t t p giao th c m khng ph i object no cng h tr v i u ny khi n DCOM khng ch y c trn nh ng platform khc nhau. Ngoi ra, DCOM s d ng nhi u port trong khi cc port y th ng b ch n b i firewall. T t nhin m nh ng port n ho t ng c khng kh nhng l m t trong nh ng phi n ph c. - .NET Remoting kh c ph c nh ng y u km c a DCOM b ng cch h tr nhi u giao th c khc nhau. .NET Remoting v Web Services - V kha c nh x l t xa th Web Services hon ton tng t nh .NET Remoting. Th m ch ng i ta c th lm cho .NET Remoting tr thnh 1 Web Services b ng cch
102

host n trong IIS. Web Services cho php cc ng d ng c th giao ti p v i nhau m khng ph thu c platform, ngn ng l p trnh, Tuy nhin Web Services l m t mi tr ng stateless, c ngha l n khng lu l i b t k tr ng thi g c a l n g i tr c v n cng khng bi t g v pha client ang th c hi n request. Client v server Web Services ch c th trao i v i nhau b ng cc thng i p SOAP. Nh ng i u sau y l cc i m khc nhau chnh gi a .NET Remoting v Web Serices, chng cng l nh ng nhn t ta ch n l a gi a 2 cng ngh ny: ASP.NET Web Services ch c th c truy xu t qua HTTP cn .NET Remoting c th c dng trn nhi u giao th c khc nhau nh TCP, HTTP. Web Services l m t mi tr ng stateless. Khi c m t request t pha client, s c m t object m i c t o ra th c hi n request trn server. Cn .NET Remoting l i h tr nhi u l a ch n state management v c th th c hi n nhi u request t m t client, ng th i c h tr callbacks. Web Services serialize cc i t ng thnh XML bn trong SOAP message v v th c th truy n t i thng tin c a b t c thnh ph n no mi n c th chuy n thnh XML. Cn i v i .NET Remoting th ty giao th c v nh d ng message m n c th truy n i thng tin nh th no. Ngoi ra theo nh gi i thi u th .NET Remoting c cho php i t ng c truy n vo theo c ki u tham chi u(reference) v tham tr (value) Web services c th ho t ng trn cc platform mi tr ng khc nhau trong khi .NET Remoting yu c u pha clients ph i l .NET application. Channels - Trong k thu t .NET Remoting th Channel c hi u nh l m t knh giao ti p gi a client v server. M t object t client s thng qua Channel giao ti p v i object pha server, Channel s truy n t i nh ng message t hai pha. Nh gi i thi u pha trn th c hai channel chnh l TcpChannel v HttpChannel tng ng v i cc giao th c TCP v HTTP. Ngoi ra, TcpChannel v HttpChannel u c kh nng extend thnh nh ng Custom Channel c a b n. Lm sao t o m t Object c th Remote c trong .NET Remoting? - M t Object remote c ch l m t object thng th ng nhng ph i c inherit t MarshalByRefObject. o n code sample hnh 4.2 l m t v d n gi n v Remotable Object. i t ng SampleObject trong hnh c m t s method n gi n tr v php tnh t ng, hi u, tch, thng c a hai s nguyn. Gi tr tr v c a hm l ki u s nguyn, ki u built-in c a .NET framework. N u b n mu n tr v ki u d li u b n t nh ngha, ho c m t instance c a class b n nh ngha th l p c a b n ph i c khai bo v i attribute Serializable.
using System; public class SampleObject: MarshalByRefObject { public int Add(int a, int b) { int c = a + b;

103

return c; } public int Subtract(int a, int b) { int c = a - b; return c; } public int Multiply(int a, int b) { int c = a * b; return c; } public int Divide(int a, int b) { int c; if (b != 0) c = a / b; else c = 0; return c; } }

Hnh 4.2: Remotable Object Sample


T o chng trnh Server host Remotable Object

- K ti p, chng ta c n t o ra m t chng trnh server l ng nghe nh ng request t pha client. Trong v d ny chng ta s s d ng TCP/IP channel. u tin chng ta t o m t instance channel v ng k m t port tng ng cho n. Khi c m t Request t pha client, server s nh n request v Remote Object c a chng ta s th c thi Request ny. Trong .NET Remoting, c hai c ch t o instance c a Remote Object r i t th c thi request: Singleton v Singlecall. Ty vo m c ch s d ng, nhu c u c a chng trnh m server c a b n c th khai bo theo c ch WellKnownObjectMode.SingleCall, hay WellKnownObjectMode.Singleton. Khi khai bo Singleton, Remote Object s c sinh ra, th c thi request, reply l i pha client v sau , object ny v n c lu l i ch khng b h y i. n khi no process ch y chng trnh server k t thc th instance ny m i b trnh h t rc Garbage Collector h t i. V ng c l i, khi khai bo l SingleCall, Remote Object s c kh i t o v h y i i v i m i l n nh n request t pha client, c ch ny tng t nh m hnh .NET Web Service truy n th ng. - N u b n mu n s d ng .NET Remoting trong IIS th khng c n t o m t chng trnh server nh th ny. V t t nhin, IIS ch h tr HttpChannel. N u host 1 .NET Remoting bn trong IIS b n s m c nhin s d ng c c ch Authentication c a IIS, ng c l i n u lm m t chng trnh server host nh trn th b n ph i ci t c ch Authentication c a ring mnh. host m t Remote Object bn trong IIS, tr c tin ph i t o 1 Virtual Directory cho application, sau t o n code ng k service bn trong event Application_Start (file global.asax)

104

- Trong v d ny, chng ta s khng s d ng IIS m s t o m t console application. C nhi u l a ch n khi khng s d ng IIS, ta c th s d ng console application, Win form application nhng trong th c t , ng i ta s s d ng m t Windows Service lm. Cn Console application hay Winform Application th ng ch dng minh h a. Trong v d ny, chng ta s s d ng port 9999 cho may m n. C th m t chng trnh no trong my c a b n s d ng port ny, n u b nh v y b n ph i ch n port khc. V sau cng, ki m tra xem my b n ang l ng nghe trn nh ng port no (port no b s d ng) th ta dng l nh netstat a trong command prompt. - Cn by gi , hy xem m t console application project v i 1 class tn l SampleSerrver. Trong project ny ti thm reference t i System.Runtime.Remoting vo trong project n c th ch y c. using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class Server { public static int Main() { TcpChannel chan = new TcpChannel(9999); ChannelServices.RegisterChannel(chan, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject) , "SampleNetRemoting", WellKnownObjectMode.SingleCall); Console.WriteLine("Hit <enter> to exit..."); Console.ReadLine(); } } Hnh 4. 3: Sample Server host Remotable Object T o chng trnh client s d ng Remote Object. - Chng trnh client trong v d ny cng kh n gi n, n s connect vo server, t o m t instance c a Remote Object v excute method tnh t ng, hi u, tch, thng. - Cc b n lu r ng trong c chng trnh client v chng trnh server u ph i reference t i class SampleObject. Client s g i method c a instance SampleObject, nhng server s th c thi x l n ch khng ph i pha client. using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; public class Client {
105

public static int Main (string[] argv) { TcpChannel chan = new TcpChannel(); ChannelServices.RegisterChannel(chan, false); SampleObject obj = (SampleObject)Activator.GetObject( typeof(SampleObject), "tcp://localhost:9999/SampleNetRemoting"); if (obj == null) System.Console.WriteLine("Could not locate server"); else { int a = Convert.ToInt32(argv[0]); int b = Convert.ToInt32(argv[1]); int c = obj.Add(a, b); Console.WriteLine("a + b = {0}", c); c = obj.Subtract(a, b); Console.WriteLine("a - b = {0}", c); c = obj.Multiply(a, b); Console.WriteLine("a * b = {0}", c); c = obj.Divide(a, b); Console.WriteLine("a / b = {0}", c); } Console.ReadKey(); } } Hnh 4: Sample Client Application Test th chng trnh - Tr c tin ch y chng trnh server, b n s th y message Press the enter key to exit trong c a s console. Nh v y server c a b n ang l ng nghe trn port 9999. By gi b n hy ch y chng trnh client v s nhn th y k t qu tr v trn mn hnh. B n c th ch y nhi u client cng request n 1 server nhng khng th ch y nhi u server. B n c th copy chng trnh server sang m t my c a b n mnh v nh ch y th , cn b n s a l i chng trnh client, s a localhost thnh IP c a my b n mnh v ch y th th y k t qu . Tm t t: - V d trn s d ng code C# khai bo cc c u hnh cho server v client tuy nhin .NET Remoting cho php ta c u hnh tr c trong file config (App.config). Cc b n c th tham kh o m t s resource pha d i bi t cch lm. - .NET Remoting l m t trong nh ng k thu t ti n l i cho nh ng chng trnh d ng Distributed Computing. Cch s d ng n ph c t p hn Web Service tuy nhin n u b n

106

mu n tng performance th .NET Remoting v i Singleton v TCP channel s l l a ch n r t t t. - V i s ra i c a .NET Framework 3.x, Microsoft gi i thi u n n t ng m i hn cho cc k thu t RPC, l WCF m nh hn .NET Remoting r t nhi u. 4.2.2. Khai bo, ci t v ng k giao di n t xa cho chng trnh c tnh kh chuy n cao thay v ng i ta xy d ng l p Remote Object nh v d trn chng ta khai bo m t giao di n l l p Remote Object v trong chng trnh pha Server ta s ci t giao di n ny v ng k giao di n t xa. Nh v y tri n khai m t h th ng Remoting ta c 3 chng trnh: Giao di n Remote Object, chng trnh Server tri n khai giao di n v ng k giao di n t xa, chng trnh Client tri u g i phng th c t xa. - Khai bo giao di n t xa - Ci t v ng k giao di n t xa 4.2.3. Tri u g i phng th c t xa - Chng trnh pha Client chng ta tri u g i phng th c c cung c p b i giao di n t xa c ng k v cung c p b i Server
4.3. Web Services

4.3.1. Gi i thi u v Web Services 1. Web Service l g? Web service l m t Modul chng trnh cung c p ch c nng c a cc ng d ng cho php tri u g i v truy c p t xa thng qua Internet. Web service s d ng cc chu n c a Internet nh XML v HTTP. Vi c s d ng Web service ph thu c nhi u vo s ch p nh n c a XML, m t ngn ng m t d li u m i dng truy n t i d li u thng qua Web. B t k m t Web service no cng c th c s d ng, ho c l trong ng d ng c c b ho c truy c p t xa qua Internet b i nhi u ng d ng. Do c kh nng truy c p qua cc giao di n chu n m m t Web service cho php nhi u h th ng khc nhau cng lm vi c v i nhau nh m t ti n trnh duy nh t trn Web. 2. Vai tr c a Web service Web service ra i m ra m t h ng m i cho vi c pht tri n cc ng d ng trn Internet. Web services t m d ch l cc d ch v trn web. Cng ngh web services ra i l m t cu c cch m ng ha cch th c ho t ng c a cc d ch v B2B v B2C. Web services k t h p s d ng nhi u cng ngh khc nhau cho php hai ng d ng cng ngn ng , c l p h i u hnh trao i c v i nhau thng qua mi tr ng m ng Internet. Tuy nhin nh ng cng ngh s d ng y khng nh t thi t ph i l nh ng cng ngh m i. y l i m khc bi t c a web services so v i cc cng ngh khc, chnh l kh nng k t h p cc cng ngh c nh l XML, SOAP, WSDL, UDDI t o ra cc service, c i m ny lm n i b t vai tr c a web services.
107

Web Service c thi t k nh m cung c p m t c ch cho php cc chng trnh giao ti p v i nhau qua Internet (s d ng cc giao th c Internet nh HTTP GET, HTP POST v SOAP). 3. c i m Web service - Web service cho php client v server tng tc c v i nhau m c d trong nh ng mi tr ng khc nhau. - Web Service th c d ng m v d a vo cc tiu chu n XML v HTTP l n n t ng k thu t cho web service. Ph n l n k thu t c a web service c xy d ng l nh ng d n ngu n m . B i v y chng c l p v v n hnh c v i nhau. - Web Service th r t linh ng: V v i UDDI v WSDL, th vi c m t v pht tri n web service c th c t ng ho. - Web service c xy d ng trn n n t ng nh ng cng ngh c ch p nh n. - Web service c d ng modul. - Web service c th c cng b (publish) v g i th c hi n qua m ng. Ngy nay web service c s d ng r t nhi u trong nh ng lnh v c khc nhau c a cu c s ng nh: - D ch v ch n l c v phn lo i tin t c: l nh ng h th ng th vi n k t n i n cc web portal tm ki m cc thng tin t cc nh xu t b n c ch a nh ng kho mu n tm. - D ch v hi n th danh sch a nh c dnh cho cc cng ty thu thanh. - ng d ng i l du l ch c nhi u gi v i du l ch khc nhau do c ch n l a ph c v c a nhi u hng hng khng. - B ng tnh ton chnh sch b o hi m dng cng ngh Excel/COM v i giao di n web. - Thng tin thng m i bao g m nhi u n i dung, nhi u m c tin nh: d bo th i ti t, thng tin s c kho , l ch bay, t gi c phi u, - Nh ng giao d ch tr c tuy n cho c B2B v B2C nh: t v my bay, lm giao ko thu xe. - H th ng thng tin dng java tnh ton t gi chuy n i gi a cc lo i ti n t . H th ng ny s c cc ng d ng khc dng nh m t web service. 4. Ki n trc Web service Ki n trc c a Web service bao g m cc t ng nh sau:

108

Hnh 1: Ki n trc Web service Trong bao g m cc t ng nh sau: T ng v n chuy n: c nhi m v truy n thng i p gi a cc ng d ng m ng, bao g m nh ng giao th c nh HTTP, SMTP, FTP, JSM v g n y nh t l giao th c thay i kh i m r ng (Blocks Extensible Exchange Protocol- BEEP). T ng giao th c tng tc d ch v ( Service Communication Protocol) v i cng ngh chu n l SOAP. SOAP l giao th c n m gi a t ng v n chuy n v t ng m t thng tin v d ch v , SOAP cho php ng i dng tri u g i m t service t xa thng qua m t message XML. T ng m t d ch v (Service Description) v i cng ngh chu n l WSDL v XML. WSDL l m t ngn ng m t giao ti p v th c thi d a trn XML. Web service s d ng ngn ng WSDL truy n cc tham s v cc lo i d li u cho cc thao tc, cc ch c nng m web service cung c p. T ng d ch v ( Service): cung c p cc ch c nng c a service. T ng ng k d ch v (Service Registry) v i cng ngh chu n l UDDI. UDDI dng cho c ng i dng v SOAP server, n cho php ng k d ch v ng i dng c th g i th c hi n service t xa qua m ng, hay ni cch khc m t service c n ph i c ng k cho php cc client c th g i th c hi n Bn c nh cho cc service c tnh an ton, ton v n v b o m t thng tin trong ki n trc web service chng ta c thm cc t ng Policy, Security, Transaction, Management gip tng c ng tnh b o m t, an ton v ton v n thng tin khi s d ng service. 4.3.2. Giao th c SOAP
109

SOAP l ch vi t t t c a c m t Simple Object Access Protocol Giao th c truy c p i t ng n gi n, nhng v i s xem xt m i nh t th, SOAP s khng cn l m t t vi t t t n a. Chu n SOAP ghi nh n XML c th hi n th no bn trong ti li u SOAP, lm th no n i dung c a thng i p c truy n t i, v lm th no thng i p c x l c hai pha g i v nh n. SOAP cng cung c p m t t p cc t v ng chu n. Cc thu t ng : Nh b t k cng ngh no, SOAP cng c t p cc thu t ng c a ring n. C nhi u thu t ng c s d ng th ng xuyn m t cc kha c nh khc nhau c a chu n SOAP. Nhi u l p trnh vin dng cc thu t ng ny m khng th t s hi u ngha c a n. hi u th t s cc khi ni m i h i ph i t n m t th i gian hi u ngha c a t ng thu t ng v lm th no p d ng cho c chu n SOAP v m t Web Services th c th Ch : Chu n SOAP khng ch l chu n XML m chu n ny cn bao g m cc thng i p SOAP c hnh vi nh th no, cc phng ti n v n chuy n khc nhau, cch m cc l i c x l..

S truy n t i d li u
SOAP Binding
Thu t ng m t lm th no m t thng i p SOAP tng tc c v i m t giao th c v n chuy n nh HTTP, SMTP hay FTP di chuy n trn Internet. i u quan tr ng l SOAP di chuy n b ng m t giao th c chu n lin l c v i cc s n ph m Web Services khc. Tr c SOAP, nhi u ng i pht tri n t o ra cc phng php c a ring h chuy n t i m t ti li u XML trn m ng. Cc cch ny v n ho t ng t t trong ph m vi m t nhm c th . Tuy nhin khi b n c n lm vi c v i m t nhm khc trong hay bn ngoi cng ty th i u ny tr nn kh khn v ph i hu n luy n v c th thay i lm vi c v i vi c truy n t i ti li u XML m h ang s d ng. B ng cch s d ng m t ti li u XML chu n trn cc giao th c chu n, cng vi c c n lm khi c ng tc v i nhau s c gi m thi u t i a

SOAP Message Exchang Pattern (MEP)


Thu t ng m t lm th no m m t ti li u SOAP trao i gi a pha my khch v ch . Thng i p SOAP s h u m t lin k t, nh l HTTP, n c th truy n trn Internet. Vi c ni chuy n gi a my khch v ch , y l cc nt, xc nh cc hnh ng m c hai pha th c hi n. Nh c l i SOAP l m t XML ng gi RPC. V th , MEP hon ton l yu c u v ph n h i gi a my khch v ch (hay cc nt khc). Nh v y n u c nhu c u lin l c gi a cc nt th vi c ny c th c hi n b ng nhi u yu c u v ph n h i hon t t vi c truy n thng i p. Cch ny khc h n v i cc cng ngh i t ng t xa khc nh CORBA, cng ngh c th c hi n ch trong m t k t n i.

SOAP Application
M t ng d ng SOAP n gi n l m t ng d ng dng SOAP theo m t vi cch khc nhau. Vi ng d ng hon ton d a trn chu n SOAP, nh l Web Services c phi u, ho c dng chu n SOAP nh n m v cc c p nh t c a ph n m m. Ch l m t ng d ng c th t o, s d ng ho c l nt trung gian c a Web Services.

SOAP Node
Trch nhi m c a m t nt c th bao g m g i, nh n, x l ho c truy n t i l i m t thng i p SOAP. M t nt ch l m t ph n nh c a ph n m m, x l m t ti li u SOAP ph thu c vo 110

vai tr c a n. Bn c nh vi c truy n d li u, m t nt c trch nhi m m b o thng tin XML trong ti li u SOAP ph i ng ng php theo chu n SOAP.

SOAP Role
M t vai tr c a SOAP nh ngha m t nt c th ho t ng nh th no. N c th l nt g i, nh n ho c nt trung gian.

SOAP Sender
Nt g i l nt g i yu c u SOAP. N u b n ngh n v d c a ng d ng khch ch th khi ng d ng khch th c hi n yu c u, n g i thng i p t i ng d ng ch yu c u vi thng tin.

SOAP Receiver
Ng c l i v i SOAP sender l nt nh n.

SOAP Intermediary
M t nt trung gian c th xem m t thng i p SOAP v tng tc trn vi ph n thng tin c a thng i p, v chuy n n v tr k ti p c a thng i p. M t nt trung gian th ng ho t ng nh m t router. M t router s xem xt thng tin c a gi tin chuy n trn m ng, tm i m k ti p c a gi tin v chuy n gi tin n .

Message Path
M t thng i p SOAP di chuy n t pha bn g i n pha bn nh n thng i p thng qua nhi u nt trung gian. Tuy n ng i c a thng i p c g i l m t Message Path.

Initial SOAP Sender


Nt g i yu c u SOAP u tin l nt g i SOAP ban u.

SOAP Feature
M t c i m SOAP l m t ph n ch c nng c a ph n m m h tr ch c nng SOAP.

Cc thu t ng lin quan n XML


Chu n SOAP cng nh ngha m t t p nh cc ph n t XML ng gi d li u c truy n gi a cc nt. Th t s ch c vi ph n t v ph n thn c a thng i p c th khc nhau ph thu c vo ci t. S uy n chuy n ny c cho php b i chu n SOAP.

SOAP Message
y l ti li u XML c truy n b i m t nt SOAP g i ho c nh n. M t nt g i ho c nt khch t o ra m t ti li u XML ch a thng tin m pha bn khch c n t pha ch . M t khi ti li u c truy n, pha bn ch phn gi i thng tin trong ti li u truy xu t cc gi tr khc nhau v t o m t thng i p SOAP m i ph n h i.

SOAP Envelope
y l ph n t g c c a ti li u SOAP XML. Ti li u SOAP ch a nhi u nh ngha khng gian tn (namespace) nhng cc ph n t lin quan t i thng i p SOAP s c ENV: l ti p u ng .

SOAP Header
111

Ph n u c a m t thng i p SOAP ch a m t kh i thng tin u trong ti li u XML nh tuy n v x l thng i p SOAP. D li u ny tch r i kh i ph n thn c a ti li u c ch a thng tin lin quan n i t ng c g i.

SOAP Header Block


Ph n u c a SOAP ch a nhi u ph n gi i h n hay l nhi u kh i thng tin c m t kh i thng tin c a ph n u. Nh ng kh i thng tin c a ph n u ny ch a thng tin v cc nt trung gian v m t nt c n bi t nt k ti p thng i p c g i n.

SOAP Body
Ph n thn c a SOAP th t s ch a thng tin c a i t ng x l thng tin. Ph n thn sau khi c phn tch s tr thnh i t ng. i t ng x l thng tin v k t qu c t trong ph n thn c a ti li u tr v .

SOAP Fault
y l m t ph n thng tin c a SOAP ch a thng tin n b t k l i g x y ra t i m t nt SOAP.

4.3.3. Xy d ng Web Services - T o m t Web Services project

- T o Web Method

112

- Ch y th Web Services danh sch cc hm s c li t k

- Ch n hm Add

113

- Sau khi nh p cc tham s vo, nh n Invoke. K t qu s xu t hi n

4.3.4. Tri u g i Web Services t ng d ng .NET, Java v cc ngn ng khc - Sau khi xy d ng Web Server song ta c th tri u g i n t m t ng d ng khc
- T o m t Window Form

114

- Add Web Reference

- T o mn hnh:

115

- Vi t hm x l nt nh n:

- Ch y th

ng d ng ta c k t qu :

4.4 Th o lu n v cc ng d ng phn tn 4.5. Bi t p p d ng

1. Vi t chng trnh Chat s d ng cng ngh Web Services 2. Vi t chng trnh Calculator b ng cng ngh Web Services 3. Vi t ch ng trnh qu n l FileManager b ng cng ngh Web Services.

116

TI LI U THAM KH O 1. Richard Blum, C# Network Programming, 2003 2. Fiach Reid, Network programming in NET with C# and VB.NET, Digital Press, 2003 3. Bi gi ng Nh p mn Cng ngh ph n m m, i h c KHTN 4. Bi gi ng Xy d ng ph n m m h ng i t ng, i h c KHTN 5. Bi gi ng L p trnh truy n thng, i h c C n Th 6. Bi gi ng Cng ngh .NET, Khoa CNTT i h c SPKT Hng Yn 7. Bi gi ng Java Nng cao, Khoa CNTT- i h c SPKT Hng Yn 8. Cc v d t i Website: www.java2s.com

117

You might also like