Giáo trình Lập trình mạng (Phần 2)

pdf 63 trang ngocly 100
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình mạng (Phần 2)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_mang_phan_2.pdf

Nội dung text: Giáo trình Lập trình mạng (Phần 2)

  1. CHƯƠNG3:XÂYDNGNGDNGMNG 3.1.GiaothcICMP GiithiugiaothcICMP(InternetworkControlMessageProtocol) GiaothcICMPhotđngtrênlayer2InternetworktrongmơhìnhTCP/IPhoc layer3NetworktrongmơhìnhOSI ChophépkimtravàxácđnhlicaLayer3InternetworktrongmơhìnhTCP/IP bngcáchđnhnghĩaracácloithơngđipcĩthsdngđxácđnhxemmnghin ticĩthtruynđưcgĩitinhaykhơng. Trongthct,ICMPcncácthànhphncamigĩitinIPđcĩthhotđngđưc. CutrúccagĩitinIPvàICMP +Type:cĩthlàmtqueryhaymtli +Code:Xácđnhđâylàloiqueryhaythơngđipli +Checksum:KimtravàsalichodliuICMP +Message:TuỳthucvàoTypevàCode 3.1.1.SdngRawSocket GĩitinICMPkhơngsdngTCPhocUDPnênchúngtakhơngthsdngcáclp đưchtrnhưTcpClienthayUdpClientmàphisdngmtRawSocket Mun to Raw Socket khi to ra Socket bn s dng SocketType.Raw, giao thc ICMP ToRawSocketnhưsau Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); RawSocketFormat Value Description Ggp GatewaytoGatewayProtocol Icmp InternetControlMessageProtocol 55
  2. Idp IDPProtocol Igmp InternetGroupManagementProtocol IP ArawIPpacket Ipx NovellIPXProtocol ND NetDiskProtocol Pup XeroxPARCUniversalProtocol(PUP) Raw ArawIPpacket Spx NovellSPXProtocol SpxII NovellSPXVersion2Protocol Unknown Anunknownprotocol Unspecified Anunspecifiedprotocol  GigĩidliuRaw  ICMPlàgiaothckhơnghưngktni  SdngphươngthcSendTo()calpSocketđgi  CngtronggiaothcICMPkhơngquantrng IPEndPointiep=newIPEndPoint(IPAddress.Parse("192.168.1.2"),0); sock.SendTo(packet,iep);  NhngĩidliuRaw  SdngphươngthcReceiveFormcalpSocket  DliunhnvlàmtgĩitinIPchúngtaphitáchrađlygĩitinICMP RawSocketkhơngtđngđnhdnggĩitinICMPchochúngta.Chúngtaphitlàm DataVariable Size Type Type 1byte Byte Code 1byte Byte Checksum 2bytes Unsigned16bitinteger Message multibyte Bytearray ðnhnghĩalpvàphươngthckhitomcđnh classICMP{ publicbyteType; publicbyteCode; publicUInt16Checksum; publicintMessagesize; publicbyte[]Message=newbyte[1024]; publicICMP(){ } }  ToragĩitinICMP ICMPpacket=newICMP(); 56
  3. packet.Type=0x08; packet.Code=0x00; packet.Checksum=0; publicICMP(byte[]data,intsize){ Type=data[20]; Code=data[21]; Checksum=BitConverter.ToUInt16(data,22); MessageSize=size24; Buffer.BlockCopy(data,24,Message,0,MessageSize); } publicbyte[]getBytes(){ byte[]data=newbyte[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); returndata; } publicUInt16getChecksum(){ UInt32chcksm=0; byte[]data=getBytes(); intpacketsize=MessageSize+8; intindex=0; while(index >16)+(chcksm&0xffff); chcksm+=(chcksm>>16); return(UInt16)(~chcksm); } 3.1.2.SdnggiaothcICMPvàRawSocketđxâydngchươngtrìnhPing 57
  4. classProgram{ staticvoidMain(string[]args){ byte[]data=newbyte[1024]; intrecv; Sockethost=newSocket(AddressFamily.InterNetwork,SocketType.Raw, ProtocolType.Icmp); IPEndPointiep=newIPEndPoint(IPAddress.Parse(argv[0]),0); EndPointep=(EndPoint)iep; ICMPpacket=newICMP(); 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("testpacket"); Buffer.BlockCopy(data,0,packet.Message,4,data.Length); packet.MessageSize=data.Length+4; intpacketsize=packet.MessageSize+4; UInt16chcksum=packet.getChecksum(); packet.Checksum=chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout,3000); host.SendTo(packet.getBytes(),packetsize,SocketFlags.None,iep); try{ data=newbyte[1024]; recv=host.ReceiveFrom(data,refep); }catch(SocketException){ Console.WriteLine("Noresponsefromremotehost"); return; } ICMPresponse=newICMP(data,recv); Console.WriteLine("responsefrom:{0}",ep.ToString()); Console.WriteLine("Type{0}",response.Type); Console.WriteLine("Code:{0}",response.Code); intIdentifier=BitConverter.ToInt16(response.Message,0); 58
  5. intSequence=BitConverter.ToInt16(response.Message,2); Console.WriteLine("Identifier:{0}",Identifier); Console.WriteLine("Sequence:{0}",Sequence); stringstringData=Encoding.ASCII.GetString(response.Message,4, response.MessageSize4); Console.WriteLine("data:{0}",stringData); host.Close(); } } 3.1.3.SdnggiaothcICMPvàRawSocketđxâydngchươngtrình TraceRoute classTraceRoute{ publicstaticvoidMain(string[]argv){ byte[]data=newbyte[1024]; intrecv,timestart,timestop; Sockethost=newSocket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.Icmp); IPHostEntryiphe=Dns.Resolve(argv[0]); IPEndPointiep=newIPEndPoint(iphe.AddressList[0],0); EndPointep=(EndPoint)iep; ICMPpacket=newICMP(); 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("testpacket"); Buffer.BlockCopy(data,0,packet.Message,4,data.Length); packet.MessageSize=data.Length+4; intpacketsize=packet.MessageSize+4; UInt16chcksum=packet.getCchecksum(); packet.Checksum=chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout,3000); intbadcount=0; for(inti=1;i<50;i++){ host.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive,i); timestart=Environment.TickCount; host.SendTo(packet.getBytes(),packetsize,SocketFlags.None,iep); try{ data=newbyte[1024]; recv=host.ReceiveFrom(data,refep); timestop=Environment.TickCount; ICMPresponse=newICMP(data,recv); if(response.Type==11) Console.WriteLine("hop{0}:responsefrom{1},{2}ms", i,ep.ToString(),timestoptimestart); if(response.Type==0){ Console.WriteLine("{0}reachedin{1}hops,{2}ms.", ep.ToString(),i,timestoptimestart); break; 59
  6. } badcount=0; }catch(SocketException){ Console.WriteLine("hop{0}:Noresponsefromremotehost",i); badcount++; if(badcount==5){ Console.WriteLine("Unabletocontactremotehost"); break; } } } host.Close(); } } 3.2.GiaothcSMTP,POP3 3.2.1.CơbnvhthngMailvàgiaothcSMTP,POP3 60
  7. *GiaothcSMTP MtslnhcơbncagiaothcSMTP: Lnh Mơt HELO Hello.Sdngđxácđnhngưigiđin.Lnhnàynàyđi kèmvitêncahostgiđin.TrongESTMP(extended protocol),thìlnhnàyslàEHLO. MAIL Khitomtgiaodchgithư.Nĩkthp"from"đxácđnh ngưigithư. RCPT Xácđnhngưinhnthư. DATA Thơngbáobtđunidungthcscabcđin(phnthân cathư).Dliuđưcmãthànhdngmã128bitASCIIvànĩ đưcktthúcvimtdịngđơnchaduchm(.). RSET Hubgiaodchthư VRFY Sdngđxácthcngưinhnthư. NOOP Nĩlàlnh"nooperation"xácđnhkhơngthchinhành đnggì QUIT Thốtkhitintrìnhđktthúc SEND Chohostnhnbitrngthưcịnphigiđnđucuikhác. MtslnhkhơngyêucuphicĩđưcxácđnhbngRFC821 SOML Sendormail.Báovihostnhnthưrngthưphi giđnđucuikháchochpthư. SAML Sendandmail.Nĩivihostnhnrngbcđin phigitingưidùngđucuivàhpthư. EXPN Sdngmrngchomtmailinglist. HELP Yêucuthơngtingiúpđtđunhnthư. TURN Yêucuđhostnhngivaitrịlàhostgithư. MãtrngtháicaSMTP KhimtMTAgimtlnhSMTPtiMTAnhnthìMTAnhnstrlivi mtmãtrngtháiđchongưigibitđangcĩvicgìxyrađunhn.Vàdưiđây làbngmãtrngtháicaSMTPtheotiêuchunRFC821.Mcđcatrngtháiđưc 61
  8. xácđnhbisđutiêncamã(5xxlàlinng,4xxlàlitmthi,1xx–3xxlàhot đngbìnhthưng). MtsmãtrngtháicaSMTP 211Tìnhtrnghthng,hayreplygiúpđhthng 214Thơngđipgiúpđ. 220 dchvsnsàng 221 dchvđĩngkênhgiaochuyn 250HànhđngmailyêucuOK,hồnthành 251Userkhơngccb;shưngđn 354Khiđngvicnhpmail;ktthúcvi . 421 dchvkhơngsdngđưc,đĩngkênhgiaochuyn 450Khơnglyhànhđngmailyêucu;mailboxkhơnghiulc 451Khơngnhnhànhđngđưcyêucu;lưutrcahthng khơngđ. 500Licúpháp;khơngchpnhnlnh 501Licúpháptrongthamshayđis 502 Lnhkhơngđưccungcp 503 Dịnglnhsai 504Thamscadịnglnhkhơngđưccungcp 550Khơngnhnhànhđngđưcyêucu;mailboxkhơnghiulc [nhưmailboxkhơngtìmthyhaykhơngtruycpđưc] 551Userkhơngccb;vuilịngth 552Bquahànhđngmàmailyêucu,vưtquáchđnhlưutr 554Khơngnhnhànhđngđưcyêucu;tênmailboxkhơngđưc chpnhn.[nhưsaicúphápmailbox]giaochuynsai. ðnhdngcamtbcthưthơngthưngkhơngcĩphnđínhkèmnhưsau: *GiaothcPOP3 Giaothcdùngđlythư,POP3Serverlngnghetrêncng110,mơttrong RFC1939 62
  9. MtslnhcaPOP3 USERXácđnhusername PASS Xácđnhpassword STATYêucuvtrngtháicahpthưnhưslưngthưvàđlncathư LIST Hindanhsáchcathư RETRNhnthư DELEXốmtbcthưxácđnh NOOPKhơnglàmgìc RSETKhơiphclinhưthưđãxố(rollback) QUITThchinvicthayđivàthốtra 3.2.2.CàiđtSMTP,POP3Client/Server VitchươngtrìnhgiMailđơngintheogiaothcSMTP usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.IO; classProgram{ staticvoidMain(string[]args){ stringnguoigui,nguoinhan,tieude,body; stringdiachimaychu; intportmaychu; Console.Write("NhapdichuSMTPServer:"); diachimaychu=Console.ReadLine(); Console.Write("Nhapcongcuamaychu:"); portmaychu=int.Parse(Console.ReadLine()); Console.Write("Nhapdiachinguoigui:"); nguoigui=Console.ReadLine(); Console.Write("Nhapdiachinguoinhan:"); nguoinhan=Console.ReadLine(); Console.Write("Nhaptieudebucthu:"); tieude=Console.ReadLine(); Console.Write("Nhapnoidungbucthu:"); body=Console.ReadLine(); //TaoEndpoitcuamaychu IPEndPointiep=newIPEndPoint(IPAddress.Parse(diachimaychu),portmaychu); TcpClientclient=newTcpClient(); client.Connect(iep); stringData="Helo"; StreamReadersr=newStreamReader(client.GetStream()); StreamWritersw=newStreamWriter(client.GetStream()); sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); 63
  10. //Guidiachinguyoigui Data="MAILFROM: "; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Guidiachinguyoigui Data="RCPTTO: "; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Batdauguinoidungbucthu Data="Data"; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Guinoidungbucthu Data="SUBJECT:"+tieude+"\r\n"+body+"\r\n"+"."+"\r\n"; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Ngatketnoi Data="QUIT"; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); sr.Close(); sw.Close(); client.Close(); Console.ReadLine(); } } 64
  11. VitchươngtrìnhlythưđơngintheogiaothcPOP3 usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.Drawing; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Threading; usingSystem.IO; usingSystem.Net; usingSystem.Net.Sockets; namespaceMyPop3{ publicpartialclassForm1:Form{ TcpClientpopclient; StreamReadersr; StreamWritersw; publicForm1(){ InitializeComponent(); CheckForIllegalCrossThreadCalls=false; 65
  12. } privatevoidbtLogin_Click(objectsender,EventArgse){ IPEndPointiep=newIPEndPoint(IPAddress.Parse(txtPOP.Text), int.Parse(txtPort.Text)); popclient=newTcpClient(); popclient.Connect(iep); sr=newStreamReader(popclient.GetStream()); sw=newStreamWriter(popclient.GetStream()); sr.ReadLine(); stringdata=""; 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(); strings=sr.ReadLine(); char[]ch={''}; string[]tam=s.Split(ch); //MessageBox.Show("sobucthula:"+tam[1]); while((s=sr.ReadLine())!="."){ lstHeader.Items.Add(s); } } privatevoidlstHeader_SelectedIndexChanged(objectsender,EventArgse){ inti=lstHeader.SelectedIndex+1; //Laybucthuvevatienhanhphantich stringdata="RETR"+i.ToString(); sw.WriteLine(data); sw.Flush(); strings; //MessageBox.Show(sr.ReadLine()); //Layphanheader while((s=sr.ReadLine().Trim())!=null){ //MessageBox.Show(s); if(s.Length==0)break; if(s.ToUpper().StartsWith("DATE")){ DateTimedt=DateTime.Parse(s.Substring(5,s.Length5)); txtDate.Text=dt.ToShortDateString()+""+dt.ToLongTimeString(); } if(s.ToUpper().StartsWith("FROM")) 66
  13. txtFrom.Text=s.Substring(5,s.Length5); if(s.ToUpper().StartsWith("TO")) txtTo.Text=s.Substring(3,s.Length3); if(s.ToUpper().StartsWith("SUBJECT")) txtSubject.Text=s.Substring(8,s.Length8); } //Layphanbody textBox4.Clear(); //MessageBox.Show("Laybody"); while(!sr.EndOfStream){ s=sr.ReadLine().Trim(); if(s.Equals("."))break; textBox4.Text+=s+"\r\n"; } //MessageBox.Show("Hetnoidungbucthu"); } } } 3.3.GiaothcHTTP 3.3.1.CơbnvgiaothcHTTP HTTP(HypertextTransferProtocol)giaothctruynsiêuvănbn.HTTPlà giaothctngngdngchoWeb.Nĩhotđngtheomơhìnhclient/server. Client:browseryêucu,nhn,hinthcácđitưngWeb. Server:Webservergicácđitưng HaiphiênbncagiaothcHTTPhinđưcphbinlàHTTP1.0đưcđct trongRFC1945vàHTTP1.1đưcđcttrongRFC2068. HTTPlàgiaothc“khơngtrngthái”serverkhơnglưulicácyêucucaclient. HTTPsdnggiaothcTCPcatnggiaovn.Cácbưctinhànhtkhiclientkt nitiserversauđĩgivànhnktqutservergivnhưsau: 67
  14. +clientkhitoktniTCP(tosocket)viserver,quacng80 +serverchpnhnktniTCPtclient +CácthơngđipHTTP(thơngđiptngngdng)đưctraođigiabrowser (HTTPclient)vàWebserver(HTTPserver) +ðĩngktniTCP. ChúngtaxemmtvídvquátrìnhtraođigiabrowservàWebservernhưsau: User nh p URL (baogmtext, www.someSchool.edu/someDepartment/home.index thamchiuti10 nhdngjpeg) 1a. HTTPclientkhitoktni TCPtiHTTPserver(tin trình)tiđach 1b. HTTPserverđich www.someSchool.edu.Cng www.someSchool.eduđi mcđnhlà80. ktniTCPcng80,chp nhnktni,thơngbáoli 2. HTTPclientgithơngđipyêu choclient. cu HTTP (bao gm URL) vào trong TCP connection 3. HTTP server nhn thơng đip yêu socket cu,lycácđitýngđýcyêucu gi vào trong thơng đip tr li, (someDepartment/home.index) gi thơngđipvàosocket 4. HTTPserverđĩngktniTCP. 5. HTTP client nhn thơng đip tr li bao gm tp html, hin th html.Phân tích tp html file, tìm 10 jpeg đi týngđýcthamchiu time 6.Cácbưct1đn5đưclp lichotngđitưngtrong 10đitưngjpeg CĩhaikiuthơngđipHTTPlàyêucu(Request)vàtrli(Response).Các thơngđipđưcđnhdngkiumãASCII. ðnhdngthơngđipyêucuHTTP 68
  15. Dịngyêucu (lnh GET,POST, GET /somedir/page.html HTTP/1.0 HEAD ) User-agent: Mozilla/4.0 Nhngdịngheader Accept: text/html, image/gif,image/jpeg Accept-language:fr (CR,LF) CR,LF,kíhiukt thúcthơngđip ðnhdngthơngđiptrliHTTP Dịngtrngthái (mãtrngthái) HTTP/1.0 200 OK Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modif ied: Mon, 22 Jun 1998 Nhngdịngheader Content-Length: 6821 Content-Type: text/html data data data data data dliu,e.g., tphtmlđýc yêucu 69
  16. QuátrìnhtraođigiaBrowservàWebServercĩthđưcminhhanhưhìnhsau: MãtrngtháitrongthơngđipHTTPResponse:ðưcghidịngđutiêntrongthơng đipresponsetservervclient. Mtsmãthưnggp: 200OK Yêucuthànhcơng,cácđitưngđưcyêucuphnsauthơngđip. 301MovedPermanently ðitưngđưcyêucuđãđưcchuynvàđachmicađitưngđưcđt trongtrưngLocation: 400BadRequest Serverkhơnghiuđưcthơngđipyêucu 404NotFound Tàiliuđưcyêucukhơngcĩtrongserver 505HTTPVersionNotSupported ServerkhơnghtrversioncagiaothcHTTP. ðkimtracáclnhcaHTTPbênphíaClientchúngtacĩththchinnhưsau: +TelnettiWebserver 70
  17. telnet www.eurecom.fr 80 ToktniTCPcng80 (cngmcđnhchoHTTPserver) atwww.eurecom.fr. +LnhGETtrongthơngđipHTTP GET /~ross/index.html HTTP/1.0 Githơngđipyêuculytp Index.htmltrongthưmc~ross vclient +XemthơngđipresponseđưcgivtServer Gõcáclnhkhácđkimtra. 3.3.2.CàiđtHTTPClient/Server a.ChươngtrìnhHTTPClient usingSystem; usingSystem.IO; usingSystem.Net.Sockets; usingSystem.Windows.Forms; namespaceHttpView{ publicpartialclassMainForm:Form { [STAThread] publicstaticvoidMain(string[]args){ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(newMainForm()); } publicMainForm(){ // //TheInitializeComponent()callisrequiredforWindowsFormsdesigner support. // InitializeComponent(); // //TODO:AddconstructorcodeaftertheInitializeComponent()call. // } //Giyêucuvànhnvphnhitwebserver voidBtGoClick(objectsender,EventArgse){ //Thêmtinthttp://nukhơngcĩ if(txtAddress.Text.StartsWith("http://",StringComparison.OrdinalIgnoreCase) ==false) txtAddress.Text="http://"+txtAddress.Text; TcpClientclient=newTcpClient(); try{ client.Connect(GetHost(txtAddress.Text),GetPort(txtAddress.Text)); } catch{ 71
  18. rtfBody.Text="Khơngthktniđnserver"; return; } StreamWriterOutStream=newStreamWriter(client.GetStream()); StreamReaderInpStream=newStreamReader(client.GetStream()); //GiđiyêucubngphươngthcGET OutStream.WriteLine("GET"+txtAddress.Text+"HTTP/1.0"); OutStream.WriteLine("ContentType:text/html"); OutStream.WriteLine("ContentLanguage:en"); OutStream.WriteLine(); OutStream.Flush(); //LyphnHeader rtfHeader.Text=""; strings; while(null!=(s=InpStream.ReadLine())){ if(s.Equals(""))break; rtfHeader.Text+=s; } //LyphnBody rtfBody.Text=""; intc; while(true){ c=InpStream.Read(); if(c==1)break; rtfBody.Text+=(char)c; } client.Close(); } //KhigõEnterthìgiđiyêucu voidTxtAddressKeyPress(objectsender,KeyPressEventArgse){ if((int)e.KeyChar==13) btGo.PerformClick(); } //LyvtênmáytrongURL internalstringGetHost(stringurl){ url=url.ToLower(); Uritmp=newUri(url); returntmp.Host; } //LyvshiucngtrongURL internalintGetPort(stringurl){ Uritmp=newUri(url); returntmp.Port; } } } b.ChươngtrìnhHTTPServer usingSystem; usingSystem.IO; 72
  19. usingSystem.Net; usingSystem.Net.Sockets; publicclassSimpleWebServer{ publicvoidStartListening(intport){ IPEndPointLocalEndPoint=newIPEndPoint(IPAddress.Any,8080); TcpListenerserver=newTcpListener(LocalEndPoint); server.Start(); while(true){ TcpClientclient=server.AcceptTcpClient();//Chodoiketnoi processClientRequest(client); } } //Xlýyêucucamimáykhách privatevoidprocessClientRequest(TcpClientclient){ Console.WriteLine("Maykhachsudungcong:"+ (client.Client.RemoteEndPointasIPEndPoint).Port+";DiachiIPmaykhach:"+ client.Client.RemoteEndPoint.ToString()+"\n"); Console.WriteLine("Yeucau:"); readRequest(client); sendResponse(client); client.Close(); } //ðcphnheadercagĩidliugitmáykhách privatevoidreadRequest(TcpClientclient){ StreamReaderrequest=newStreamReader(client.GetStream()); StringnextLine; while(null!=(nextLine=request.ReadLine())){ if(nextLine.Equals("")){ break; }else{ Console.WriteLine(nextLine); } } Console.WriteLine(""); } //Phnhiyêucuchomáykhách privatevoidsendResponse(TcpClientclient){ StreamWriterresponse=newStreamWriter(client.GetStream()); response.Write(_mainPage); response.Flush(); } //Miphnhivtrìnhduyt privateconstString_mainPage= "HTTP/1.0200OK\n"+ 73
  20. "Contenttype:text/html\n"+ "Connection:close\n"+ "\n \n"+ " \n"+ " HelloWorld \n"+ " \n"+ " HelloWorld \n"+ " \n\n"; } classTestWebServer{ publicstaticvoidMain(String[]args){ SimpleWebServerwebServer1=newSimpleWebServer(); webServer1.StartListening(8080); } } 3.4.GiaothcFTP 3.4.1.CơbnvgiaothcFTP GiaothcFTPlàmtgiaothctraođifilekháphbin KháinimvàhotđngcơbncaFTP: NhngngưipháttringiaothcFTPcnphicânbngnhucugiavicpháttrin mtbgiaothcvacĩnhiuchcnăngvàvađơngintrongtrinkhai.Dođĩ,FTP khơngđơnginnhư“đaemtrai”canĩ–làgiaothcTFTP.Hotđngcagiao thcnàycĩthchiarathànhnhiuthànhphnnh,hotđngcùngnhauđthchin các cơng vic như khi to kt ni, truyn thơng tin điu khin và truyn lnh. Nidungmàbàivitnàyhưngtilàđưatingưiđcnhngkháinimquantrng nhtđngsaugiaothcFTP,cũngnhưgiithíchtngquanvnguyênlýhotđng canĩ. 1MơhìnhhotđngcaFTP,cácthànhphntronggiaothc,vàcácthutng cơbn GiaothcFTPđưcmơtmtcáchđơnginthơngquamơhìnhhotđngcaFTP. Mơhìnhnàychracácnguyêntcmàmtthitbphituântheokhithamgiavàoquá trìnhtraođifile,cũngnhưvhaikênhthơngtincnphithitlpgiacácthitb đĩ.NĩcũngmơtcácthànhphncaFTPđưcdùngđqunlýcáckênhnàyc haiphía–truynvànhn.Dođĩ,mơhìnhnàytochotamtkhiđimlýtưngđ xemxéthotđngcaFTPmckháiquát. TintrìnhServerFTPvàUserFTP 74
  21. FTPlàmtgiaothcdngclient/servertruynthng,tuynhiênthutngclientthơng thưngđưcthaythbngthutnguser–ngưidùng–dothctlàngưisdng milàđitưngtrctipthaotáccáclnhFTPtrênmáyclients.BphnmmFTP đưccàiđttrênmtthitbđưcgilàmttintrình.PhnmmFTPđưccàiđt trênmáyServerđưcgilàtintrìnhServerFTP,vàphntrênmáyclientđưcgilà tintrìnhUserFTP. KênhđiukhinvàkênhdliutrongFTP MtkháinimctyumàtacnphinmvFTPlà:mcdùgiaothcnàysdng ktniTCP,nhưngnĩkhơngchdùngmtkênhTCPnhưphnlncácgiaothc truynthơngkhác.MơhìnhFTPchiaquátrìnhtruynthơnggiabphnServervi bphnclientralàmhaikênhlogic: Kênhđiukhin:đâylàkênhlogicTCPđưcdùngđkhitomtphiênktni FTP.NĩđưcduytrìxuyênsutphiênktniFTPvàđưcsdngchđtruyncác thơngtinđiukhin,nhưcáclnhvàcáchiđáptrongFTP.Nĩkhơngđưcdùngđ truynfile Kênhdliu:Mikhidliuđưctruyntserverticlient,mtkênhktniTCP nhtđnhliđưckhitogiachúng.Dliuđưctruynđiquakênhktninày– dođĩnĩđưcgilàkênhdliu.Khifileđưctruynxong,kênhnàyđưcngt. Vicsdngcáckênhriênglnhưvytoraslinhhottrongvictruyntruynd liu–màtasthytrongcácphntiptheo.Tuynhiên,nĩcũngtochoFTPđphc tpnhtđnh. CáctintrìnhvàthutngtrongFTP Docácchcnăngđiukhinvàdliusdngcáckênhkhácnhau,nênmơhìnhhot đngcaFTPcũngchiaphnmmtrênmithitbralàmhaithànhphnlogictương ngvimikênh.ThànhphnProtocolInterpreter(PI)làthànhphnqunlýkênh điukhin,vichcnăngphátvànhnlnh.ThànhphnDataTransferProcess(DTP) cĩchcnănggivànhndliugiaphíaclientviserver.Ngồira,cungcpcho tintrìnhbênphíangưidùngcịncĩthêmthànhphnthbalàgiaodinngưidùng FTPthànhphnnàykhơngcĩphíaserver. Dođĩ,cĩhaitintrìnhxyraphíaserver,vàbatintrìnhphíaclient.Cáctin trìnhnàyđưcgnvimơhìnhFTPđmơtchitithotđngcagiaothcFTP. Dưi đây là hình đi chiu các tin trình vào trong mơ hình FTP: 75
  22. Cáctintrìnhphíaserver: Cáctintrìnhphíaserverbaogmhaigiaothc: ServerProtocolInterpreter(ServerPI): chutráchnhim qunlýkênhđiukhin trênserver.Nĩlngngheyêucuktnihưngtituserstrêncngdànhriêng.Khi ktniđãđưcthitlp,nĩsnhnlnhtphíaUserPI,trlili,vàqunlýtin trìnhtruyndliutrênserver. ServerDataTransferProcess(ServerDTP):làmnhimvgihocnhnfiletb phnUserDTP.ServerDTPvalàmnhimthitlpktnikênhdliuvàlng nghemtktnikênhdliutuser.Nĩtươngtácviserverfiletrênhthngcc bđđcvàchépfile. Cáctintrìnhphíaclient: UserProtocolInterpreter(UserPI):chutráchnhimqunlýkênhđiukhinphía client.NĩkhitophiênktniFTPbngvicphátrayêucutiphíaServerPI.Khi ktniđãđưcthitlp,nĩxlýcáclnhnhnđưctrêngiaodinngưidùng,gi chúngtiServerPI,vànhnphnhitrli.NĩcũngqunlýtintrìnhUserDTP. UserDataTransferProcess(UserDTP):làbphnDTPnmphíangưidùng, làmnhimvgihocnhndliutServerDTP.UserDTPcĩththitlphoc 76
  23. lngngheyêucuktnikênhdliutrênserver.Nĩtươngtácvithitblưutrfile phíaclient. UserInterface:cungcpgiaodinxlýchongưidùng.Nĩchophépsdngcác lnhđơnginhưngngưidùng,vàchophépngưiđiukhinphiênFTPtheodõi đưccácthơngtinvàktquxyratrongtintrình. 2 Thit lp kênh điu khin và chng thc ngưi dùng trong FTP: MơhìnhhotđngcaFTPmơtrõcáckênhdliuvàđiukhinđưcthitlp giaFTPclientvàFTPserver.Trưckhiktniđưcsdngđthcstruynfile, kênhđiukhincnphiđưcthitlp.Mttintrìnhchđnhsauđĩđưcdùngđ to kt ni và to ra phiên FTP lâu bn gia các thit b đ truyn files. Như trong các giao thc client/server khác, FTP server tuân theo mt lut passive trongkênhđiukhin.BphnServerProtocolInterpreter(ServerPI)slngnghe cngTCPdànhriêngchoktniFTPlàcng21.PhíaUserPIstoktnibng vicmmtktniTCPtthitbngưidùngtiservertrêncngđĩ.Nĩsdng mt cng bt kỳ làm cng ngun trong phiên kt ni TCP. KhiTCPđãđưccàiđtxong,kênhđiukhingiacácthitbsđưcthitlp,cho phépcáclnhđưctruyntUserPItiServerPI,vàServerPIsđáptrktqulà cácmãthơngbáo.Bưcđutiênsaukhikênhđãđivàohotđnglàbưcđăngnhp ca ngưi dùng (login sequence). Bưc này cĩ hai mc đích: AccessControlðiukhintruycp:quátrìnhchngthcchophéphnchtruy cptiservervinhngngưidùngnhtđnh.Nĩcũngchophépserverđiukhin loi truy cp như th nào đi vi tng ngưi dùng. ResourceSelectionChnnguncungcp:Bngvicnhndngngưidùngtokt ni,FTPservercĩthđưaraquytđnhscungcpnhngngunnàochongưidùng đãđưcnhndngđĩ. TrìnhttruycpvàchngthcFTP QuylutchngthctrongFTPkháđơngin,chlàcung cp username/password. Trìnhtcavicchngthcnhưsau: 1ngưidùnggimtusernametUserPItiServerPIbnglnhUSER.Sauđĩ password ca ngưi dùng đưc gi đi bng lnh PASS. 2Serverkimtratênngưidùngvàpasswordtrongdatabasengưidùngcanĩ. Nungưidùnghpl,serversgitrmtthơngbáotingưidùngrngphiênkt 77
  24. niđãđ.cm.Nungưidùngkhơnghpl,serveryêucungưidùngthchinli vicchngthc.Sau mts lnchngthcsainht đnh, server s ngt kt ni. Gisquátrìnhchngthcđãthànhcơng,serversauđĩsthitlpktniđcho phéptngloitruycpđivingưidùngđưccpquyn.Mtsngưidùngchcĩ thtruycpvàomtsfilenhtđnh,hocvàomtsloifilenhtđnh.Mts servercĩthcpquynchomtsngưidùngđcvàvitlênserver,trongkhich chophépđcđivinhngngưidùngkhác.Ngưiquntrmngcĩthnhđĩmà đápngđúngcácnhucutruycpFTP. Mtkhiktniđãđưcthitlp,servercĩththchincáclachntàinguyênda vàonhndinngưidùng.Víd:trênmththngnhiungưidùng,ngưiquntr cĩththitlpFTPđkhicĩbtcngưidùngnàoktniti,anhtastđng đưcđưati"homedirectory"cachínhanhta.LnhtùychnACCT(account)cũng chophépngưidùngchnmttàikhoncánhânnàođĩnunhưanhtacĩnhiuhơn mttàikhon. MrngvbomtFTP Gingnhưphnlncácgiaothccũ,phươngphápđăngnhpđơngincaFTPlà mtskthatnhnggiaothcthikỳđucaInternet.Ngàynay,nĩkhơngcịn bo đm tính an tồn cn thit trên mơi trưng Internet tồn cu vì username và passwordđưcgiquakênhktniđiukhindưidngcleartext.ðiunàylàmcho cácthơngtinđăngnhpcĩthbnghelén.ChunRFC2228vcácphnmrngcho bomtFTPđãđnhrathêmnhiutùychnchngthcvàmãhĩaphctpcho nhng ai mun tăng thêm mc đ an tồn vào trong phn mm FTP ca h. 3QunlýkênhdliuFTP,ktnikênhdliudngchđng(mcđnh)và bđngcùngvivicsdngcng KênhđiukhinđưctoragiaServerPIvàUserPIsdngquátrìnhthitlpkt nivàchngthcđưcduytrìtrongsutphiênktniFTP.Cáclnhvàcáchiđáp đưctraođigiabphnPI(ProtocolInterpreter)quakênhđiukhin,nhưngd liuthìkhơng. Mikhicnphitruyndliugiaservervàclient,mtkênhdliucnphiđưc tora.KênhdliuktnibphnUserDTPviServerDTP.Ktninàycnthit 78
  25. chochotđngchuynfiletrctip(gihocnhnmtfile)cũngnhưđivivic truyndliungm,nhưlàyêucumtdanhsáchfiletrongthưmcnàođĩtrên server. ChunFTPchđnhhaiphươngthckhácnhauđtorakênhdliu. Khácbit chínhcahaiphươngthcđĩlàmtthitb:phíaclienthayphíaserverlàphíađã đưarayêucukhitoktni.ðiunàynghequacĩvkháđơngin,nhưngkỳthc nĩlikháquantrng. Ktnikênhdliudngchđng Phươngthcđutiênđơikhicịnđưcgilàktnikênhdliudngthơngthưng (vìnĩlàphươngphápmcđnh)vàđơikhiđưcgilàktnidngchđng(đđi chiuvidngktnibđngmàtasxétphnsau).Trongdngktninày,phía ServerDTPkhitoknhdliubngvicmmtcngTCPchophíaUserDTP. Phíaserversdngcngđưcdànhriêng,làcng20chokênhdliu.Trênmáy client,mtgiátrcngđưcchntheomcđnhchínhlàcngđưcsdngđivi kênhđiukhin,tuynhiênphíaclientsluơnchnhaicngriêngbitchohaikênh này. GisphíaUserPIthitlpmtktniđiukhintcngbtkỳcanĩlà1678ti cngđiukhintrênserverlàcng21.Khiđĩ,đ to mt kênh dliu cho vic truyndliu,phíaServerPIsbáochophíaServerDTPkhitomtkênhktni TCPtcng20ticng1678caphíaclient.Saukhiphíaclientchpnhnkênh đưckhito,dliusđưctruynđi. Thct,vicsdngcùngmtcngchockênhdliuvàkênhđiukhinkhơng philàmtýhay,nĩlàmchohotđngcaFTPtrnênphctp.Dođĩ,phíaclient nênchđnhsdngmtcngkhácbngvicsdnglnhPORTtrưckhitruynd liu.Víd:gisphíaclientchđnhcng1742vilnhPORT.PhíaServerDTPsau đĩstoramtktnitcng20canĩticng1742phíaclientthayvìcng1678 nhưmcđnh.Quátrìnhnàyđưcmơttronghìnhdưiđây. 79
  26. Thơngthưng,đivikênhdliuFTP,phíaserverskhitovictruyndliu bngcáchmktnidliuticlient. Trongtrưnghptrên,phíaclienttrưctiênsđưaralnhPORTđyêucuservers dngcng1742.Sauđĩ,serversmktnikênhdliutcng20mcđnhcanĩ ticng1742phíaclient.Dliusauđĩsđưctruyngiacácthitbquacáccng này. Ktnikênhdliudngbđng Phươngphápktipđưcgilàktnidliudngbđng.Phíaclientsnhn serverlàphíabđng,làmnhimvchpnhnmtyêucuktnikênhdliuđưc khitotphíaclient.ServertrliliphíaclientviđachIPcũngnhưđach cngmànĩssdng.PhíaServerDTPsauđĩslngnghemtktniTCPtphía UserDTPtrêncngnày. Mcđnh,phíaclientsdngcùngmtcngđivichaikênhđiukhinvàdliu nhưtrongtrưnghpktnichđngtrên.Tuynhiên,đây,mtlnnaphía clientcĩthchnsdngmtgiátrcngkhácchokênhdliu.Tasxétlivíd trênmtlnna,vicngđiukhinphíaclientlà 1678 ti cng 21 phía server. 80
  27. Nhưnglnnàytruyndliutheophươngthcktnibđng,nhưmơttronghình dưiđây: PhíaclientssdnglnhPASVđyêucuserverrngnĩmundùngphươngthc điukhindliubđng.PhíaServerPIstrliliphíaclientvimtgiátrcng màclientssdng,tcng2223trênnĩ.SauđĩphíaServerPIshưngchophía ServerDTPlngnghetrêncng2223.PhíaUserPIcũng shưngchophíaUser DTPtomtphiênktnitcng1742phíaclientticng2223phíaserver.Saukhi Server chp nhn kt ni này, d liu bt đu đưc truyn đi. Cácvnđvtínhhiuquvàtínhbomttrongvicchnmtphươngthckt ni Vnđphíanàolàphíakhitoktnikênhdliuđưaramtcâuhi:skhácnhau giahaiphươngthclàgì?ðiunàycũnggingnhưvichiaiđãthchinmt cucđinthoinib.Câutrlilàsbomt.VicFTPsdngnhiuhơnmtkt niTCPcĩthgiiquytcácvnđvphnmmcũngnhưvphncngmàngưi dùng cn phi cĩ đ đm bo s an tồn cho h thng ca h. Khixemxétvicgìsxyratrongtrưnghpkênhdliuchđngnhưtrongvíd phíatrên: 81
  28. ðiviphíaclient,cĩmtkênhktniđiukhinđưcthitlptcng1678client ticng21server.Nhưngkênhdliuliđưckhitotphíaserver.Dođĩ,client snhnđưcmtyêucuktniticng1678(hoccngnàokhác).Mtsclient snghingvvicnhnđưcnhngktnitinhưvy,vìtrongtìnhhungthơng thưng,clientmilàphíakhitoktnichkhơngphiđáptrktni.Docáckênh ktniTCPhưngticĩthmangtheonhngmiđedanhtđnh,mtsclientcĩ th s ngăn chn các lung kt ni hưng ti bng vic s dng tưng la. Tisaongưitalikhơnglàmchophíaclientluơnchpnhnktnitmtchs portđưcdùngtrongkênhđiukhin?Vnđđâylàvìclientthưngdùngcáccng khácnhauchomiphiênktnibngvicsdngcâulnhPORT.Vàtisaođiu nàyliđưcthchin?VìtheolutTCP:saukhimtktniđưcđĩngli,cĩmt khongthigiantrngtrưckhicngđĩcĩthđưcsdngli–điunàyđngăn ngatìnhtrngcácphiênktniliêntipblnvinhau.ðiunàystorađtrkhi ginhiufile–dođĩphíaclientthưngdùngcácgiátrcngkhácnhauchomikt ni.ðiunàyrthiuqunhưngcũngdntivicfirewallcaclientshicĩchp nhn phiên kt ni ti vi nhiu giá tr cng khơng n đnh hay khơng. Vicdùngktnikiukênhgiántipsgimthiuvnđnàymtcáchhiuqu. Phnlncáctưnglacĩnhiuvnđliênquantiktnihưngvvicácgiátr cngbtkỳ,hơnlàgpvnđvicácktnihưngđi.Tacĩthxemchitithơnv vnđnàytrongchunRFC1579.Chunnàykhuynnghrngphíaclientnêns dngktnikiubđnglàmdngmcđnhthayvìsdngkiuktnidngch đng cùng vi lnh PORT, đ ngăn chn tình trng block theo cng. Ttnhiên,phươngthcktnikiubđngkhơnghồntồngiiquytđưcvnđ, chúngchđyvnđvphíaservermàthơi.Phíaserver,giđâyphiđimtvivic cĩnhiukênhktnihưngvtrênhànglotcáccngkhácnhau.Tuynhiênvicx lýcácvnđbomttrênmtnhĩmnhservervndhơnnhiusovivicphiđi mtvimtlưnglncácvnđtnhiuclient.FTPserverphiđưccuhìnhchp nhnphươngthctruynbđngtclient,dođĩcáchthơngthưngđthitlptrên serverlàthitlpchpnhnmtscngktnihưngvtrênservertrongkhivn khĩacácyêucuktnihưngvtrêncáccngkhác. 4CácphươngthctruyndliutrongFTP KhikênhdliuđãđưcthitlpxonggiaServerDTPviUserDTP,dlius đưctruyntrctiptphíaclienttiphíaserver,hocngưcli,datheocáclnh 82
  29. đưcsdng.Dothơngtinđiukhinđưcgiđitrênkênhđiukhin,nêntồnb kênhdliucĩthđưcsdngđtruyndliu.(Ttnhiên,haikênhlogicnày đưckthpvinhaulpdưicùngvittccácktniTCP/UDPkhácgiahai thitb,dođĩđiunàykhơnghnđãcithintcđtruyndliusovikhitruyn trênchmtkênh–nĩchlàmchohaivictruyndliuvàđiukhintrnênđc lpvinhaumàthơi) FTPcĩbaphươngthctruyndliu,nêulêncáchmàdliuđưctruyntmt thitbtithitbkháctrênmtkênhdliuđãđưckhito,đĩlà:streammode, blockmode,vàcompressedmode Streammode Trongphươngthcnày,dliuđưctruynđidưidngcácbytekhơngcutrúcliên tip.Thitbgichđơnthunđylungdliu quaktniTCPtiphíanhn. Khơngcĩmttrưngtiêuđnhtđnhđưcsdngtrongphươngthcnàylàmcho nĩkhákhácsovinhiugiaothcgidliurirckhác.Phươngthcnàychyu davàotínhtincytrongtruyndliucaTCP. Do nĩkhơngcĩcutrúcdng header,nênvicbáohiuktthúcfilesđơnginđưcthchinvicphíathitbgi ngtkênhktnidliukhiđãtruynxong. Trongsbaphươngthưc,streammodelàphươngthcđưcsdngnhiunhttrong trinkhaiFTPthct.Cĩmtslýdogiithíchđiuđĩ.Trưcht,nĩlàphương thcmcđnhvàđơnginnht,dođĩvictrinkhainĩlàddàngnht.Thhai,nĩ làphươngphápphbinnht,vìnĩxlývicácfileđuđơnthunnhưlàxlýdịng byte,màkhơngđýtinidungcacácfile.Thba,nĩlàphươngthchiuqunht vì nĩ khơng tn mt lưng byte “overload” đ thơng báo header. Blockmode ðâylàphươngthctruyndliumangtínhquychunhơn,vivicdliuđưc chiathànhnhiukhinhvàđưcđĩnggĩithànhcácFTPblocks.Miblocknàycĩ mttrưngheader3bytebáohiuđdài,vàchathơngtinvcáckhidliuđang đưcgi.Mtthuttốnđcbitđưcsdngđkimtracácdliuđãđưctruyn đi và đ phát hin, khi to li đi vi mt phiên truyn d liu đã b ngt. Compressedmode ðâylàmtphươngthctruynsdngmtkthutnénkháđơngin,là“runlength encoding”–cĩtácdngpháthinvàxlýcácđonlptrongdliuđưctruynđi 83
  30. đgimchiudàicatồnbthơngđip.Thơngtinkhiđãđưcnén,sđưcxlý nhưtrongblockmode,vitrưngheader.Trongthct,vicnndliuthưngđưc sdngnhngchkhác,làmchophươngthctruynkiucompressedmodetr nên khơng cn thit na. Ví d: nu bn đang truyn đi mt file qua internet vi modemtươngt,modemcabnthơngthưngsthchinvicnénlp1;cácfile lntrênFTPservercũngthưngđưcnénsnvimtsđnhdngnhưZIP,làmcho vicnéntiptckhitruyndliutrnênkhơngcnthit. 3.4.2.CàiđtFTPClient/Server TrêncơsgiaothcFTPchúngtathchincàiđtFTPClient/Serverđminhha chogiaothc ChươngtrìnhSimpleFTPServer: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.IO; usingSystem.Net; usingSystem.Net.Sockets; classProgram{ staticvoidMain(string[]args){ stringrootDir="C:/MyFTP"; IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2121); TcpListenerserver=newTcpListener(iep); server.Start(); TcpClientclient=server.AcceptTcpClient(); StreamReadersr=newStreamReader(client.GetStream()); StreamWritersw=newStreamWriter(client.GetStream()); sw.WriteLine("220ChaomungketnoitoiMyFTP"); sw.Flush(); while(true){ stringrequest=sr.ReadLine(); stringcommand=""; if(request.Length!=0)command=request.Substring(0,4); switch(command.ToUpper().Trim()){ case"USER":{ sw.WriteLine("331.Nhappassvao"); sw.Flush(); //sw.Close(); Console.WriteLine(request); break; } case"PASS":{ sw.WriteLine("230.Dangnhapthanhcong"); sw.Flush(); Console.WriteLine(request); break; } 84
  31. case"MKD":{ stringfolderName=request.Substring(4,request.Length4); folderName=rootDir+"/"+folderName.Trim(); try{ Directory.CreateDirectory(folderName); sw.WriteLine("150Taothumucthanhcong"); sw.Flush(); }catch(IOException){ sw.WriteLine("550Taothumuccoloi"); sw.Flush(); } break; } case"RETR":{ stringfileName=request.Substring(4,request.Length4); fileName=rootDir+"/"+fileName.Trim(); try{ if(File.Exists(fileName)){ //Guinoidungfilevechoclientxuly sw.WriteLine("150TruyenFilethanhcong"); sw.Flush(); FileStreamfs=newFileStream(fileName,FileMode.Open); longtotalLenght=fs.Length; byte[]data=newbyte[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("550Filekhongtontaitrenserver"); sw.Flush(); } }catch(IOException){ sw.WriteLine("550Khongtruyenduocfile"); sw.Flush(); } break; } case"STOR":{ stringfileName= request.Substring(request.LastIndexOf("/"),request.Lengthrequest.LastIndexOf("/")); fileName=rootDir+"/"+fileName.Trim(); try{ FileStreamfs=newFileStream(fileName,FileMode.CreateNew); longtotalLength=sr.Read(); byte[]data=newbyte[totalLength]; char[]kt=Encoding.ASCII.GetChars(data); 85
  32. intsobyte=sr.Read(kt,0,data.Length); fs.Write(data,0,sobyte); fs.Close(); sw.WriteLine("150Upfilethanhcong"); sw.Flush(); }catch(IOException){ sw.WriteLine("550Khongtruyenduocfile"); sw.Flush(); } break; } case"QUIT":{ client.Close(); break; } default:{ sw.WriteLine("Sailenh"); sw.Flush(); break; } } } } } ChươngtrìnhSimpleFTPClient: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.IO; usingSystem.Net; usingSystem.Net.Sockets; namespaceFtpClient{ classProgram{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2121); TcpClientclient=newTcpClient(); client.Connect(iep); StreamReadersr=newStreamReader(client.GetStream()); StreamWritersw=newStreamWriter(client.GetStream()); Console.WriteLine(sr.ReadLine()); stringinput; stringcommand=""; Console.WriteLine("DangnhapbangUSERTenuser,PASSTenpassword"); Console.WriteLine("TaothumucbangMKDtenthumuccantao"); Console.WriteLine("UploadbangcachSTORtenfile"); Console.WriteLine("DownloadbangcachRETRtenfile"); while(true){ input=Console.ReadLine(); 86
  33. command=input.Substring(0,4).Trim().ToUpper(); switch(command){ case"STOR":{ //Docfileguichoserver sw.WriteLine(input); sw.Flush(); FileInfofl=null; try{ fl=newFileInfo(input.Substring(4,input.Length4).Trim()); }catch(IOException){ Console.WriteLine("Filekhongtontai"); } longtotalLength=fl.Length; FileStreamfs=fl.OpenRead(); sw.Write(totalLength); byte[]data=newbyte[totalLength]; intbytes=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(); strings=sr.ReadLine(); Console.WriteLine(s); if(s.Substring(0,3).Equals("150")){ Console.Write("Nhapvaonoiluutep:"); stringfilename=Console.ReadLine(); FileStreamfs=newFileStream(filename,FileMode.CreateNew); //Doctepve; longtotalLength=sr.Read(); byte[]data=newbyte[totalLength]; char[]kt=newchar[data.Length]; intsobyte=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
  34. } } if(input.ToUpper().Equals("QUIT"))break; } sr.Close(); sw.Close(); client.Close(); } } } 3.5.DNS(DomainNameServer) 3.5.1.Vnđphângiitênmin DomainNameSystem:  Làhcơsdliuphântánhotđngcĩthbcbicácnameservers  Làgiaothctngngdng: host,routersyêucutinameserversđxácđnh tênmin(ánhxđach tênmin)  Note:làmtchcnăngcaInternet,hotđngnhưlàgiaothctng ngdng  Rtphctp. Q: ÁnhxgiađachIPvàtên?  TisaokhơngtptrungskimsốtcaDNS?  ðimhngduynhtnunameserver“cht”thìcmngInternets “cht”theo.  Tnđưngtruyn.  Cơsdliutptrungs“xa”viđasvùng  Botrìphctp.  Phichiađtr !  KhơngcĩservernàocĩthlưutồnbđưctênminvàđachIP tươngng  localnameservers:  MiISP,cơngtycĩ local(default)nameserver  CâuhitruyvncahostvDNSsđưcchuyntilocalnameserver  Chcnăngcanameserver:  ðivihost:lưuđachIPvàtênmintươngngcahost  CĩthtìmtênminngviđachIPvàngưcli  ðưcyêucubicáclocalnameserverkhơngthxácđnhđưctên.  rootnameserver:  ðưcyêucunucĩauthoritativenameserverkhơngxácđnh.  Nhnvàxlýmapping  Trvmappingcholocalnameserver 88
  35. a NSI Herndon, VA c PSInet Herndon, VA k RIPE London d U Maryland College Park, MD i NORDUnet Stockholm g DISA Vienna, VA h ARL Aberdeen, MD j NSI (TBD) Herndon, VA 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 mun bit đa ch IP ca gaia.cs.umass.edu 2 4 5 3 1. Yêu cu ti local DNS server, dns.eurecom.fr 2. dns.eurecom.fr yêu cu ti root name server nu local name server authorititive name server cnthit dns.eurecom.fr dns.umass.edu 3. root name server yêu cu 1 6 authoritative name server, dns.umass.edu, nu cn thit. requesting host gaia.cs.umass.edu surf.eurecom.fr 89
  36. Rootnameserver: 2 6  Cĩ th khơngbit 7 3 authoritativename server  Cĩ th bit name local name server servertrunggian intermediate name server dns.eurecom.fr ,nhđĩ cĩ th yêu dns.umass.edu 4 5 cutìmauthoritative 1 8 nameserver authoritative name server dns.cs.umass.edu requesting host surf.eurecom.fr gaia.cs.umass.edu DNSexample TruyvntrongDNSđưcchiathànhcácloinhưsau: Truyvnđ quyquery: 2 iterated query  Name server lànơiphângi i 3 đach/tên.Nu nĩ khơng phân giitrongnib,nĩ s giyêu 4 cuđnnameserverkhác. 7  Cơngviccanameserverliu local name server intermediate name server cĩ quá nng? dns.eurecom.fr dns.umass.edu Truyvntươngtác: 5 6 1 8  Nu khơng phân gii đưc đa ch IP/name,nameservers gi authoritative name server trthơngđi prng“Tơikhơng dns.cs.umass.edu bit,hãy th hi anh bn cnh requesting host tơi là A”.A làđ a ch IP ca surf.eurecom.fr nameserverk tipnĩ. gaia.cs.umass.edu CutrúcbnghiDNSnhưsau: 90
  37. DNS: cơs d liuphântánlưucácbnghingun (RR) ðnhdngcaRR: (name,value,type,ttl)  Type=A  Type=CNAME  name :hostname  name :tênbí danhchomttên  value :IPaddress thcnàođĩ :e.g www.ibm.com  Type=NS là tênbí danhca servereast.backup2.ibm.com  name :domain(e.g.foo.com)  value :là tênthc  value :đach IP authoritativenameservercho  Type=MX tênminđĩ  value :têncamailserver 3.5.2.TrinkhaiDNSMX(MailExchange) Chúngtađivitchươngtrìnhchophéplyvthơngtincamailserver usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Net; usingSystem.Net.Sockets; publicpartialclassForm1:Form{ publicForm1(){ InitializeComponent(); } privatevoidbtFind_Click(objectsender,EventArgse){ byte[]DNSQuery; byte[]DNSReply; UdpClientdnsClient=newUdpClient(tbServer.Text,53); DNSQuery=makeQuery(DateTime.Now.Millisecond* 60,tbDomain.Text); dnsClient.Send(DNSQuery,DNSQuery.GetLength(0)); IPEndPointendpoint=null; DNSReply=dnsClient.Receive(refendpoint); this.tbStatus.Text=makeResponse(DNSReply,tbDomain.Text); } publicbyte[]makeQuery(intid,stringname){ byte[]data=newbyte[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
  38. 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(newchar[]{'.'}); stringlabel; intposition=12; for(intj=0;j<tokens.Length;j++){ label=tokens[j]; data[position++]=(byte)(label.Length&0xFF); byte[]b=System.Text.Encoding.ASCII.GetBytes(label); for(intk=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=newbyte[position+1]; for(inti=0;i<=position;i++){ Query[i]=data[i]; } returnQuery; } publicstringmakeResponse(byte[]data,stringname){ intqCount=((data[4]&0xFF)<<8)|(data[5]&0xFF);intaCount=((data[6] &0xFF)<<8)|(data[7]&0xFF); intposition=12; for(inti=0;i<qCount;++i){ name=""; position=proc(position,data,refname); position+=4; } stringResponse=""; for(inti=0;i<aCount;++i){ name=""; position=proc(position,data,refname); position+=12; name=""; position=proc(position,data,refname); Response+=name+"\r\n"; } returnResponse; } privateintproc(intposition,byte[]data,refstringname){ intlen=(data[position++]&0xFF); if(len==0){ returnposition; } intoffset; 92
  39. do{ if((len&0xC0)==0xC0){ if(position>=data.GetLength(0)){ return1; } offset=((len&0x3F) data.GetLength(0)){ return1; } name+=Encoding.ASCII.GetString(data,position,len); position+=len; } if(position>data.GetLength(0)){ return1; } len=data[position++]&0xFF; if(len!=0){ name+="."; } } while(len!=0); returnposition; } } 3.6Tholunvcácngdngkhácthưnggp 3.7Bàitpápdng 93
  40. CHƯƠNG4:XÂYDNGNGDNGNHIULP 4.1.Mơhình2lp(twotier),3lp(threetier)vànlp. Trưcđây,đivicácphnmmcĩsdngliênquanđndliu,thưngkhilàm ngưilptrìnhthưngtíchhpvicgiaotipvingưisdng,xlýrighixung dliutrêncùngmtform(đâylàmơhìnhmtlp).Nhưngtrongkintrúc3lp(mơ hình3lp),phicĩvicphânbitrchrịigiacáclpnày.Mơhình3lpcĩth đưcmơtnhưsau: Lpthnht:Lpgiaodin(giaotipvingưisdng):chthunxlývicgiao tipvingưisdng,nhpxut, màkhơngthchinvictínhtốn,kimtra,x lý,haycácthaotácliênquanđncơsdliu. Lpthhai:Lpxlý:Lpnàychuyênthchincácxlý,kimtracácràng buc,cácquitcngxcaphnmm,cácchcnăngctyu, Victhchinnày đclpvicáchthitkcũngnhưcàiđtgiaodin.Thơngtincholpnàythchin cácxlýcamìnhđưclytlpgiaodin. Lpthba:Lpdliu:Lpnàychuyênthchincáccơngvicliênquanđnd liu.Dliucĩthlytcơsdliu(Access,SQLServer )hoctptin(text, binary,XML ).ðivicơsdliu,lpnàythchinktnitrctipvicơs dliuvàthchinttccácthaotácliên quanđncơsdliumàphnmmcn thit.ðivitptin,lpnàythchinvicđc,ghitptintheoyêucucaphn mm.Victhchinnàydolpxlýgi. 94
  41. Rõràng,vimơhìnhnày,cáccơngviccatnglplàđclpvinhau.Vic thayđimtlpkhơnglàmthayđicáclpcịnli,thuntinhơnchoquátrình pháttrinvàbotrìphnmm. Mtslưuý:  PhânbitvaitrịBusinessLayervàkháinim“xlý”  MiLayervncĩxlýriêng,đctrưngcaLayerđĩ  ðơikhivicquytđnh1xlýnmlayernàochmangtínhchttươngđi Chúngtacũngcnphânbitkháinim3tiervà3layer:3tierlàmơhình3lp vtlýcịn3layerlàmơhìnhlogic. Presentation Browser GUI Local Web Physical viewPhysical Logical viewLogical Web Application Web Business logic Business tier Data Access Data tier Data Vídminhha: Xâydngchươngtrìnhtínhtng2phânstheokintrúc3lp.Theođĩd liucaphânsđưcđclênttptinXML,ktqusaukhiđưctínhsđưcghi xungtptinXML. Cáchlàmthơngthưnglàmivicđuđưcđyvàotrong1formvàxlý trctiptrongformđĩ.Tuynhiên,khicĩsthayđixyravgiaodin,xlý,hay dliuthìvicchnhsakhákhĩkhăn.Dovy,vicxâydngtheokintrúc3lps khcphcnhưcđimnày. Kintrúccachươngtrìnhnhưsau: 95
  42. Xâydnglpthhinphâns(TH_PHANSO) SdngUserControlđcàiđtchoTH_PHANSO.ThêmUserControlvàoproject bngcáchchnProject>AddUserControl.ðttênUserControlđĩ. TacĩTH_PHANSO.cs 96
  43. DothhintsvàthhinmusđulàTextBoxdođĩtronglpTH_PHANSO cnthitlpcácpropertieslàtusovàmausocĩkiuint. publicinttuso{ set{ this.txtTuSo.Text=value.ToString(); } get{ returnint.Parse(this.txtTuSo.Text); } } publicintmauso{ set{ this.txtMauSo.Text=value.ToString(); } get{ returnint.Parse(this.txtMauSo.Text); } } Lplưutrphâns(LT_PHANSO) TptinXMLlưutrcĩđnhdngnhưsau: 5 3 ðthchinvicđcvàghidliuXMLtasdngDOM. Khaibáotusovàmausođthchinviclưutr publicinttuso; publicintmauso; Thchincàiđthàmkhitomcđnhvithamstruynvàolàđưngdnfile XML publicLT_PHANSO(stringstrFilename) { // //TODO:Addconstructorlogichere // XmlDocumentdoc=LT_XML.DocTaiLieu(strFilename); if(doc==null) { tuso=0; 97
  44. mauso=0; return; } XmlElementele=doc.DocumentElement; tuso=int.Parse(ele.SelectSingleNode("Tu_so").InnerText); mauso=int.Parse(ele.SelectSingleNode("Mau_so").InnerText); } ThchincàiđthàmghiphânsvithamstruynvàolàđưngdnfileXML publicvoidGhiPhanSo(stringstrFilename) { XmlDocumentdoc=newXmlDocument(); XmlElementroot=doc.CreateElement("PHANSO"); doc.AppendChild(root); XmlElementele_Tuso= root.OwnerDocument.CreateElement("Tu_so"); ele_Tuso.InnerText=this.tuso.ToString(); root.AppendChild(ele_Tuso); XmlElementele_Mauso= root.OwnerDocument.CreateElement("Mau_so"); ele_Mauso.InnerText=this.mauso.ToString(); root.AppendChild(ele_Mauso); LT_XML.GhiTaiLieu(strFilename,doc); } LplưutrXML(LT_XML) VicloadvàsaveXmlDocumentđưctáchrathànhmtlpriênglàlpLT_XML publicstaticXmlDocumentDocTaiLieu(stringstrFilename){ XmlDocumentkq=newXmlDocument(); try{ kq.Load(strFilename); } catch{ returnnull; } returnkq; } publicstaticvoidGhiTaiLieu(stringstrFilename,XmlDocumentdoc){ try{ doc.Save(strFilename); } catch{ } } Lpxlýphâns(XL_PHANSO) 98
  45. Lpnàysthchincàiđtcáchàmliênquanđnxlývàtínhtốntrênphâns nhưđnhnghĩaphépcng2phâns,rútgnphânshaycpnhtgiátrtđitưng thhin. Khaibáo2đitưnglnlưtthucvlpLT_PHANSOvàTH_PHANSOđgiúp toliênktvitngxlývi2tngcịnlilàtngdliuvàtnggiaodin. privateLT_PHANSOlt_ps=null; privateTH_PHANSOth_ps=null; Càiđthàmkhitomcđnhđtoliênktviđitưngthhinvàđitưngx lý publicXL_PHANSO(LT_PHANSOlt_ps,TH_PHANSOth_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; } Càiđtphươngthcghi publicvoidGhi(stringstrFilename) { this.lt_ps.tuso=this.th_ps.tuso; this.lt_ps.mauso=this.th_ps.mauso; this.lt_ps.GhiPhanSo(strFilename); } Càiđttốnt+ publicstaticXL_PHANSOoperator+(XL_PHANSOps1,XL_PHANSOps2) { XL_PHANSOkq=newXL_PHANSO(newLT_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; returnkq; } Càiđthàmcpnhttđitưngxlýphânskhác publicvoidCapNhat(XL_PHANSOps) { this.th_ps.tuso=ps.th_ps.tuso; this.th_ps.mauso=ps.th_ps.mauso; } Càiđthàmrútgnphâns publicvoidRutGon() { inttuso=this.th_ps.tuso; intmauso=this.th_ps.mauso; intmaxUC=TimMaxUocChung(tuso,mauso); tuso=tuso/maxUC; mauso=mauso/maxUC; 99
  46. this.th_ps.tuso=tuso; this.th_ps.mauso=mauso; } ðrútgntacntínhưcchunglnnht,cĩthcàiđthàmnàychungvilp XL_PHANSO publicintTimMaxUocChung(inta,intb) { while(a!=b) { if(a>b) a=b; else b=a; } returna; } Thchincàiđtmànhìnhchính(MainFrm) Trongformchínhsthchinkhaibáo3đitưngxlýphâns privatePhanSo.XL_PHANSOxl_PhanSo1; privatePhanSo.XL_PHANSOxl_PhanSo2; privatePhanSo.XL_PHANSOxl_PhanSo3; Thchinkhito3đitưngxlýphânsvakhaibáo publicMainFrm() { // //RequiredforWindowsFormDesignersupport InitializeComponent(); xl_PhanSo1=newXL_PHANSO(newLT_PHANSO("phanso1.xml"), tH_PHANSO1); 100
  47. xl_PhanSo2=newXL_PHANSO(newLT_PHANSO("phanso2.xml"), tH_PHANSO2); xl_PhanSo3=newXL_PHANSO(newLT_PHANSO(""),tH_PHANSO3); } Vithàmxlýchocácnútchcnăngtrênform: HàmxlýchonútCng privatevoidbtnCong_Click(objectsender,System.EventArgse) { XL_PHANSOkq=xl_PhanSo1+xl_PhanSo2; xl_PhanSo3.CapNhat(kq); xl_PhanSo3.Ghi(“ketqua.xml”); xl_PhanSo3.RutGon(); } HàmxlýchonútThoat privatevoidbtnThoat_Click(objectsender,System.EventArgse) { this.Close(); } Tocáctptinphanso1.xml,phanso2.xml,cĩđnhdngnhưvídtrên. Thchinbiêndchvàchythchươngtrình. Nhnxét: Thchincàiđtvikintrúc3lpsgiúpchươngtrìnhddàngthayđi,táis dnglichươngtrình. Víd: TH_PHANSOkhơngthhintsvàmusbngTextBoxnamàthaybng controlkhác(vídnhưMyControlthìcũngkhơngnhhưng,lúcđĩchcnthayđi codetrongphnpropertytsvàmusmàthơi. publicinttuso{ set{ this.MyControl.Value=value.ToString(); } get{ returnint.Parse(this.MyControl.Value); } } publicintmauso{ set{ this.MyControl.Value=value.ToString(); } get{ returnint.Parse(this.MyControl.Value); } } KhikhơnglưutrbngXMLmàchuynsangdùngcơsdliuthìtachcnthay codephnLT_PHANSO,màkhơngcnthayđicodephnTH_PHANSO,cũngnhư XL_PHANSO. 101
  48. Chúý: Khơngphthucphươngpháplptrình. Minghipvkhơngnhtthitchđưcgiiquytbi3đitưng. Khơnglàmtkintrúc“siêuvit”. 4.2.Remoting 4.2.1.GiithiuvRemoting .NETRemotinglàgì? Trưcht.NETRemotinglàmtkĩthut.NETđưcgiithiut.NETframework 1.1.Cùngvi.NETWebservice,.NETremotinglàlachnchogiiphápxlýtính tốntxa..NETRemotinglàmtkĩthutchophépmtđitưngnàytruyxutđn mtđitưngkhácnmcác ApplicationDomain khácnhau.Vànugiithíchtheo kiubìnhdân,tacĩthsdng.NETRemotingđgimtchươngtrìnhhocmt servicechytrênmtmáyvitínhkhácđxlýmtcáigìđĩvàtrktqutínhtốn lichota. Hình4.1: .NETRemotingOverview .NETRemotingvàDistributedCOM Vàonămmtngànchíntrămhiđĩ,ngưitathưngthchinvicgiaotipgia cácprocessbngcáchsdngDistributedCOMhaycịngilàDCOM.DCOMđãrt huíchchonhngchươngtrìnhchytrêncácmáytínhcùngloivànmtrongcùng mt mng.Tuy nhiên,DCOM trnênlithivìnĩkhơng th chy trên Internet. DCOMdatrênmttpgiaothcmàkhơngphiobjectnàocũnghtrvàđiunày khinDCOMkhơngchyđưctrênnhngplatformkhácnhau.Ngồira,DCOMs dngnhiuporttrongkhicácportythưngbchnbifirewall.Ttnhiênmnhng portđĩđnĩhotđngđưckhơngkhĩnhưngđĩlàmttrongnhngphinphc. .NETRemotingkhcphcnhngyukémcaDCOMbngcáchhtrnhiugiao thckhácnhau. .NETRemotingvàWebServices VkhíacnhxlýtxathìWebServiceshồntồntươngtnhư.NETRemoting. Thmchíngưitacĩthlàmcho.NETRemotingtrthành1WebServicesbngcách 102
  49. hostnĩtrongIIS.WebServiceschophépcácngdngcĩthgiaotipvinhaumà khơngphthucplatform,ngơnnglptrình, TuynhiênWebServiceslàmtmơi trưng“stateless”,cĩnghĩalànĩkhơnglưulibtkìtrngtháigìcalngitrưcvà nĩcũngkhơngbitgìvphíaclientđangthchinrequest. Clientvàserver Web ServiceschcĩthtraođivinhaubngcácthơngđipSOAP.Nhngđiusauđây làcácđimkhácnhauchínhgia.NET Remotingvà Web Serices, chúng cũng là nhngnhântđtachnlagia2cơngnghnày: •ASP.NETWebServiceschcĩthđưctruyxutquaHTTPcịn.NETRemotingcĩ thđưcdùngtrênnhiugiaothckhácnhaunhưTCP,HTTP. •WebServiceslàmtmơitrưngstateless.Khicĩmtrequesttphíaclient,scĩ mtobjectmiđưctorađthchinrequestđĩtrênserver.Cịn.NETRemoting lihtrnhiulachnstatemanagementvàcĩththchinnhiurequesttmt client,đngthicĩhtrcallbacks. •WebServicesserializecácđitưngthànhXMLbêntrongSOAPmessagevàvìth cĩthtruyntithơngtincabtcthànhphnnàomincĩthchuynthànhXML. Cịnđivi.NETRemotingthìtùygiaothcvàđnhdngmessagemànĩcĩth truynđithơngtinnhưthnào.Ngồiratheonhưgiithiuthì.NETRemotingcĩ chophépđitưngđưctruynvàotheockiuthamchiu(reference)vàthamtr (value) •Webservicescĩthhotđngtrêncácplatformmơitrưngkhácnhautrongkhi .NETRemotingyêucuphíaclientsphilà.NETapplication. Channels Trongkĩthut.NETRemotingthìChannelđưchiunhưlàmtkênhđgiaotip giaclientvàserver.MtobjecttclientsthơngquaChannelđgiaotipviobject phíaserver,Channelstruyntinhngmessagethaiphía.Nhưgiithiuphíatrên thìcĩhaichannelchínhlàTcpChannelvàHttpChanneltươngngvicácgiaothc TCPvàHTTP.Ngồira,TcpChannelvàHttpChannelđucĩkhnăngextendthành nhngCustomChannelcabn. Làm sao đ to mt Object cĩ th Remote đưc trong .NET Remoting? MtObjectremoteđưcchlàmtobjectthơngthưngnhưngphiđưcinheritt MarshalByRefObject. ðon code sample hình 4.2 là mt ví d đơn gin v RemotableObject.ðitưngSampleObjecttronghìnhcĩmtsmethodđơngintr vphéptínhtng,hiu,tích,thươngcahaisnguyên.Giátrtrvcahàmlàkiu snguyên,kiubuiltinca.NETframework.Nubnmuntrvkiudliubnt đnhnghĩa,hocmtinstancecaclassbnđnhnghĩathìlpđĩcabnphiđưc khaibáoviattributeSerializable. using System; public class SampleObject: MarshalByRefObject { public int Add(int a, int b) { int c = a + b; 103
  50. 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; } } Hình4.2: RemotableObjectSample TochươngtrìnhServerđhostRemotableObject Ktip,chúngtacntoramtchươngtrìnhserverđlngnghenhngrequestt phíaclient.TrongvídnàychúngtassdngTCP/IPchannel.ðutiênchúngta tomtinstancechannelvàđăngkímtporttươngngchonĩ.KhicĩmtRequestt phía client, server s nhn request đĩ và Remote Object ca chúng ta s thc thi Requestnày.Trong.NETRemoting,cĩhaicơchđtoinstancecaRemoteObject ritđĩthcthirequest:SingletonvàSinglecall.Tùyvàomcđíchsdng,nhucu ca chương trình mà server ca bn cĩ th khai báo theo cơ ch WellKnownObjectMode.SingleCall,hayWellKnownObjectMode.Singleton.Khikhai báoSingleton,RemoteObjectsđưcsinhra,thcthirequest,replyliphíaclientvà sauđĩ,objectnàyvnđưclưulichkhơngbhyđi.ðnkhinàoprocesschy chươngtrìnhserverktthúcthìinstancenàymibtrìnhhtrácGarbageCollector htđi.Vàngưcli,khikhaibáolàSingleCall,RemoteObjectsđưckhitovà hyđiđivimilnnhnrequesttphíaclient,cơchnàytươngtnhưmơhình .NETWebServicetruynthng. Nubnmunsdng.NETRemotingtrongIISthìkhơngcntomtchươngtrình server như th này. Và tt nhiên, IIS ch h tr HttpChannel. Nu host 1 .NET RemotingbêntrongIISbnsmcnhiênsdngđưccơchAuthenticationcaIIS, ngưclinulàmmtchươngtrìnhserverđhostnhưtrênthìbnphicàiđtcơch Authenticationcariêngmình.ðhostmtRemoteObjectbêntrongIIS,trưctiên phito1VirtualDirectorychoapplication,sauđĩđtđoncodeđăngkíservicebên trongeventApplication_Start(fileglobal.asax) 104
  51. Trongvídnày,chúngtaskhơngsdngIISmàstomtconsoleapplication. CĩnhiulachnkhikhơngsdngIIS,tacĩthsdngconsoleapplication,Win formapplicationnhưngtrongthct,ngưitassdngmtWindowsServiceđ làm.CịnConsoleapplicationhayWinformApplicationthưngchdùngđminhha. Trongvídnày,chúngtassdngport9999chomaymn.Cĩthmtchương trìnhnàođĩtrongmáycabnđãsdngportnày,nubnhưvybnphichnport khác.Vàsaucùng,đkimtraxemmáybnđanglngnghetrênnhngportnào(port nàođãbsdng)thìtadùnglnh“netstat–a”trongcommandprompt. Cịn bây gi, hãy xem mt console application project vi 1 class tên là SampleSerrver.TrongprojectnàytơiđãthêmreferencetiSystem.Runtime.Remoting vàotrongprojectđnĩcĩthchyđưc. usingSystem; usingSystem.Runtime.Remoting; usingSystem.Runtime.Remoting.Channels; usingSystem.Runtime.Remoting.Channels.Tcp; publicclassServer { publicstaticintMain() { TcpChannelchan=newTcpChannel(9999); ChannelServices.RegisterChannel(chan,false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject) ,"SampleNetRemoting",WellKnownObjectMode.SingleCall); Console.WriteLine("Hit toexit "); Console.ReadLine(); } } Hình4.3: SampleServerhostRemotableObject TochươngtrìnhclientđsdngRemoteObject. Chươngtrìnhclienttrongvídnàycũngkháđơngin,nĩsconnectvàoserver,to mtinstancecaRemoteObjectvàexcutemethodtínhtng,hiu,tích,thương. Cácbnlưuýrngtrongcchươngtrìnhclientvàchương trìnhserverđuphi reference ti class SampleObject. Client s gi method ca instance SampleObject, nhưngserversthcthixlýnĩchkhơngphiphíaclient. usingSystem; usingSystem.Runtime.Remoting; usingSystem.Runtime.Remoting.Channels; usingSystem.Runtime.Remoting.Channels.Http; publicclassClient { 105
  52. publicstaticintMain(string[]argv) { TcpChannelchan=newTcpChannel(); ChannelServices.RegisterChannel(chan,false); SampleObjectobj=(SampleObject)Activator.GetObject( typeof(SampleObject),"tcp://localhost:9999/SampleNetRemoting"); if(obj==null) System.Console.WriteLine("Couldnotlocateserver"); else { inta=Convert.ToInt32(argv[0]); intb=Convert.ToInt32(argv[1]); intc=obj.Add(a,b); Console.WriteLine("a+b={0}",c); c=obj.Subtract(a,b); Console.WriteLine("ab={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(); } } Hình4 : SampleClientApplication Testthchươngtrình Trưctiênchychươngtrìnhserver,bnsthy message“Presstheenterkeyto exit”trongcasconsole.Nhưvyservercabnđanglngnghetrênport9999.Bây gibnhãychychươngtrìnhclientvàsnhìnthyktqutrvtrênmànhình.Bn cĩthchynhiuclientđcùngrequestđn1servernhưngkhơngthchynhiu server.Bncĩthcopychươngtrìnhserversangmtmáycabnmìnhvànhchy th,cịnbnsalichươngtrìnhclient,sa“localhost”thànhIPcamáybnmìnhvà chythđthyktqu. Tĩmtt: VídtrênđãsdngcodeC#đkhaibáocáccuhìnhchoservervàclienttuy nhiên.NETRemotingchophéptacuhìnhtrưctrongfileconfig(App.config).Các bncĩththamkhomtsresourcephíadưiđbitcáchlàm. .NETRemotinglàmttrongnhngkĩthuttinlichonhngchươngtrìnhdng DistributedComputing.CáchsdngnĩphctphơnWebServicetuynhiênnubn 106
  53. muntăngperformancethì.NETRemotingviSingletonvàTCPchannelslàla chnrttt. Visrađica.NETFramework3.x,Microsoftđãgiithiunntngmihơn chocáckĩthutRPC,đĩlàWCFmnhhơn.NETRemotingrtnhiu. 4.2.2.Khaibáo,càiđtvàđăngkýgiaodintxa ðchochươngtrìnhcĩtínhkhchuyncaothayvìngưitaxây dnglp RemoteObjectnhưvídtrênchúngtakhaibáomtgiaodinlàlpRemoteObject vàtrongchươngtrìnhphíaServertascàiđtgiaodinnàyvàđăngkýgiaodint xa.NhưvyđtrinkhaimththngRemotingta cĩ3chươngtrình:Giaodin RemoteObject,chươngtrìnhServertrinkhaigiaodinvàđăngkýgiaodintxa, chươngtrìnhClienttriugiphươngthctxa. Khaibáogiaodintxa Càiđtvàđăngkýgiaodintxa 4.2.3.Triugiphươngthctxa ChươngtrìnhphíaClientchúngtatriugiphươngthcđưccungcpbi giaodintxađãđưcđăngkývàcungcpbiServer 4.3.WebServices 4.3.1.GiithiuvWebServices 1.WebServicelàgì? WebservicelàmtModulchươngtrìnhcungcpchcnăngcacácngdngcho phéptriugivàtruycptxathơngquaInternet.Webservicesdngcácchunca InternetnhưXMLvàHTTP.VicsdngWebservicephthucnhiuvàoschp nhncaXML,mtngơnngmơtdliumidùngđtruyntidliuthơngqua Web. BtkỳmtWebservicenàocũngcĩthđưcsdng,hoclàtrongngdngcc bhoctruycptxaquaInternetbinhiungdng.Docĩkhnăngtruycpqua cácgiaodinchunmàmtWebservicechophépnhiuhthngkhácnhaucùnglàm vicvinhaunhưmttintrìnhduynhttrênWeb. 2.VaitrịcaWebservice Webservicerađiđãmramthưngmichovicpháttrincácngdngtrên Internet.Webservicestmdchlàcácdchvtrênweb.Cơngnghwebservicesra đilàmtcuccáchmnghĩacáchthchotđngcacácdchvB2BvàB2C. Webserviceskthpsdngnhiucơngnghkhácnhauchophéphaingdngcùng ngơnng,đclphđiuhànhtraođiđưcvinhauthơngquamơitrưngmng Internet.Tuynhiênnhngcơngnghsdngđâykhơngnhtthitphilànhng cơngnghmi.ðâylàđimkhácbitcawebservicessovicáccơngnghkhác,đĩ chínhlàkhnăngkthpcáccơngnghđãcĩnhưlàXML,SOAP,WSDL,UDDIđ toracácservice,đcđimnàylàmnibtvaitrịcawebservices . 107
  54. WebServiceđưcthitknhmcungcpmtcơchchophépcácchươngtrình giaotipvinhauquaInternet(sdngcácgiaothcInternetnhưHTTPGET,HTP POSTvàSOAP). 3.ðcđimWebservice Webservicechophépclientvàservertươngtácđưcvinhaumcdùtrongnhng mơitrưngkhácnhau. WebServicethìcĩdngmvàdavàocáctiêuchunXMLvàHTTPlànntngk thutchowebservice.Phnlnkthutcawebserviceđưcxâydnglànhngd ánngunm.Bivychúngđclpvàvnhànhđưcvinhau. WebServicethìrtlinhđng:VìviUDDIvàWSDL,thìvicmơtvàpháttrin webservicecĩthđưctđnghố. Webserviceđưcxâydngtrênnntngnhngcơngnghđãđưcchpnhn. Webservicecĩdngmodul. Webservicecĩthđưccơngb(publish)vàgithchinquamng. Ngàynaywebserviceđưcsdngrtnhiutrongnhnglĩnhvckhácnhau cacucsngnhư: Dchvchnlcvàphânloitintc:lànhnghthngthưvinktniđncác webportalđtìmkimcácthơngtintcácnhàxutbncĩchanhngkhốmun tìm. Dchvhinthdanhsáchđĩanhcdànhchocáccơngtythuthanh. ngdngđilýdulchcĩnhiugiávéđidulchkhácnhaudocĩchnlaphc vcanhiuhãnghàngkhơng. BngtínhtốnchínhsáchbohimdùngcơngnghExcel/COMvigiaodinweb. Thơngtinthươngmibaogmnhiunidung,nhiumctinnhư:dbáothitit, thơngtinsckho,lchbay,tgiácphiu, NhnggiaodchtrctuynchocB2BvàB2Cnhư:đtvémáybay,làmgiaokèo thuêxe. Hthngthơngtindùngjavađtínhtốntgiáchuynđigiacácloitint.H thngnàysđưccácngdngkhácdùngnhưmtwebservice. 4.KintrúcWebservice KintrúccaWebservicebaogmcáctngnhưsau: 108
  55. Hình1:KintrúcWebservice Trongđĩbaogmcáctngnhưsau: Tngvnchuyn:cĩnhimvtruynthơngđipgiacácngdngmng,bao gmnhnggiaothcnhưHTTP,SMTP,FTP,JSMvàgnđây nhtlàgiao thcthayđikhimrng(BlocksExtensibleExchangeProtocolBEEP). Tnggiaothctươngtácdchv(ServiceCommunicationProtocol)vicơng nghchunlàSOAP.SOAPlàgiaothcnmgiatngvnchuynvàtngmơ tthơngtinvdchv,SOAPchophépngưidùngtriugimtservicetxa thơngquamtmessageXML. Tngmơtdchv(ServiceDescription)vicơngnghchunlàWSDLvà XML.WSDLlàmtngơnngmơtgiaotipvàthcthidatrênXML.Web servicesdngngơnngWSDLđtruyncácthamsvàcácloidliucho cácthaotác,cácchcnăngmàwebservicecungcp. Tngdchv(Service):cungcpcácchcnăngcaservice. Tngđăngkýdchv(ServiceRegistry)vicơngnghchunlàUDDI.UDDI dùngchocngưidùngvàSOAPserver,nĩchophépđăng ký dch v đ ngưidùngcĩthgithchinservicetxaquamng,haynĩicáchkhácmt servicecnphiđưcđăngkýđchophépcácclientcĩthgithchin Bêncnhđĩđchocácservicecĩtínhantồn,tồnvnvàbomtthơngtin trong kin trúc web service chúng ta cĩ thêm các tng Policy, Security, Transaction,Managementgiúptăngcưngtínhbomt,antồnvàtồnvn thơngtinkhisdngservice. 4.3.2.GiaothcSOAP 109
  56. SOAPlàchvitttcacmt“SimpleObjectAccessProtocol–Giaothctruycpđi tưngđơngin”,nhưngvisxemxétminhtthì,SOAPskhơngcịnlàmttvittt na.ChunSOAPghinhnXMLđưcthhinthnàobêntrongtàiliuSOAP,làmthnào nidungcathơngđipđưctruynti,vàlàmthnàothơngđipđưcxlýchaiphía givànhn.SOAPcũngcungcpmttpcáctvngchun. Cácthutng: Nhưbtkỳcơngnghnào,SOAPcũngcĩtpcácthutngcariêngnĩ.Cĩnhiuthutng đưcsdngthưngxuyênđmơtcáckhíacnhkhácnhaucachunSOAP.Nhiulp trìnhviêndùngcácthutngnàymàkhơngthtshiuýnghĩacanĩ.ðhiuthtscác kháinimđịihiphitnmtthigianđhiuýnghĩacatngthutngvàlàmthnàođ ápdngchocchunSOAPvàmtWebServicesthcth Chúý:ChunSOAPkhơngchlàchunXMLmàchunnàycịnbaogmcácthơngđip SOAPcĩhànhvinhưthnào,cácphươngtinvnchuynkhácnhau,cáchmàcácliđưc xlý Struyntidliu SOAPBinding ThutngmơtlàmthnàomtthơngđipSOAPtươngtácđưcvimtgiaothcvn chuynnhưHTTP,SMTPhayFTPđdichuyntrênInternet.ðiuquantrnglàSOAPdi chuynbngmtgiaothcchunđliênlcvicácsnphmWebServiceskhác. TrưcSOAP,nhiungưipháttrinđãtoracácphươngphápcariênghđchuynti mttàiliuXMLtrênmng.Cáccáchnàyvnhotđngtttrongphmvimtnhĩmcth. Tuynhiênkhibncnlàmvicvimtnhĩmkháctronghaybênngồicơngtythìđiu nàytrnênkhĩkhănvìphihunluynvàcĩththayđiđlàmvicvivictruyntitài liuXMLmàhđangsdng.BngcáchsdngmttàiliuXMLchuntrêncácgiaothc chun,cơngviccnlàmkhicngtácvinhausđưcgimthiutiđa SOAPMessageExchangPattern(MEP) ThutngmơtlàmthnàomàmttàiliuSOAPtraođigiaphíamáykháchvàch. ThơngđipSOAPshumtliênkt,nhưlàHTTP,đnĩcĩthtruyntrênInternet.Vic nĩichuyngiamáykháchvàch,đâylàcácnút,xácđnhcáchànhđngmàchaiphía thchin. NhcliSOAPlàmtXMLđĩnggĩiRPC.Vìth,MEPhồntồnlàyêucuvàphnhi giamáykháchvàch(haycácnútkhác).Nhưvynucĩnhuculiênlcgiacácnútthì vicnàyđưcthchinbngnhiuyêucuvàphnhiđhồnttvictruynthơngđip. CáchnàykháchnvicáccơngnghđitưngtxakhácnhưCORBA,cơngnghđĩđưc thchinchtrongmtktni. SOAPApplication MtngdngSOAPđơnginlàmtngdngdùngSOAPtheomtvàicáchkhácnhau.Vài ngdnghồntồndatrênchunSOAP,nhưlàWebServicescphiu,hocdùngchun SOAPđnhnmãvàcáccpnhtcaphnmm.Chúýlàmtngdngcĩthto,sdng hoclànúttrunggiancaWebServices. SOAPNode Tráchnhimcamtnútcĩthbaogmgi,nhn,xlýhoctruyntilimtthơngđip SOAP.Mtnútchlàmtphnnhcaphnmm,xlýmttàiliuSOAPphthucvào 110
  57. vaitrịcanĩ.Bêncnhvictruyndliu,mtnútcĩtráchnhimđmbothơngtinXML trongtàiliuSOAPphiđúngngpháptheochunSOAP. SOAPRole MtvaitrịcaSOAPđnhnghĩamtnútcthhotđngnhưthnào.Nĩcĩthlànútgi, nhnhocnúttrunggian. SOAPSender NútgilànútgiyêucuSOAP.Nubnnghĩđnvídcangdngkháchchthìkhi ngdngkháchthchinyêucu,nĩgithơngđiptingdngchđyêucuvàithơng tin. SOAPReceiver NgưcliviSOAPsenderlànútnhn. SOAPIntermediary MtnúttrunggiancĩthxemmtthơngđipSOAPvàtươngtáctrênvàiphnthơngtinca thơngđip,vàchuynđnvtríktipcathơngđip.Mtnúttrunggianthưnghotđng nhưmtrouter.Mtroutersxemxétthơngtincagĩitinchuyntrênmng,tìmđimk tipcagĩitinvàchuyngĩitinđnđĩ. MessagePath MtthơngđipSOAPdichuyntphíabêngiđnphíabênnhnthơngđipthơngqua nhiunúttrunggian.TuynđưngđicathơngđipđưcgilàmtMessagePath. InitialSOAPSender NútgiyêucuSOAPđutiênlànútgiSOAPbanđu. SOAPFeature MtđcđimSOAPlàmtphnchcnăngcaphnmmhtrchcnăngSOAP. CácthutngliênquanđnXML ChunSOAPcũngđnhnghĩamttpnhcácphntXMLđđĩnggĩidliuđưctruyn giacácnút.Thtschcĩvàiphntvìphnthâncathơngđipcĩthkhácnhauph thucvàocàiđt.SuynchuynnàyđưcchophépbichunSOAP. SOAPMessage ðâylàtàiliuXMLđưctruynbimtnútSOAPgihocnhn.Mtnútgihocnút kháchtoramttàiliuXMLchathơngtinmàphíabênkháchcntphíach.Mtkhitài liuđưctruyn,phíabênchphângiithơngtintrongtàiliuđtruyxutcácgiátrkhác nhauvàtomtthơngđipSOAPmiđphnhi. SOAPEnvelope ðâylàphntgccatàiliuSOAPXML.TàiliuSOAPchanhiuđnhnghĩakhơnggian tên(namespace)nhưngcácphntliênquantithơngđipSOAPscĩENV:làtipđu ng. SOAPHeader 111
  58. PhnđucamtthơngđipSOAPchamtkhithơngtinđutrongtàiliuXMLđđnh tuynvàxlýthơngđipSOAP.Dliunàytáchrikhiphnthâncatàiliucĩcha thơngtinliênquanđnđitưngđưcgi. SOAPHeaderBlock PhnđucaSOAPchanhiuphngiihnhaylànhiukhithơngtincĩmtkhithơng tincaphnđu.Nhngkhithơngtincaphnđunàychathơngtinvcácnúttrunggian vìmtnútcnbitnútktipđthơngđipđưcgiđn. SOAPBody PhnthâncaSOAPthtschathơngtincađitưngđxlýthơngtin.Phnthânsau khiđưcphântáchstrthànhđitưng.ðitưngxlýthơngtinvàktquđưcđt trongphnthâncatàiliutrv. SOAPFault ðâylàmtphnthơngtincaSOAPchathơngtinđnbtkỳligìxyratimtnút SOAP. 4.3.3.XâydngWebServices TomtWebServicesproject ToWebMethod 112
  59. ChythWebServicesdanhsáchcáchàmsđưclitkê ChnhàmAdd 113
  60. Saukhinhpcácthamsvào,nhnInvoke.Ktqusxuthin 4.3.4.TriugiWebServicestngdng.NET,Javavàcácngơnngkhác SaukhixâydngWebServersongtacĩthtriuginĩtmtngdng khác TomtWindowForm 114
  61. AddWebReference Tomànhình: 115
  62. Vithàmxlýnútnhn: Chythngdngtacĩktqu: 4.4Tholunvcácngdngphântán 4.5.Bàitpápdng 1.VitchươngtrìnhChatsdngcơngnghWebServices 2.VitchươngtrìnhCalculatorbngcơngnghWebServices 3.VitchưngtrìnhqunlýFileManagerbngcơngnghWebServices. 116
  63. TÀILIUTHAMKHO 1. RichardBlum,C#NetworkProgramming,2003 2. FiachReid,NetworkprogramminginNETwithC#andVB.NET,Digital Press,2003 3. Bàiging“NhpmơnCơngnghphnmm”,ðihcKHTN 4. Bàiging“Xâydngphnmmhưngđitưng”,ðihcKHTN 5. Bàiging“Lptrìnhtruynthơng”,ðihcCnThơ 6. Bàiging“Cơngngh.NET”,KhoaCNTT–ðihcSPKTHưngYên 7. Bàiging“JavaNângcao”,KhoaCNTTðihcSPKTHưngYên 8. CácvídtiWebsite: www.java2s.com 117