WinInet开发应用实例internet.docx
- 文档编号:20104472
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:9
- 大小:22.40KB
WinInet开发应用实例internet.docx
《WinInet开发应用实例internet.docx》由会员分享,可在线阅读,更多相关《WinInet开发应用实例internet.docx(9页珍藏版)》请在冰豆网上搜索。
WinInet开发应用实例internet
用WinInet开发Internet客户端应用指南
一、概述
一个Internet客户端程序的目的是通过Internet协议如:
HTTP、FTP等来存取网络数据源(服务器)的信息。
客户端程序可以访问服务器获得象天气预报,股票价格、重要新闻数据,甚至是与服务器交换信息。
Internet客户端程序可以通过外部网络(Internet)或内部网络(一般为Intranet)访问服务器。
为了开发Internet客户端程序。
MFC类库提供了专门的Win32Internet扩展接口,也就是WinInet。
MFC将WinInet封装在一个标准的、易于使用的类集合中。
在编写WinInet客户端程序时,你既可以直接调用Win32函数,也可以使用WinInet类库.
Win32Internet扩展提供了对普通Internet协议的访问,这些协议包括:
HTTP、FTP和Gopher。
Gopher已经渐渐淡出。
借助于WinInet编程接口,开发人员不必去了解Winsock、TCP/IP和特定Internet协议的细节就可以编写出高水平的Internet客户端程序。
WinInet为所有几种协议(HTTP、FTP和Gopher)提供了统一的函数集,也就是Win32API接口。
利用这些统一的函数集,大大简化了针对HTTP、FTP等协议的编程,从而轻松地将Internet集成到自己的应用程序中。
底层协议的转换(如从FTP到HTTP)只要对源代码稍作修改就可以完成。
在VisualC++工程中提供有两种方式来使用WinInet。
一种是直接调用Win32Internet函数,另一种是使用WinInet类库。
MFC对WinInet的封装是通过提供三个由CStdioFile派生类实现的。
这三个派生类是:
CInternetFile、CHttpFile和CGopherFile。
由于Gopher协议已经很少使用,所以本文将不再对CGopherFile进行讨论。
对开发人员来说,不管你以前是否用过CStdioFile,WinInet都是很好理解并且易于使用的。
它使得存取Internet数据易如反掌,使得Internet数据和本地数据的处理一致透明,数据的存储位置已经不再重要。
MFCWinInet类有如下优点:
缓冲器输入输出数据的类型安全处理许多函数的参数都是缺省值对普通的Internet错误进行异常处理自动清除打开的句柄和连接
使用WinInet提供的API函数,你可以:
通过HTTP协议下载HTML页,HTTP协议是专门用于在服务器和客户浏览器之间传输HTML页。
发送FTP请求上传或下载文件以及获取服务器的目录信息。
通过匿名登陆下载文件便是FTP的典型应用。
其它基于HTTP、FTP协议的应用。
使用WinInet的一般流程为:
图一
下表描述了一个Internet客户端程序实现的一般步骤:
(表一)
实现
方法
建立一个连接
创建CInternetSession对象,它是WinInetInternet客户应用的前提条件
打开一个URL
建立一个连接,调用CInternetSession:
:
OpenURL
函数,返回一个只读资源对象
读取URL数据
打开一个URL,调用CInternetSession:
:
QueryOption
查询Internet选项设置
建立一个连接,调用CInternetFile:
:
Read
设置一个Internet选项
建立一个连接,调用CInternetSession:
:
SetOption
设置一个用状态信息调用的函数
建立一个连接,调用CInternetSession:
:
EnableStatusCallback
重写CInternetSession:
:
OnStatusCallback函数
关闭连接
用CInternetSession对象方法,清除打开的连接
为了创建Internet客户端程序,MFC提供了如下的C++类和全程函数:
C++类
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对象有三种类型:
CInternetSession:
:
GetFtpConnectionCInternetSession:
:
GetHttpConnectionCInternetSession:
:
GetGopherConnection
这些函数调用并不会读写服务器上的文件。
如果你想要读写数据,必须要打开文件才能操作。
其处理流程应该是这样的:
首先创建CInternetSession对象实例如果创建的Session要读写文件,则必须创建CInternetFile对象实例(或者是它的子类CHttpFile、CGopherFile对象实例)。
其实,读取数据最容易的方式是调用CInternetSession:
:
OpenURL函数。
这个函数解析你提供的统一资源定位符(URL),然后打开与URL指定的服务器连接,同时返回一个只读的CInternetFile对象。
CInternetSession:
:
OpenURL不针对特定的协议类型――不管是FTP还是HTTP都可以调用,它甚至可以处理本地文件,此时返回的是CStdioFile,而不是CInternetFile。
如果创建的Session不读写文件,而是要实现其它的任务,如删除某个FTP目录下的文件等,则你不需要创建CInternetFile实例。
创建CInternetFile对象的方法有两种:
如果用CInternetSession:
:
OpenURL建立与服务器的连接,调用返回CStdioFile。
如果用CInternetSession:
:
GetFtpConnection、GetGopherConnection或者CHttpConnection:
:
OpenRequest建立与服务器的连接,你必须调用相应的CFtpConnection:
:
OpenFile、CGopherConnection:
:
OpenFile或者CHttpConnection:
:
OpenRequest,返回的内容也与CInternetFile、CGopherFile或者CHttpFile对应。
综上所述,实现Internet客户端应用的步骤因协议而异。
要看你是创建基于OpenURL的一般Internet客户端应用,还是使用GetXXXConnection函数之一针对特定协议的Internet客户端应用。
在后继文章中我们将进一步讨论用WinInet实现Internet客户端应用程序的具体步骤和细节。
二、实现步骤
大家知道,每个Internet客户端程序都伴随有一定的目的行为,如读文件、写文件、删除文件等等。
客户端的程序要实现这些行为的先决条件是建立Internet连接。
然后再根据不同的目的进行具体的操作。
为了方便起见,下面这这些张表格针对不同的应用行为列出了所需要的具体操作。
其中列出了一般的InternetURL(FTP、或者HTTP)客户端行为要实现某个目标所必须使用的方法。
这张表格的内容来自MSDN。
我对部分我认为重要的地方做了补充。
(表一)一个典型的Internet客户端程序的处理流程
目的
方法
结果
开始一个Internetsession
创建CInternetSession对象
初始化WinInet,并连接服务器
读取或设置InternetQuery选项(如超时或重试次数)
调用CInternetSession:
:
SetOption
不成功返回FALSE
建立回调函数监视session状态
调用CInternetSession:
:
EnableStatusCallback
建立回调函数
CInternetSession:
:
OnStatusCallback,重写OnStatusCallback,创建自己的回调例程
Internet服务器Intranet服务器或本地文件
调用CInternetSession:
:
OpenURL
解析并打开到指定服务器的连接,返回CStdioFile(如果你传递的OpenURL是本地文件名)或CInternetFile对象,通过存取这个对象,获得服务器或文件的数据
读文件
调用CInternetFile:
:
Read
用你提供的Buffer读指定的字节数
异常处理
在CInternetException类中处理
处理所有普通的Internet异常类型
结束Internetsession处理
CInternetSession对象
自动清除打开的句柄的连接
(表二)典型的FTP客户端程序实现的一般步骤
目的
方法
结果
开始一个FTP会话,建立一个FTP连接
创建一个CInternetSession对象,调用CInternetSession:
:
GetFtpConnection
初始化WinInet
并联接服务器
连接到一个FTPServer
用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异常类型
结束FTPsession
处理CInternetSession对象
自动清除打开的句柄的连接
(表三)显示了一个典型的删除文件的FTP客户端应用要实现的一般步骤:
目的
方法
结果
开始一个FTPsession
创建一个CInternetSession对象
初始化WinInet
并联接服务器
连接到一个FTPServer
用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异常类型
结束FTPsession
处理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里搜一下也能找到一些使用MFCWinInet的技术信息。
(完)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WinInet 开发 应用 实例 internet