《网络编程技术(西电课件)第6章.ppt》由会员分享,可在线阅读,更多相关《网络编程技术(西电课件)第6章.ppt(65页珍藏版)》请在三一文库上搜索。
1、1,第6章 开发Internet应用程序,Internet应用程序的开发通常包括Internet服务端和客户端的应用程序, Microsoft提供了大量的API函数来支持这两种程序,客户端应用程序主要通过Internet协议(如Gopher,FTP,HTTP等)来从网络服务器上获取数据,提供访问Internet的功能,服务器端应用程序则用来支持HTTP、FTP或Gopher等类型的服务,你了解FTP协议吗?,2,你了解FTP协议吗?,3,FTP客户端 = TCP客户端 + 固定文字响应规范,FTP协议,4,这是第五章利用CAsyncSocket类实现的TCP客户端,按照FTP协议要求,给FTP
2、服务器发送用户名,10,6.1 Internet应用程序开发的几种类型,使用WinInet类开发Internet应用程序:WinInet类支持HTTP、FTP和Gopher等标准的协议,使用Windows Socket开发Internet应用程序:Winsock标准定义了一个DLL接口来连接Internet,MFC使用CAsyncSocket和CSocket类对接口进行了封装。,使用消息收发API(MAPI:Message API) 开发Internet应用程序:使用MAPI可以很方便的向其他应用程序发送电子邮件、语音邮件或传真等功能,11,6.2 WinInet开发简介,用WinInet开发
3、程序的优点,隐藏协议细节,简化编程:可不必深入了解协议,而使用WinSocket编程,需理解网络通信及协议基本原理,熟悉的编程接口:WinInet API函数和很多WinAPI函数很相似,这对有编程经验的程序员来说是很方便的。,稳定性好,不要求程序与底层直接联系:WinInet隐藏了协议的具体细节,使得程序不必直接使用各种协议,支持数据缓存:WinInet函数为所有的协议提供缓存能力,程序员只需关心数据而不用去管理数据缓存,支持多线程:由于WinInet函数在内部处理多线程的并发问题,因此WinInet函数支持多线程,在多线程中可以调用各种WinInet函数而不用担心发生问题或死锁,12,6.
4、3 WinInet类介绍,WinInet类是一个总称,目前的版本中分为四组 CInternetSession类 CInternetConnection (连接类) CFileFind类(Internet文件查找类) CInternetFile类和CGopherLocator类,13,6.3.1 CInternetSession类,CInternetSession类直接继承自CObject类,该类用来建立与某个Internet服务器的会话。还可以向代理服务器描述连接,如果应用程序所使用的Internet连接必须保持一段时间,则可以在CWinApp类中创建相应的CInternetSession成员
5、,14,QueryOption 提供一个可能的错误检测判断 SetOption 设置Internet会话的选项 OpenURL 设置URL,并对其进行分析 GetFtpConnection 打开一个FTP会话并进行连接 GetHttpConnection 打开HTTP服务器并进行连接 GetGopherConnection 打开Gopher服务器并进行连接 EnableStatusCallback 建立异步操作的状态回调 ServiceTypeFromHandle 通过Internet句柄返回服务器类型 GetContext 获取Internet和应用程序会话句柄 Close 关闭Intern
6、et连接,CInternetSession类成员函数,15,6.3.2 CInternetConnection类,包括CInternetConnection类及其派生类CHttpConnection、CFtpConnection和CGopherConnection类, 这些类帮助用户管理与Internet服务器的连接,同时还提供一些函数完成和响应服务器的通信,16,CInternetConnection:用于管理与Internet服务器的连接 CFtpConnection:用于管理与FTP服务器的连接,可以对服务器上的文件和目录进行直接操作 CGopherConnection:管理与Gophe
7、r服务器的连接 CHttpConnection:管理与HTTP服务器的连接,连接类及其派生类,17,6.3.3 CInternetFile类,包括CInternetFile类及其派生类CHttpFile、CGopherFile。这些类实现对远程系统上的文件的存取工作。 文件类还包含CFileFind类及其派生类CFtpFileFind、CGopherFileFind类。CFileFind类直接继承于CObject类,这些类实现对本地和远程系统上的文件的搜索和定位工作。,18,CInternetFile:允许对使用Internet协议的远程系统中的文件进行操作 CGopherFile:为在Gop
8、her服务器上进行文件检索和读取操作提供支持 CHttpFile:提供对HTTP服务器上的文件进行操作的支持 CFindFile:文文件检索提供支持 CFtpFileFind:为在FTP服务器上进行的文件检索操作提供支持 CGopherFileFind:为在Gopher服务器上进行的文件检索操作提供支持,文件类说明,19,6.3.4 CGopherLocator类,在从Gopher服务器中获取信息之前,必须先获得该服务器的定位器,而CGopherLocator类的主要功能就是从Gopher服务器中得到定位并确定定位器的类型。,20,6.4 用WinInet类开发应用程序,编写支持Interne
9、t的应用程序一般步骤: (1)创建一个CInternetSession对象:由于Internet会话是通过CInternetConection类的对象实现的,因此首先要创建一个CInternetSession对象,建立一个Internet会话。 (2) 查询或设置Internet选项:在连接时,有时还要查询或设置Internet 选项,这个工作可以通过QueryOption或SetOption函数来完成。这个步骤是可选的。,21,(3)建立与服务器的连接:客户应用程序要与服务器协同工作,在创建了CInternetSession对象后,就需要建立到服务器的连接。根据不同的协议,可选用GetFtp
10、Connect、GetHttpConnect和GetGopherConnect三种方法中的一种。 (4)向用户反馈当前数据处理的进程信息:有时客户的应用程序在进行某些操作时,要耗费较长的时间,因此需要向用户反馈当前的状态,这个工作由EnableStatusCallback函数来完成,此时还要重载OnStatusCallBack函数以实现回调函数的功能。,22,(5)创建文件检索类对象,对服务器进行检索:例如对于FTP协议可以调用CFTPFileFind类来对FTP服务器上的文件进行查询,然后全部列出来 (6)创建CInternetFile实例:调用CInternetSession类的成员函数O
11、penURL建立与服务器的连接,函数返回一个CInternetFile指针。 (7)文件读写操作:调用CInternetFile:Read或CInternetFile:Write函数对所得到得服务器文件进行读写操作。,23,(8)异常处理:为提高应用程序的可靠性和容错性,必须对可能出现的问题进行处理,这种处理通常是通过调用CInternetException类的对象对目前可知的异常进行处理。 (9)结束:调用CInternetSession:Close结束会话并销毁CInternetSession对象。,创建CInternetSession类对象 创建CInternetSession类对象,将
12、创建并初始化Internet会话。像其它类一样,创建CInternetSession类对象需要执行该类的构造函数,它的原型是: CInternetSession( LPCTSTR pstrAgent = NULL, /标识所有者 DWORD dwContext = 1, /允许消息回调函数 DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS, /注册表默认 LPCTSTR pstrProxyName = NULL, /采用哪个代理 LPCTSTR pstrProxyBypass = NULL,/跳过某些 DWORD dwFlags = 0 );,CI
13、nternetSession示例,25,CInternetSession* pSession; /定义会话对象指针变量 pSession=new CInternetSession( / 创建Internet会话类对象 AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS);,查询或设置Internet请求选项 创建CInternetSession类对象后,可以调用它的QueryOption成员函数查询Internet请求选项,调用它的SetOption成员函数来设置这些选项。,创建连接类对象 通过调用CInternetSession对象的GetFtpCo
14、nnection、GetHttpConnection、GetGopherConnection成员函数,可以分别建立CInternetSession对象与网络上FTP、HTTP、和GOPHER服务器的连接。并分别创建CFtpConnection、CHttpConnection、CGopherConnection类的对象,来代表这三种连接。,28,CFtpConnection* pConnection; /定义连接对象指针变量 /pSession是已建立的CInternetSession类实例 /m_strFtp存放了FTP服务器域名 /m_strName 存放了用户名 /m_strPwd存放了密
15、码 pConnection=pSession-GetFtpConnection(m_strFtp,m_strName,m_strPwd);,创建连接类的示例,使用文件检索类 CFtpFileFind类和CGopherFileFind类分别封装了对于FTP和Gopher服务器的文件检索操作。它们的基类是CFileFind类。创建了连接对象后,可以进一步创建文件检索类对象,并使用该对象的方法实现对服务器的文件检索。,创建文件检索类的对象实例 一般直接调用CFtpFileFind类的构造函数创建该类的对象实例。应当将前面所创建的FTP连接对象指针作为参数。构造函数的原型是: CFtpFileFind
16、( CFtpConnection* pConnection, / 连接对象指针 DWORD dwContext = 1); / 表示此操作的环境值 例如: CFtpFileFind* pFileFind; /pConnection 是已经建立的CInternetSession pFileFind = new CFtpFileFind(pConnection);,检索第一个符合条件的对象 使用CFtpFileFind类的FindFile成员函数可以在FTP服务器上或本地缓冲区中找到第一个符合条件的对象。 virtual BOOL FindFile( LPCTSTR pstrName = NULL
17、, / 指定要查找 /的文件路径,可以使用通配符。例如“*.*” DWORD dwFlags = INTERNET_FLAG_RELOAD); / 从哪里检索 /默认从网上获取,即使本地缓冲区中有信息,查询符合条件的实例,32,BOOL bContinue; /存放返回值 /pFileFind 存放了CFtpFileFind对象实例 bContinue=pFileFind-FindFile(“*.txt“); / 查找服务器上当前目录的txt文件,继续查找其它的符合条件的对象 在上一步的基础上,反复地调用FindNextFile成员函数,可以找到所有符合条件的对象。直到函数返回FALSE为止。
18、FindNextFile 用于继续进行FindFile调用的文件检索操作。 virtual BOOL FindNextFile(); 每查到一个对象,随即调用GetFileURL成员函数,可以获得已检索到的对象的URL。 CString GetFileURL() const;,其它可用的成员函数 CFtpFileFind类本身定义的成员函数只有上面几个。但是由于它是从CFileFind类派生的,它继承基类CFileFind的许多成员函数,例如GetCreationTime GetFileName GetFilePath GetFileTitle GetLastAccessTime GetLas
19、tWriteTime GetLength 等等,可以进行各种文件检索相关的操作。,6.5 一个文件查找的例子,35,输入FTP服务器域名 输入用户名、密码 可以查询到FTP服务器中的目录和文件列表 可以上传、下载文件,36,37,38,39,编辑框1 IDC_EDIT_SERVERNAME 编辑框2 IDC_EDIT_NAME 编辑框3 IDC_EDIT_PASSWORD 下压式按钮 IDC_BUTTON_CHECK 下压式按钮 IDC_ BUTTON _UPLOAD 下压式按钮 IDC_ BUTTON _DOWNLOAD 下压式按钮 IDC_BUTTON_QUIT 列表框 IDC_LIST_
20、FILE,40,41,在对话框添加声明CInternetSession变量,42,43,44,关键1步:创建CInternetSession对象,45,46,47,void CFtpDlg:OnButtonCheck() / TODO: Add your control notification handler code here UpdateData(TRUE); if(!m_ServerName.IsEmpty() / 如果用户有输入才登陆FTP服务器查找 CFtpConnection *FtpConn = m_Session-GetFtpConnection(m_ServerName,m
21、_Name,m_Password); / 从CInternetSession中建立FTP 连接 CFtpFileFind *pFtpFind = new CFtpFileFind(FtpConn); / 从FTP 连接中建立FTP文件查找类实例 BOOL bContinue = pFtpFind-FindFile(“*.*“); if (!bContinue) / 如果一个文件都找不到,结束查找 pFtpFind-Close(); pFtpFind=NULL; ,/创建FTP连接类对象,48,pFtpFind-FindNextFile(); /MSDN上讲述,在GetFileName()之前/
22、必须调用一次FindNextFile(),故原书上的例子有错 CString strFileName; while (bContinue) / 找到了第一个文件,继续找其它的文件 strFileName=pFtpFind-GetFileName(); / 获得找到的文件的文件名 / 如果找到的是否目录,将目录名放在括弧中 if (pFtpFind-IsDirectory() strFileName=“+strFileName+“; / 将找到的文件或目录名显示在列表框中。 m_ListFile.AddString(strFileName); bContinue=pFtpFind-FindNex
23、tFile(); / 查找下一个文件 /其他处理,比如用完之后的连接关闭等等,49,FTP工具,50,3COM 3CDaemon Serv-U FTP Server 建议大家回去试试,小结,51,TCP协议客户端能完成FTP协议客户端的功能,但是必须先了解FTP协议 同理,TCP协议服务器能完成FTP协议服务器的功能 利用Socket开发FTP这样的常见协议软件有点复杂,直接利用FTP相关类更方便些,52,6.6 WinInet类编程实例,这一次我们要利用WinInet类编写Internet应用程序,完成3种协议。在URL编辑框中写入地址,单击“Http”、“Ftp”或“Gopher”等按钮可
24、在编辑框中显示查询到的相应服务器的信息,编辑框1 IDC_EDIT_URL 编辑框2 IDC_EDIT_RESULT 下压式按钮 IDC_BUTTON_HTTP 下压式按钮 IDC_ BUTTON _FTP 下压式按钮 IDC_ BUTTON _GOPHER 下压式按钮 IDC_BUTTON_QUIT 静态文本 IDC_STATIC 组框 IDC_STATIC,53,给界面对象连接接变量,54,(a) 给应用程序增加一个自定义的类,单击InsertNew Class菜单,添加新类类名为CMyWinInetClass,系统会自动在项目中增加MyWinInetClass.cpp和MyWinInet
25、Class.h两个文件,55,(b)在新加入的类中增加如下三个public的成员函数,在头文件MyWinInetClass.h中可看到这些函数。 CString ConnectFtp(const CString sUrl); /完成连接Ftp功能的函数 CString ConnectHttp(const CString sUrl); /完成连接Http功能的函数 CString ConnectGopher(const CString sUrl); /完成连接Gopher功能的函数,56,为了建立Internet的会话,新增加的CmyWinInetClass类中加入一个private型成员变量m
26、_session: CInternetSession m_session; /建立Internet会话 由于在上面定义了一个CWinInet类的对象,所以还需要在MyWinInetClass.h头文件中加入如下代码: #include “afxinet.h“ #include “wininet.h“,57,为CMyWinInetClass类添加三个用于连接的成员函数,它们分别是ConnectFtp、ConnectHttp和ConnectGopher。 CString CMyWinInetClass:ConnectFtp(const CString sUrl) CString sResult;
27、/存储连接信息的字符串 CFtpConnection *Ftpconnection=NULL; sResult=“; sResult=sResult+“Trying to connect Ftp sites“+sUrl+“rn“; Ftpconnection=m_session.GetFtpConnection(sUrl); /建立到Ftp服务器的连接,58,if(Ftpconnection) sResult=sResult+“Connection established.rn“; CString sCurDir; Ftpconnection-GetCurrentDirectory(sCurD
28、ir); /得到Ftp服务器的当前目录 sResult=sResult+“current directory is“+sCurDir+“rn“; Ftpconnection-Close(); /关闭连接 else sResult=sResult+“There are some errors in finding this Ftp sites“; return sResult; ,59,CString CMyWinInetClass:ConnectHttp(const CString sUrl) CString sResult; CInternetFile *hHttpFile=NULL; sR
29、esult=“; sResult=sResult+“Trying to connect Http sites“+sUrl+“rn“; hHttpFile=(CInternetFile *)m_session.OpenURL(sUrl); /得到文件指针 if(hHttpFile) sResult=sResult+“Connection established.rn“; CString sLine; while(hHttpFile-ReadString(sLine) /读取Http服务器上的内容 sResult=sResult+sLine+“rn“; hHttpFile-Close(); /关闭
30、连接 else sResult=sResult+“There are some errors in finding this Http sites“; return sResult; ,60,CString CMyWinInetClass:ConnectGopher(const CString sUrl) CString sResult; CInternetFile *hGopherFile=NULL; sResult=“; sResult=sResult+“Trying to connect Gopher sites“+sUrl+“rn“; hGopherFile=(CInternetFil
31、e *)m_session.OpenURL(sUrl); /得到文件指针 if(hGopherFile) sResult=sResult+“Connection established.rn“; CString sLine; while(hGopherFile-ReadString(sLine) /读取Gopher服务器内容 sResult=sResult+sLine+“rn“; hGopherFile-Close(); /结束连接 else sResult=sResult+“There are some errors in finding this Gopher sites“; return
32、 sResult; ,61,在CMyInternetDlg类中增加一个public成员变量 CMyWinInetClass m_WinInetClass; 变量m_WinInetClass是CMyWinInetClass类的一个对象,所以还要在WinInetDlg.h头文件加入自定义类的头文件: #include “MyWinInetClass.h“,62,三个消息处理函数增加代码如下: void CWinInetDlg:OnButtonFtp() UpdateData(TRUE); /从对话框读入地址信息m_Url m_EditResult=“; /调用自定义类的成员函数,连接Ftp服务器,
33、m_Url为地址 m_EditResult=m_EditResult+m_WinInetClass.ConnectFtp(m_Url); UpdateData(FALSE); void CWinInetDlg:OnButtonHttp() UpdateData(TRUE); /从对话框读入地址信息m_Url m_EditResult=“; /调用自定义类的成员函数,连接Http服务器,m_Url为地址 m_EditResult=m_EditResult+m_WinInetClass.ConnectHttp(m_Url); UpdateData(FALSE); ,63,void CWinInetDlg:OnButtonGopher() UpdateData(TRUE); /从对话框读入地址信息m_Url m_EditResult=“; /调用自定义类的成员函数,连接Gopher服务器,m_Url为地址 m_EditResult=m_EditResult+m_WinInetClass.ConnectGopher(m_Url); UpdateData(FALSE); ,64,65,
链接地址:https://www.31doc.com/p-2159477.html