一个Internet客户端程序的目的是经过Internet协议如:HTTP、FTP等来存取网络数据源(服务器)的信息。客户端程序能够访问服务器获 得象天气预报,股票价格、重要新闻数据,甚至是与服务器交换信息。Internet客户端程序能够经过外部网络(Internet)或内部网络(通常为 Intranet)访问服务器。编程
为了开发Internet客户端程序。MFC类库提供了专门的 Win32 Internet 扩展接口,也就是WinInet。MFC将WinInet封装在一个标准的、易于使用的类集合中。在编写WinInet客户端程序时,你既能够直接调用 Win32函数,也可使用WinInet类库。浏览器
Win32 Internet 扩展提供了对普通Internet协议的访问,这些协议包括:HTTP、FTP和Gopher。Gopher已经渐渐淡出。借助于WinInet编程接 口,开发人员没必要去了解Winsock、TCP/IP和特定Internet协议的细节就能够编写出高水平的Internet客户端程序。WinInet 为全部几种协议(HTTP、FTP和Gopher)提供了统一的函数集,也就是Win32 API接口。利用这些统一的函数集,大大简化了针对HTTP、FTP等协议的编程,从而轻松地将Internet集成到本身的应用程序中。底层协议的转换 (如从FTP到HTTP)只要对源代码稍做修改就能够完成。安全
在Visual C++工程中提供有两种方式来使用WinInet。一种是直接调用Win32 Internet函数,另外一种是使用WinInet类库。服务器
MFC对WinInet的封装是经过提供三个由CStdioFile派生类实现的。这三个派生类是:CInternetFile、 CHttpFile 和 CGopherFile。因为Gopher协议已经不多使用,因此本文将再也不对CGopherFile进行讨论。对开发人员来讲,无论你之前是否用过 CStdioFile,WinInet都是很好理解而且易于使用的。它使得存取Internet数据易如反掌,使得Internet数据和本地数据的处理 一致透明,数据的存储位置已经再也不重要。网络
MFC WinInet 类有以下优势:session
使用 WinInet 提供的API函数,你能够:并发
使用 WinInet 的通常流程为:函数
下表描述了一个Internet客户端程序实现的通常步骤:google
实现 | 方法 |
创建一个链接 | 建立CInternetSession对象,它是WinInet Internet客户应用的前提条件 |
打开一个URL | 创建一个链接,调用CInternetSession::OpenURL 函数,返回一个只读资源对象 |
读取 URL 数据 | 打开一个URL,调用CInternetSession::QueryOption |
查询 Internet 选项设置 | 创建一个链接,调用CInternetFile::Read |
设置一个Internet选项 | 创建一个链接,调用CInternetSession::SetOption |
设置一个用状态信息调用的函数 | 创建一个链接,调用CInternetSession::EnableStatusCallback 重写CInternetSession::OnStatusCallback函数 |
关闭链接 | 用CInternetSession对象方法,清除打开的链接 |
为了建立Internet客户端程序,MFC提供了以下的C++类和全程函数:
C++类spa
CInternetSession (父类 CObject) CInternetConnection (父类 CObject) CFtpConnection CGopherConnection CHttpConnection CInternetFile(父类 CStdioFile) CGopherFile CHttpFile CFileFind(父类 CObject) CFtpFileFind CGopherFileFind CGopherLocator(父类 CObject) CInternetException(父类 CException)
全程函数
AfxParseURL AfxGetInternetHandleType AfxThrowInternetException
这些类和全程函数除CFileFind在AFX.H里声明以外,其他都在AFXINET.H文件里声明。它们对HTTP、FTP和Gopher等协议进行 了高度抽象,造成了一套高级API函数。 利用这些API能够快速直接地开发Internet应用。例如,链接到FTP服务器通常须要几个步骤,并且须要作一些底层处理。但使用上述的MFC类提供 的API,只须要对CInternetSession::GetFTPConnection进行一次调用,即可以轻松创建链接。
你们知道,每个Internet应用其数据交换都是创建在Internet会话(Session)的基础之上的,MFC是经过 CInternetSession类对象来实现Internet会话的。用这个类不只能够建立会话,并且能够建立几个并发的Internet会话。
为了与服务器进行通信,除了要建立CInternetSession对象以外,还必须建立CInternetConnection对象,针对不一样的协议,CInternetConnection对象有三种类型:
这些函数调用并不会读写服务器上的文件。若是你想要读写数据,必需要打开文件才能操做。其处理流程应该是这样的:
建立CInternetFile对象的方法有两种:
综上所述,实现Internet客户端应用的步骤因协议而异。要看你是建立基于OpenURL的通常Internet客户端应用,仍是使用GetXXXConnection函数之一针对特定协议的Internet客户端应用。
在后继文章中咱们将进一步讨论用WinInet实现Internet客户端应用程序的具体步骤和细节。
你们知道,每一个Internet客户端程序都伴随有必定的目的行为,如读文件、写文件、删除文件等等。客户端的程序要实现这些行为的先决条件是创建 Internet链接。而后再根据不一样的目的进行具体的操做。为了方便起见,下面这这些张表格针对不一样的应用行为列出了所须要的具体操做。其中列出了通常 的Internet URL (FTP、或者 HTTP)客户端行为要实现某个目标所必须使用的方法。这张表格的内容来自MSDN。我对部分我认为重要的地方作了补充。
一个典型的Internet客户端程序的处理流程
目的 | 方法 | 结果 |
开始一个Internet session | 建立 CInternetSession 对象 | 初始化WinInet,并链接服务器 |
读取或设置 InternetQuery 选项 (如超时或重试次数) | 调用 CInternetSession::SetOption | 不成功返回FALSE |
创建回调函数监视session状态 | 调用CInternetSession::EnableStatusCallback 创建回调函数 |
CInternetSession::OnStatusCallback,重写OnStatusCallback,建立本身的回调例程 |
Internet服务器Intranet服务器或本地文件 | 调用 CInternetSession::OpenURL | 解析并打开到指定服务器的链接,返回CStdioFile(若是你传递的OpenURL是本地文件名)或CInternetFile对象,经过存取这个对象,得到服务器或文件的数据 |
读文件 | 调用 CInternetFile::Read | 用你提供的Buffer读指定的字节数 |
异常处理 | 在 CInternetException 类中处理 | 处理全部普通的 Internet 异常类型 |
结束 Internet session 处理 | CInternetSession对象 | 自动清除打开的句柄的链接 |
典型的 FTP 客户端程序实现的通常步骤
目的 | 方法 | 结果 |
开始一个FTP会话,创建一个FTP链接 | 建立一个CInternetSession对象,调用CInternetSession::GetFtpConnection | 初始化WinInet 并联接服务器 |
链接到一个FTP Server | 用CInternetSession::GetFtpConnection | 返回一个CFtpConnection对象 |
CD到 FTP 服务器的一个新目录 | 用CFtpConnection::SetCurrentDirectory | CD到FTP服务器的一个 新目录 |
Find 第一个FTP目录中的文件 | 建立一个CFtpFileFind对象,调用CFtpFileFind::FindFile,OpenURL函数返回一个只读资源对象;调用CFtpFileFind::FindFile | Find第一个文件,若是文件每找到返回FALSE |
枚举全部可得到的资源,Find下一个FTP目录中的文件 | Find下一个资源,调用CFtpFileFind::FindNextFile直到返回FALSE。 | Find下一个文件 若是文件没找到返回FALSE |
打开FindFile或FindNextFile找到的文件(用于读写) | 调用CFtpConnection::OpenFile,参数为FindFile或FindNextFile返回的文件名 ,建立并打开一个CInternetFile对象 | 打开FindFile或FindNextFile找到的文件(用于读写),返回一个CInternetFile对象 |
读写文件 | 以读方式打开FTP文件,用CInternetFile::Read | 使用你指定的缓冲读 指定的字节数 |
写FTP文件 | 以写方式打开FTP文件,调用CInternetFile::Write,重写CInternetSession::OnStatusCallback | 使用你指定的缓冲写 指定的字节数 |
改变客户端在服务器上的目录 | 调用CFtpConnection::SetCurrentDirectory | 进入新的目录 |
获取客户端在服务器上的当前目录 | 调用CFtpConnection::GetCurrentDirectory | 获取目录信息 |
异常处理 | 用CInternetException类 | 处理全部普通的Internet异常类型 |
结束FTP session | 处理CInternetSession对象 | 自动清除打开的句柄的链接 |
一个典型的删除文件的FTP客户端应用要实现的通常步骤
目的 | 方法 | 结果 |
开始一个FTP session | 建立一个CInternetSession对象 | 初始化WinInet 并联接服务器 |
链接到一个FTP Server | 用CInternetSession::GetFtpConnection | 返回一个CFtpConnection对象 |
检查FTP目录是否正确 | 用CFtpConnection::GetCurrentDirectory或CFtpConnection::GetCurrentDirectoryAsURL | 返回目录名字 服务器目录或返回目录的URL |
CD(改变目录)到 FTP 服务器的一个新目录 | 用CFtpConnection::SetCurrentDirectory | CD到FTP服务器的一个 新目录 |
Find 第一个FTP目录中的文件 | 用CFtpFileFind::FindFile | Find第一个文件,若是文件每找到返回FALSE |
Find 下一个FTP目录中的文件 | 用CFtpFileFind::FindNextFile | Find下一个文件 若是文件没找到返回FALSE |
删除FindFile或FindNextFile找到的文件 | 用CFtpConnection::Remove用FindFile或FindNextFile返回的文件名 | 删除FindFile或FindNextFile 找到的文件 |
异常处理 | 用CInternetException类 | 处理全部普通的Internet异常类型 |
结束FTP session | 处理CInternetSession对象 | 自动清除打开的句柄的链接 |
实现一个典型的 HTTP 客户端应用程序的通常步骤
目的 | 方法 | 结果 |
开始HTTP会话,创建HTTP链接 | 建立 CInternetSession对象,调用CInternetSession::GetHttpConnection 建立CHttpConnection对象 |
初始化WinInet并联接服务器,返回一个CHttpConnection对象 |
建立一个 HTTP 请求 | 调用CHttpConnection::OpenRequest 建立一个CHttpFile对象; |
返回一个CHttpFile对象 |
发送一个HTTP 请求 | 用CHttpFile::AddRequestHeaders 而且用CHttpFile::SendRequest | Find一个文件 若是文件没找到返回FALSE |
读文件 | 调用CInternetFile::Read | 使用你提供的缓冲读指定的字节 |
获取HTTP请求信息 | 调用CHttpFile::QueryInfo | 从服务器获取HTTP请求头信息 |
异常处理 | 利用CInternetException类 | 处理全部普通的Internet异常类型 |
结束 HTTP 会话 | 处理CInternetSession对象 | 自动清除打开的句柄的链接 |
因为时间关系,我没有写本文的例子代码。不过MSDN里有两个简单的例子能够参考,一个是FTPTREE,另外一个是TEAR。此外,也能够用“WinInet”做为关键字在google里搜一下也能找到一些使用MFC WinInet的技术信息。