2019独角兽企业重金招聘Python工程师标准>>>

概述

一个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 类有如下优点:

  • 缓冲器输入输出
  • 数据的类型安全处理
  • 许多函数的参数都是缺省值
  • 对普通的Internet错误进行异常处理
  • 自动清除打开的句柄和连接

使用 WinInet 提供的API函数,你可以:

  • 通过HTTP协议下载HTML页,HTTP协议是专门用于在服务器和客户浏览器之间传输HTML页。
  • 发送FTP请求上传或下载文件以及获取服务器的目录信息。通过匿名登陆下载文件便是FTP的典型应用。
  • 其它基于HTTP、FTP协议的应用。

使用 WinInet 的一般流程为:

下表描述了一个Internet客户端程序实现的一般步骤:

实现 方法
建立一个连接 创建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++类

CInternetSession (父类 CObject)
CInternetConnection (父类 CObject)CFtpConnectionCGopherConnectionCHttpConnection
CInternetFile(父类 CStdioFile)CGopherFileCHttpFile
CFileFind(父类 CObject)CFtpFileFindCGopherFileFind
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::GetFtpConnection
  • CInternetSession::GetHttpConnection
  • CInternetSession::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连接。然后再根据不同的目的进行具体的操作。为了方便起见,下面这这些张表格针对不同的应用行为列出了所需要的具体操作。其中列出了一般 的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的技术信息。

转载于:https://my.oschina.net/u/136923/blog/66797

用WinInet开发Internet客户端应用指南相关推荐

  1. 《微软云计算Windows Azure开发与部署权威指南》——6.8 AppFabric服务总线的多播服务开发...

    本节书摘来自异步社区<微软云计算Windows Azure开发与部署权威指南>一书中的第6章,第6.8节,作者: 尹成 , 郝庭毅 , 张俊强 , 孙奉刚 , 寇睿明 更多章节内容可以访问 ...

  2. 面向对象的前端开发_面向前端开发人员的GraphQL指南

    面向对象的前端开发 by Schalk Venter 由沙克·文特(Schalk Venter) 面向前端开发人员的GraphQL指南 (A guide to GraphQL for front-en ...

  3. 用Delphi开发OPC客户端工具的方法研究

    用Delphi开发OPC客户端工具的方法研究[1]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:o ...

  4. web开发指南_成为专业Web开发人员的实用指南

    web开发指南 This article is meant to serve as a practical guide to becoming a professional web developer ...

  5. 极光小课堂 | 极光推送之 Android 客户端使用指南——基础篇

    " 本文中涉及到的所有代码现已在 Github 上开源,地址:https://github.com/xuexiangjys/JPushSample" 01 前言 - 极光推送是国内 ...

  6. 八、前端开发-JavaScript 客户端存储

    八.前端开发语言体系-JavaScript 客户端存储 文章目录 八.前端开发语言体系-JavaScript 客户端存储 JavaScript 客户端存储 客户端存储简介 Cookie LocalSt ...

  7. vc开发soap客户端(方式一)

    SoapSerializer SoapSerializer对象用来构建一个向Web服务发送的SOAP消息.在与服务器连接前,SoapSerializer对象必须与 SoapConnector对象连接. ...

  8. sqoop2 java api实现_Sqoop2 Java客户端API指南

    原文连接:http://sqoop.apache.org/docs/1.99.6/ClientAPI.html Sqoop Java客户端API指南 这篇文章秒描述了额如何在外部应用中使用sqoop ...

  9. 一个Web开发的客户端基础技术测试Demo

    最近参加了一个Web开发的客户端基础技术测试,虽然对于做前台开发的程序员来说比较简单,但对于一直做后台代码编写的程序员想掌握前台开发的基础来说,应该是一个比较好的Demo.对于Web初学者来说,也是一 ...

最新文章

  1. 详解pytorch中的常见的Tensor数据类型以及类型转换
  2. 重新上课,学习HTML的第一天
  3. 获取数组中连续相同的元素
  4. 使用Spring Security的多租户应用程序的无状态会话
  5. 2004-4-3+ asp.net编程环境的配置
  6. java 类确定运行时间_java回调函数实例:实现一个测试函数运行时间的工具类
  7. mysql sql高级应用程序_mysql-sql高级应用
  8. php 项目中引用对方接口_关于PHP中为什么要写接口的问题说明
  9. 区块链应用开发人员_每个区块链开发人员都应该了解这些Web3和Metamask用例
  10. 测试交友软件哪个最好用,陌陌与比邻你觉得哪个好用?陌陌比邻两大交友软件对比...
  11. ai 道德_AI如何提升呼叫中心的道德水平?
  12. 怎么用计算机管理员删除文件,管理员权限删除,教您如何删除需要管理员权限的文件夹...
  13. 抖音超火的动态图如何做 怎么制作GIF
  14. Error: Flash Download failed - Target DLL has been cancelled报错
  15. 计算机 英语词汇 缩写,计算机相关的53个英语单词缩写
  16. 清子指弹FC吉他五重奏nes《最终幻想1 》地图音乐步行 (FC游戏音乐)
  17. 【课堂笔记精选】为了能够用“Unity”软件做游戏,我要从最基础的开始复习JavaScript...
  18. 微信云开发-后端-快速上手
  19. Windows API函数 (绘图函数)
  20. 余弦定理对比文本相似度实现查重

热门文章

  1. 用应用封装来提高移动安全,这合适吗?
  2. linux下memcached安装 和redis安装,jdk,tomcat,mysql 安装
  3. linux下单节点oracle数据库间ogg搭建
  4. IT痴汉的工作现状25-技术之养成
  5. JS打字效果的动态菜单代码分享
  6. Mysql一些重要配置参数的学习与整理(一)
  7. dojo 学习笔记之dojo.query - query(id) 与query(class)的差别
  8. 关于算法中的并查集,写的很有意思,转过来看看~
  9. CentOS5.3编译安装mod_jk_1.2.15_链接器_整合apache_httpd和tomcat
  10. 明白了最基本的压缩原理