《教学课件第14章开发Internet应用程序》由会员分享,可在线阅读,更多相关《教学课件第14章开发Internet应用程序(29页珍藏版)》请在金锄头文库上搜索。
1、第第14章章 开发开发Internet应用程序应用程序 Internet应用程序的开发通常包括应用程序的开发通常包括Internet服务端和客户端的应用程序,服务端和客户端的应用程序,Microsoft提供了大量的提供了大量的API函数来支持函数来支持这两种程序,客户端应用程序主要通过这两种程序,客户端应用程序主要通过Internet协议协议(如如Gopher,FTP,HTTP等等)来从网络服务器上获取数据,提供访问来从网络服务器上获取数据,提供访问Internet的功能,服务器端应用程序则的功能,服务器端应用程序则用来支持用来支持HTTP、FTP或或Gopher等类型等类型的服务的服务114
2、.1Internet应用程序开发的几种类应用程序开发的几种类型型使用使用WinInet类开发类开发Internet应用程序:应用程序:WinInet类类支持支持HTTP、FTP和和Gopher等标准的协议等标准的协议使用使用WindowsSocket开发开发Internet应用程序:应用程序:Winsock标准定义了一个标准定义了一个DLL接口来连接接口来连接Internet,MFC使用使用CAsyncSocket和和CSocket类对接口进类对接口进行了封装。行了封装。使用消息收发使用消息收发API(MAPI:MessageAPI)开发开发Internet应用程序:应用程序:使用使用MAPI
3、可以很方便的向其他可以很方便的向其他应用程序发送电子邮件、语音邮件或传真等功能应用程序发送电子邮件、语音邮件或传真等功能214.2 WinInet开发简介开发简介 用用WinInet开发开发程序的优点程序的优点隐藏协议细节,简化编程:隐藏协议细节,简化编程:可不必深入了解协议,而可不必深入了解协议,而使用使用WinSocket编程,需理解网络通信及协议基本原编程,需理解网络通信及协议基本原理理熟悉的编程接口:熟悉的编程接口:WinInetAPI函数和很多函数和很多WinAPI函函数很相似,这对有编程经验的程序员来说是很方便的。数很相似,这对有编程经验的程序员来说是很方便的。稳定性好,不要求程序
4、与底层直接联系:稳定性好,不要求程序与底层直接联系:WinInet隐隐藏了协议的具体细节,使得程序不必直接使用各种协藏了协议的具体细节,使得程序不必直接使用各种协议议支持数据缓存:支持数据缓存:WinInetWinInet函数为所有的协议提供缓存能函数为所有的协议提供缓存能力,程序员只需关心数据而不用去管理数据缓存力,程序员只需关心数据而不用去管理数据缓存 支持多线程:支持多线程:由于由于WinInet函数在内部处理多线程的函数在内部处理多线程的并发问题,因此并发问题,因此WinInet函数支持多线程,在多线程函数支持多线程,在多线程中可以调用各种中可以调用各种WinInet函数而不用担心发生
5、问题或函数而不用担心发生问题或死锁死锁314.3 WinInet类介绍类介绍 WinInet类是一个总称,目前的版本中分为四类是一个总称,目前的版本中分为四组组CInternetSession类类CInternetConnection(连接类连接类)CFileFind类类(Internet文件查找类文件查找类)CInternetFile类和类和CGopherLocator类类414.3.1 CInternetSession类类 CInternetSession类直接继承自类直接继承自CObject类,该类用来建立与某个类,该类用来建立与某个Internet服务器的会话。还可以向代理服务器的会话
6、。还可以向代理服务器描述连接,如果应用程序所使用服务器描述连接,如果应用程序所使用的的Internet连接必须保持一段时间,则连接必须保持一段时间,则可以在可以在CWinApp类中创建相应的类中创建相应的CInternetSession成员成员5QueryOption提供一个可能的错误检测提供一个可能的错误检测判断判断SetOption设置设置Internet会话的选项会话的选项OpenURL设置设置URL,并对其进行分析,并对其进行分析GetFtpConnection打开一个打开一个FTP会话并进行会话并进行连接连接GetHttpConnection打开打开HTTP服务器并进行连服务器并进行
7、连接接GetGopherConnection打开打开Gopher服务器并进行服务器并进行连接连接EnableStatusCallback建立异步操作的状态回调建立异步操作的状态回调ServiceTypeFromHandle通过通过Internet句柄返回服务句柄返回服务器类型器类型GetContext获取获取Internet和应用程序会和应用程序会话句柄话句柄Close关闭关闭Internet连接连接CInternetSession类成员函数类成员函数614.3.2 CInternetConnection类类 包括包括CInternetConnection类及其派生类类及其派生类CHttpCo
8、nnection、CFtpConnection和和CGopherConnection类,类,这些类帮助用户管理与这些类帮助用户管理与Internet服务器的连服务器的连接,同时还提供一些函数完成和响应服务器接,同时还提供一些函数完成和响应服务器的通信的通信7CInternetConnection:用用于于管管理理与与Internet服服务务器器的连接的连接CFtpConnection:用用于于管管理理与与FTP服服务务器器的的连连接接,可以对服务器上的文件和目录进行直接操作可以对服务器上的文件和目录进行直接操作CGopherConnection:管管理理与与Gopher服服务务器器的的连连接接
9、CHttpConnection:管理与管理与HTTP服务器的连接服务器的连接连接类及其连接类及其派生类派生类814.3.3 CInternetFile类类 包包括括CInternetFile类类及及其其派派生生类类CHttpFile、CGopherFile。这这些些类类实实现现对对远远程程系系统统上上的的文件的存取工作。文件的存取工作。文文 件件 类类 还还 包包 含含 CFileFind类类 及及 其其 派派 生生 类类CFtpFileFind、CGopherFileFind类类。CFileFind类类直直接接继继承承于于CObject类类,这这些些类类实实现现对对本本地地和和远远程程系系统
10、统上上的的文文件件的的搜搜索索和和定定位工作。位工作。9CInternetFile:允允许许对对使使用用Internet协协议议的的远远程程系系统统中中的文件进行操作的文件进行操作CGopherFile:为为在在Gopher服服务务器器上上进进行行文文件件检检索索和和读取操作提供支持读取操作提供支持CHttpFile:提提供供对对HTTP服服务务器器上上的的文文件件进进行行操操作作的的支持支持CFindFile:对文件检索提供支持对文件检索提供支持CFtpFileFind:为为在在FTP服服务务器器上上进进行行的的文文件件检检索索操操作提供支持作提供支持CGopherFileFind:为为在在
11、Gopher服服务务器器上上进进行行的的文文件件检索操作提供支持检索操作提供支持文件类说明文件类说明1014.3.4 CGopherLocator类类 在从在从Gopher服务器中获取信息之前,服务器中获取信息之前,必须先获得该服务器的定位器,而必须先获得该服务器的定位器,而CGopherLocator类的主要功能就是从类的主要功能就是从Gopher服务器中得到定位并确定定位服务器中得到定位并确定定位器的类型器的类型。1114.4 用用WinInet类开发应用程序类开发应用程序 编写支持编写支持Internet的应用程序一般步骤:的应用程序一般步骤:(1)创建一个创建一个CInternetSe
12、ssion对象:对象:由于由于Internet会话是通过会话是通过CInternetConnection类的类的对象实现的,因此首先要创建一个对象实现的,因此首先要创建一个CInternetSession对象,建立一个对象,建立一个Internet会会话。话。(2)建立与服务器的连接:建立与服务器的连接:客户应用程序要与服客户应用程序要与服务器协同工作,在创建了务器协同工作,在创建了CInternetSession对对象后,就需要建立到服务器的连接。根据不同象后,就需要建立到服务器的连接。根据不同的协议,可选用的协议,可选用GetFtpConnect、GetHttpConnect和和GetGo
13、pherConnect三种三种方法中的一种。方法中的一种。12(3)查询或设置查询或设置Internet选项:选项:在连接时,有时在连接时,有时还要查询或设置还要查询或设置Internet选项,这个工作可以选项,这个工作可以通过通过QueryOption或或SetOption函数来完成。函数来完成。(4)向用户反馈当前数据处理的进程信息:向用户反馈当前数据处理的进程信息:有时有时客户的应用程序在进行某些操作时,要耗费较客户的应用程序在进行某些操作时,要耗费较长的时间,因此需要向用户反馈当前的状态,长的时间,因此需要向用户反馈当前的状态,这个工作由这个工作由EnableStatusCallbac
14、k函数来完成,函数来完成,此时还要重载此时还要重载OnStatusCallBack函数以实现函数以实现回调函数的功能。回调函数的功能。13(5)创建创建CInternetFile实例:实例:调用调用CInternetSession类的成员函数类的成员函数OpenURL建建立与服务器的连接,函数返回一个立与服务器的连接,函数返回一个CInternetFile指针。指针。(6)文件读写操作:文件读写操作:调用调用CInternetFile:Read或或CInternetFile:Write函数对所得到得服务器函数对所得到得服务器文件进行读写操作。文件进行读写操作。(7)异常处理:异常处理:为提高应
15、用程序的可靠性和容错为提高应用程序的可靠性和容错性,必须对可能出现的问题进行处理,这种处性,必须对可能出现的问题进行处理,这种处理通常是通过调用理通常是通过调用CInternetException类的对类的对象对目前可知的异常进行处理。象对目前可知的异常进行处理。(8)结束:结束:调用调用CInternetSession:Close结结束会话并销毁束会话并销毁CInternetSession对象。对象。1414.5 WinInet类编程实例类编程实例 【例【例14-1】利用】利用WinInet类编写类编写Internet应用应用程序。在程序。在URL编辑框中写入地址,单击编辑框中写入地址,单击
16、“Http”、“Ftp”或或“Gopher”等按钮可在等按钮可在编辑框中显示查询到的相应服务器的信息编辑框中显示查询到的相应服务器的信息编辑框编辑框1IDC_EDIT_URL编辑框编辑框2IDC_EDIT_RESULT下压式按钮下压式按钮IDC_BUTTON_HTTP下压式按钮下压式按钮IDC_BUTTON_FTP下压式按钮下压式按钮IDC_BUTTON_GOPHER下压式按钮下压式按钮IDCANCEL静态文本静态文本IDC_STATIC组框组框IDC_STATIC15给界面对象连接接变量给界面对象连接接变量16(a)给应用程序增加一个自定义的类,单击给应用程序增加一个自定义的类,单击Inse
17、rtNewClass菜单,添加新类类名为菜单,添加新类类名为CMyWinInetClass,系统会自动在项目中增加,系统会自动在项目中增加MyWinInetClass.cpp和和MyWinInetClass.h两个文件两个文件17(b)在在新新加加入入的的类类中中增增加加如如下下三三个个public的的成成员员函函数数,在在头头文文件件MyWinInetClass.h中中可可看看到到这些函数。这些函数。CStringConnectFtp(constCStringsUrl);/完成连接完成连接Ftp功能的函数功能的函数CStringConnectHttp(constCStringsUrl);/完
18、成连接完成连接Http功能的函数功能的函数CString ConnectGopher(const CStringsUrl);/完成连接完成连接Gopher功能的函数功能的函数18为为 了了 建建 立立 Internet的的 会会 话话 , 新新 增增 加加 的的CMyWinInetClass类类中中加加入入一一个个private型型成成员员变变量量m_session:CInternetSessionm_session; /建建立立Internet会会话话由由于于在在上上面面定定义义了了一一个个CWinInet类类的的对对象象,所所以以还还需要在需要在MyWinInetClass.h头文件中加入
19、如下代码:头文件中加入如下代码:#includeafxinet.h#includewininet.h19为为CMyWinInetClass类添加三个用于连接的成员函数,类添加三个用于连接的成员函数,它们分别是它们分别是ConnectFtp、ConnectHttp和和ConnectGopher。CStringCMyWinInetClass:ConnectFtp(constCStringsUrl)CStringsResult;/存储连接信息的字符串存储连接信息的字符串CFtpConnection*Ftpconnection=NULL;sResult=;sResult=sResult+Tryingt
20、oconnectFtpsites+sUrl+rn;Ftpconnection=m_session.GetFtpConnection(sUrl);/建立到建立到Ftp服务器的连接服务器的连接20if(Ftpconnection)sResult=sResult+Connectionestablished.rn;CStringsCurDir;Ftpconnection-GetCurrentDirectory(sCurDir);/得到得到Ftp服务器的当前目录服务器的当前目录sResult=sResult+currentdirectoryis+sCurDir+rn;Ftpconnection-Clos
21、e();/关闭连接关闭连接elsesResult=sResult+TherearesomeerrorsinfindingthisFtpsites;returnsResult;21CStringCMyWinInetClass:ConnectHttp(constCStringsUrl)CStringsResult;CInternetFile*hHttpFile=NULL;sResult=;sResult=sResult+TryingtoconnectHttpsites+sUrl+rn;hHttpFile=(CInternetFile*)m_session.OpenURL(sUrl);/得到文件指针
22、得到文件指针if(hHttpFile)sResult=sResult+Connectionestablished.rn;CStringsLine;while(hHttpFile-ReadString(sLine)/读取读取Http服务器上的服务器上的内容内容sResult=sResult+sLine+rn;hHttpFile-Close();/关闭连接关闭连接elsesResult=sResult+TherearesomeerrorsinfindingthisHttpsites;returnsResult;22CStringCMyWinInetClass:ConnectGopher(const
23、CStringsUrl)CStringsResult;CInternetFile*hGopherFile=NULL;sResult=;sResult=sResult+TryingtoconnectGophersites+sUrl+rn;hGopherFile=(CInternetFile*)m_session.OpenURL(sUrl);/得到文件指针得到文件指针if(hGopherFile)sResult=sResult+Connectionestablished.rn;CStringsLine;while(hGopherFile-ReadString(sLine)/读取读取Gopher服务
24、服务器内容器内容sResult=sResult+sLine+rn;hGopherFile-Close();/结束连接结束连接elsesResult=sResult+TherearesomeerrorsinfindingthisGophersites;returnsResult;23在在CMyInternetDlg类中增加一个类中增加一个public成员变成员变量量CMyWinInetClassm_WinInetClass;变量变量m_WinInetClass是是CMyWinInetClass类类的一个对象,所以还要在的一个对象,所以还要在WinInetDlg.h头文件头文件加入自定义类的头文件
25、:加入自定义类的头文件:#includeMyWinInetClass.h24三个消息处理函数增加代码如下:三个消息处理函数增加代码如下:voidCWinInetDlg:OnButtonFtp()UpdateData(TRUE); /从对话框读入地址信息从对话框读入地址信息m_Urlm_EditResult=;/调用自定义类的成员函数,连接调用自定义类的成员函数,连接Ftp服务器,服务器,m_Url为地址为地址m_EditResult=m_EditResult+m_WinInetClass.ConnectFtp(m_Url);UpdateData(FALSE);voidCWinInetDlg:O
26、nButtonHttp()UpdateData(TRUE); /从对话框读入地址信息从对话框读入地址信息m_Urlm_EditResult=;/调用自定义类的成员函数,连接调用自定义类的成员函数,连接Http服务器,服务器,m_Url为地址为地址m_EditResult=m_EditResult+m_WinInetClass.ConnectHttp(m_Url);UpdateData(FALSE);25voidCWinInetDlg:OnButtonGopher()UpdateData(TRUE); /从对话框读入地址信息从对话框读入地址信息m_Urlm_EditResult=;/调用自定义类的成员函数,连接调用自定义类的成员函数,连接Gopher服务器,服务器,m_Url为地为地址址m_EditResult=m_EditResult+m_WinInetClass.ConnectGopher(m_Url);UpdateData(FALSE);26272829