MFCFTP文件传输要点.pdf

上传人:tbuqq 文档编号:5197550 上传时间:2020-02-19 格式:PDF 页数:23 大小:1.49MB
返回 下载 相关 举报
MFCFTP文件传输要点.pdf_第1页
第1页 / 共23页
MFCFTP文件传输要点.pdf_第2页
第2页 / 共23页
MFCFTP文件传输要点.pdf_第3页
第3页 / 共23页
MFCFTP文件传输要点.pdf_第4页
第4页 / 共23页
MFCFTP文件传输要点.pdf_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《MFCFTP文件传输要点.pdf》由会员分享,可在线阅读,更多相关《MFCFTP文件传输要点.pdf(23页珍藏版)》请在三一文库上搜索。

1、大学研究生堂下考试答卷 2014-2015学年第1 学期 考试科目 姓名 年级 专业 2014年 12 月 28 日 面向对象程序设计课程报告 学号:姓名:学院: 题 目 基于 MFC 的聊天室与 FTP 文件传输系统 选 题 背 景 首先经过一个学期关于C+的学习,我们希望能够运用所学的知识 做出一些具有使用价值的产品。另外,由于本身专业是通信工程,基于 对通信软件编程方面兴趣,希望能够在完成课程设计的同时能够加深自 己对通信底层原理的理解。 因此我们选择的题目是基于MFC 的网络聊天 室与 FTP 文件传输的编程。并且希望最后编写好的程序能够在同学之间 进行交流以及文件共享方面具有一定的实

2、用价值。最后,希望在完成编 程的过程中提高自己C+方面的能力以适应今后的学习与发展。 实现的功能: 1 支持多个客户端与服务器端之间的连接。 2 支持客户端与客户端之间的通信。 3 支持服务器端与客户端之间的通信。 4 FTP 客户端方面支持文件的下载、上传、以及删除的功能。 5 FTP 文件传输方面拥有两个客户端, 一个是用于单线程的, 另一个是 用于多线程的,本实例对两个客户端的工作方式进行了对比。 实现环境及开发工具: 1.windows 7/8.1 操作系统(实现环境) 2.visual studio2010/2013(开发工具) 3.MSDN2008(帮组文档) 4.StarUML(

3、UML 制图工具) 基 础 知 识 由于本实例是通信网络编程,使用到了很多网络通信方面的知识, 其中包括 WinSock 编程以及 WinInet 编程。下面介绍一下两类编程的基 础知识。 一、 WinSock 编程 1.介绍 套接字是支持TCP/IP 网络通信的基本操作单元。多个TCP 连接或 多个应用程序进程可能需要通过同一个TCP 协议端口传输数据。 为了区 别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP/IP 协议交互提供了称为套接字(Socket)的接口。套接字为不同的应用 进程使用网络协议进行数据交换提供了接口,主要用于应用层与传输层 之间。 套接字分为三类:流

4、式套接字、报文套接字以及原始套接字。其中 最常使用的是流式套接字与报文套接字。流式套接字是面向连接的,在 数据传输之前需要在双方之间建立起连接,主要用于TCP 业务;报文套 接字是面向无连接的,在数据传输之间无需建立连接,只需要知道对方 的 IP 网络地址已经对应的业务端口就可以把业务发送到目的端,报文套 接字主要是用于传输基于UDP 的业务。 由于 Windows 提供了 SOCKET 的 API 函数, 因此简化了整个套接字 应用编程的难度,但是对于一般的初学者来说使用SOCKET API 函数进 行编程还是具有一定的难度,其主要适用于对整个协议工作过程有深入 了解的专业人士使用。因此为了

5、降低编程的门槛,微软公司将SOCKET API 函数封装为了一个新的类CAsyncSocket类,通过调用 CasyncSocket 类的成员函数就能够完成网络编程的功能。但是,CasyncSocket 的封装 性对于一般用户来说还是太过于复杂,对于一般人的使用还是有一定的 难度,因此微软又在CAsyncSocket 类的基础上派生了 CSocekt类,极大 地简化了套接字的编程。本实例采用的就是CSocket编程。 2.套接字工作过程 由于本实例是采用C/S 模式进行编程,是由客户端与服务器端组成 的。流式套接字与报文套接字编程的原理是不一样的。 流式套接字原理 流式套接字是面向连接的, 在

6、进行数据传输之前需要在服务器与客户 端之间先建立起连接。其建立连接的过程主要分为四步。 i服务器端初始化套接字并绑定端口。 ii.服务器端套接字启动监听状态,调用Listen()函数。 iii 客户端端建立套接字并绑定端口。 iv.客户端请求连接。 v.服务器端接受连接请求。 其工作过程见图 1.1。 图 1.1:流式套接字工作过程 报文套接字工作原理 报文套接字不需要在数据传输之间建立连接,只需绑定对应的端口然 后将数据发往对应的网络地址即可。其工作过程见图1.2。 图 1.2:报文套接字工作过程 二、 WinInet 编程 WinInet 是 windows internet 扩展应用程序

7、高级编程接口, 是专为开发 具有 Internet 功能的客户机端应用程序而提供的。它有两种形式: WinInet API 包含一个 C 语言的函数集, MFC WinInet 类则是对前者的面向对象 的封装。 WinInet 主要用于 Internet 关于 FTP 文件传输协议, HTTP 超文 本传输协议以及 Gopher文件传输协议。 MFC 中 WinInet 包含的类 i.CinternetSession类:由 CObject 类派生,代表应用程序的一次Internet 会话,每个访问 Internet 的应用程序都需要一个CInternetSession类对象。 ii. 连接类:

8、连接类主要包括CinternetConnection 类以及它的派生类 CFtpConnection类、CHttpConnection 类和 CGopherConnection类。 iii. 文件类: 包括 CInternetFile 类以及它派生的 CHttpFile 类和 CGopherFile 类,另外文件查找类CFileFind 也是文件类。 iv.CInternetException 类:MFC WinInet 类的成员函数在执行时所发生的 错误或异常,往往用try/catch 逻辑结构来处理异常。 WinInet 编程的步骤 i.创建 CInternetSession类对象,创建并

9、初始化Internet会话 ii.创建连接对象类,建立CInternetSession对象与网络服务器的连接,也 就是应用程序与服务器的连接。本实例创建CFtpConnection类。 iii. 创建文件检索类,对文件进行检索。 iv.创建异常类 CInetnetException类,处理错误。 v.关闭各种类,释放资源。 三、多线程编程 Windows 本身是一个多进程多线程的操作系统,因此在日常的应用 编写中最好能够使用多线程的技术。在windows 环境下开发多线程应用 程序可以利用提供的Win32API 接口函数,也可以利用微软提供的MFC 类库进行开发。两种方式对于多线程编程原理是一

10、样的,用户可以根据 需要选择相应的工具。 本实例主要用到的是MFC 类库实现多线程调度与 处理。 MFC 类库提供了对多线程编程的支持,使得多线程能方便的实现。 MFC 区分两种类型的线程:工作线程和用户接口线程。工作线程没有消 息机制,通常用来执行后台计算和维护任务。MFC 为用户接口线程提供 消息机制,用来处理用户的输入, 响应用户产生的事件消息。 但对于 Win32 的 API 来说,这两种线程并没有区别,它只需要线程的启动地址便启动 线程执行任务。用户接口线程的一个典型应用就是类CWinApp, 类 CWinApp 是 CWinThread 类的派生类,应用程序的主线程是由它提供, 并

11、由它负责处理用户产生的事件和消息。 系 统 设 计 本实例借用 StarUML软件绘制了整个程序的UML类视图,这个类视 图在前期的代码编写上提供了很多帮助。UML类视图能够清晰地表明类与 类之间的关系以及各个类所具有成员函数与成员变量。 1. 客户端类视图 2.服务器端类视图 系 统 实 现 FTP 文件传输客户端 一、单线程 FTP 客户端设计步骤 1. 之 前 在CClientDlg类 中 已 经 添 加 了 两 个 对 话 框 的 资 源 , 为 IDD_DIALOG_FTP 对话框添加控件以及为控件添加成员变量。其界面布 局以及成员变量之间的关系分别如图2.1 表 2.1 所示。在头

12、文件中添加头 文件#include。 图 2.1:FTP 客户端 表 2.1:单线程客户端添加成员变量 控件类型ID 变量名控件类型ID 变量名 CButton IDC_BUT TON_DO WNLOA D m_btnDo wnload CButton IDC_BUT TON_R MOVE m_btnrem ove CButton IDC_BUT TON_U PLOAD m_btnUp load CString IDC_EDI T_PWD m_strPwd CString IDC_EDI T_USER NAME m_strUser name CString IDC_EDI T_SERVE RN

13、AME m_strServ ername CListBox IDC_LIST _FIEL m_listFile CButton IDOK m_btnquer y 2. 为按钮添加消息响应: 为“查询”按钮添加消息响应void CFtpDlg:OnQuery(),用于查询 FTP 服务器端上的文件。 具体代码如下: void CFtpDlg:OnQuery() / TODO: 在此添加控件通知处理程序代码 /m_btnDownload.EnableWindow(TRUE); strflag = “; /初始化初始路径 UpdateData(TRUE); while (m_listFile.Get

14、Count() != 0)m_listFile.DeleteString(0);/ 清空列表 框 List(“); / 查询 服务 器上的文件 m_btnUpload.EnableWindow(TRUE); m_btnDownload.EnableWindow(FALSE); m_btnremove.EnableWindow(FALSE); 为“下载”按钮添加消息响应void CFtpDlg:OnDownload() ,用于下载 FTP 服务器端的文件。具体代码如下: void CFtpDlg:OnDownload() / TODO: 在此添加控件通知处理程序代码 int sel = m_li

15、stFile.GetCurSel(); CString strfilename; m_listFile.GetText(sel, strfilename);/获取要下载文件的文件名 if (strfilename.GetAt(0) !=) /判断是否为文件夹,如果不为文件 夹便下载 CString strpathname; CFileDialog dlg(FALSE, “, strfilename);/新建一个文件对话框, FALSE 表示为存储类型对话框,详情见MSDN if (dlg.DoModal() = IDOK) strpathname = dlg.GetPathName(); /保

16、存文件要存储的路 径 strfilename = strflag + strfilename; if (Download(strfilename, strpathname)/调用 download函数下 载文件 MessageBox(“下载成功 “); else MessageBox(“下载失败 “); else MessageBox(“不能下载目录 “); 为“上传”按钮添加消息响应void CFtpDlg:OnUpload(),用于上传文 件到 FTP 服务器。具体代码如下: void CFtpDlg:OnUpload() / TODO: 在此添加控件通知处理程序代码 UpdateData

17、(TRUE); CString strfilename; CString strpathname; CFileDialog dlg(TRUE);/ 创建用于上传类型的文件对话框 if (dlg.DoModal() = IDOK) strfilename = dlg.GetFileName();/保存文件名 strpathname = dlg.GetPathName();/ 保存文件路径 if (Upload(strpathname, strfilename)/调用上传函数 MessageBox(“上传成功 “); else MessageBox(“上传失败 “); else MessageBo

18、x(“请选择文件 “); 为“删除”按钮添加消息响应void CFtpDlg:OnRemove() ,用于删除 FTP 服务器上的文件。具体代码如下: void CFtpDlg:OnRemove() /删除文件 / TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); CInternetSession* psession; CFtpConnection* pconnect; pconnect = NULL; psession = new CInternetSession(AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS); t

19、ry pconnect = psession-GetFtpConnection(m_strServername, m_strUsername, m_strPwd); catch (CInternetException* e) e-Delete(); pconnect-Close(); int sel = m_listFile.GetCurSel(); CString strfilename; m_listFile.GetText(sel, strfilename); if (strfilename.GetAt(0) != ) int flag=MessageBox(“是否删除文件 “, “删除

20、“, MB_YESNO); if (flag = IDYES) pconnect-Remove(strfilename); MessageBox(“删除成功 “); else MessageBox(“不能删除文件夹 “); 3.为 CFtpDlg 类添加成员函数 添 加 用 于 查 询 服 务 器 文 件 的 函 数void CFtpDlg:List(CString strsourcename) ,具体代码: void CFtpDlg:List(CString strsourcename) CInternetSession* psession; /新建一个 Internet会话 CFtpCon

21、nection* pconnect; /建立一个用于 ftp 连接的指针 CFtpFileFind* pfilefind; /建立一个用于文件查询的指针 CString strfilename; pconnect = NULL; pfilefind = NULL; BOOL bContinue; psession = new CInternetSession();/ 初始化 internet 会话对象 try pconnect = psession-GetFtpConnection(m_strServername, m_strUsername, m_strPwd);/ 通过 internet

22、会话对象调用函数创建ftp 连接 catch (CInternetException* e) e-Delete(); pconnect = NULL; if (pconnect != NULL) pfilefind = new CFtpFileFind(pconnect); /初始化文件查找指 针 if (strsourcename = “) bContinue = pfilefind-FindFile(“*“); /如果为初始路径查找 全部文件,返回值为bool 型 else bContinue = pfilefind-FindFile(strsourcename);/查找相应路 径文件 i

23、f (!bContinue) pfilefind-Close(); pfilefind = NULL; while (bContinue) bContinue = pfilefind-FindNextFileA(); /继续查找下一 个文件 strfilename = pfilefind-GetFileName(); /获得文件名 if (pfilefind-IsDirectory() /判断是否为目录 strfilename = “ + strfilename + “; /如果为目录则加上 中括号显示 m_listFile.AddString(strfilename); /将文件名加入到列

24、表框中 if (pfilefind != NULL) pfilefind-Close(); pfilefind = NULL; delete pfilefind; if (pconnect != NULL) pconnect-Close(); delete pconnect; delete psession; 添加响应单击列表框的消息效应void CFtpDlg:OnDblclkListFile() ,用 于获取列表框文件的信息。具体代码: void CFtpDlg:OnSelchangeListFile() / TODO: 在此添加控件通知处理程序代码 m_btnquery.EnableWi

25、ndow(TRUE); m_btnremove.EnableWindow(TRUE); m_btnDownload.EnableWindow(TRUE); 添加响应双击列表框的消息响应void CFtpDlg:OnSelchangeListFile(), 用于双击列表框时获取信息。代码如下: void CFtpDlg:OnDblclkListFile() / TODO: 在此添加控件通知处理程序代码 CString strfilename; int sel = m_listFile.GetCurSel(); /获得双击文件在列表框中的位 置索引 m_listFile.GetText(sel,

26、strfilename); /调用 gettext 获得文件名并将其 存入字符串中 int length = strfilename.GetLength(); /获取文件名的长度 if (strfilename.GetAt(0) = ) /判断是否为文件夹 strfilename = strfilename.Mid(1, length - 2); strflag += strfilename + “/“; /保存新的路径 while (m_listFile.GetCount() != 0) m_listFile.DeleteString(0);/ 清空列表 框 List(strflag); /

27、调用列表框查询新路径下的文 件 添 加 下 载 文 件 函 数 , 用 于 下 载 服 务 器 端 的 文 件BOOL CFtpDlg:Download(CString strfilename, CString strpathname) 。 BOOL CFtpDlg:Download(CString strfilename, CString strpathname) UpdateData(TRUE); CInternetSession* psession; CFtpConnection* pconnect; pconnect = NULL; psession = new CInternetSe

28、ssion(AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS); try pconnect = psession-GetFtpConnection(m_strServername, m_strUsername, m_strPwd); catch (CInternetException* e) e-Delete(); pconnect-Close(); return FALSE; if (pconnect != NULL) if (!pconnect-GetFile(strfilename, strpathname)/调用 getfile 文件 下载文

29、件 pconnect-Close(); delete pconnect; delete psession; return FALSE; if (pconnect != NULL) pconnect-Close(); delete pconnect; delete psession; return TRUE; 添 加 上 传 文 件 函 数 , 用 于 上 传 文 件 到 服 务 器 端BOOL CFtpDlg:Upload(CString strpathname, CString strfilename) 。代码如下: BOOL CFtpDlg:Upload(CString strpathna

30、me, CString strfilename) UpdateData(TRUE); CInternetSession* psession; CFtpConnection* pconnect; pconnect = NULL; psession = new CInternetSession(AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS); try pconnect = psession-GetFtpConnection(m_strServername, m_strUsername, m_strPwd); catch (CInternetExcep

31、tion* e) e-Delete(); pconnect-Close(); return FALSE; if (pconnect != NULL) if (!pconnect-PutFile(strpathname, strfilename)/ 上传文件 pconnect-Close(); delete pconnect; delete psession; return FALSE; if (pconnect != NULL) pconnect-Close(); delete pconnect; delete psession; return TRUE; 4.为 CFtpDlg 类添加成员变

32、量 CString strflag,用于存储查询文件的路径。 二、多线程 FTP 文件传输客户端设计步骤 由于 MFC 中的多线程分为用户接口线程和工作线程,本实例主要用 到的是工作线程。工作线程主要作用是在需要启动该线程函数的时候只 需调用 AfxBeginThread()函数即可。此函数的作用是调用对应的线程函数 以实现对应的功能。功能函数的函数原型如下: UINT ThreadFunc(LPVOID pParam) if(pParam=NULL) AfxEndThread(NULL); 其中参数 pParam是一个空指针,其可以指向任意的数据类型,只需在对 应的线程函数下编写函数的功能即

33、可。 1.为 IDD_DIALOG_MTFTP对话框添加相应的控件,然后为相应的控件 添加成员变量。界面布局与成员变量的添加均与之前单线程FTP 客户端 一样,详情见图 2.1 和表 2.1。 2 为按钮添加消息响应 为“查询”按钮添加消息响应void MTFtpDlg:OnQuery() ,用于启动查 询文件的线程函数。 为“下载”按钮添加消息响应void MTFtpDlg:OnDownload() ,用于启 动下载文件的线程函数。 为“上传”按钮添加消息响应void MTFtpDlg:OnUpload() ,用于启动 上传文件的线程函数。 为“删除”按钮添加消息响应void MTFtpDl

34、g:OnRemove() ,用于启动 删除文件的线程函数。 3.为 CMTFtpDlg 类添加成员函数和成员变量 添加成员变量 CString strhold,用于存储查询路径 ,添加成员函数 void MTFtpDlg:OnDblclkListFilemt() ,用于响应鼠标双击列表框消息,用于获 取问价信息。 4.功能函数编写 在 MTFtpDlg 类中添加一个头文件mtftp.h,用于编写各个线程函数, 其各功能函数的编程与之前的单线程FTP 客户端的编程几乎一样,只需 在各个对应的线程函数内编写即可。由于mtftp.h 中使用了 MFC 的类库 和WinInet的 函 数 , 所 以

35、需 要 在mtftp.h中 添 加 头 文 件 #include“MTFtpDlg.h“ ,#include。 三、运行结果 课 程 小 结 由于自己之前自学过C+编程,大学本科时也开设了相关MFC 编程 的课程,所以对C+编程有一定的了解。但是因为对于C+编程的基本 语法是通过自学的,还是有一定的局限性,因此在上面向对象程序设计 这门课的过程中老师还是帮助我解决了许多之前一直困扰我的疑惑。在 上课的过程中以及在课后关于程序的编写我都花了大量的精力,虽然比 较辛苦但是我还是比较快乐,特别满足于当遇到困难之后通过各种方法 将其解决之后的快感。 在做课程设计的过程中和组员一起收获了很多的快乐,不仅

36、能够巩 固 C+语言的基本理论知识,而且还能够发现自己的不足,在整个过程 中感觉 C+语言具有语言简洁、使用灵活、执行效率高等特点。另外也 发现了理论知识和实际动手操作还是有一定的区别,在整个过程中更加 深刻地理解了C+的抽象性、封装性、继承性、和多态性。通过本次的 课程设计我对整个程序设计的具体流程以及其中的原理有了更加深刻的 理解。由于本次课程设计是以小组的形式完成的,我深刻体会到了团队 的重要性,当我遇到困难时总是和组内成员一起讨论解决方案,多数情 填表日期:2014.12.24 况下问题会得到解决,即使有时问题无法当场解决,但是通过大家的讨 论也会对问题有更深一步地理解。在此,我要感谢

37、我的组员薛尧、李玉 菱两位同学,感谢他们和我一起共同面对问题,共同解决问题。 接下来我希望对课程提一点小小的建议,我希望在以后的课程中能 够增加实践环节,老师在课堂上可以布置一定的任务让同学们自己动手 操作,由于本身课程的学时比较少,只有通过这样的方式才能够推动同 学更加主动的去学习。 另外还要特别感谢一下甘玲老师,老师在课堂上讲课清晰、明确, 知识点的讲解非常生动、准确,讲课的过程非常幽默、易于接受。在学 习的过程中曾经遇到过许多问题也向老师请教过,感谢老师耐心的解答。 聊天室操作手册 本次基于 MFC 开发的聊天室主要由服务器和客户端构成,不同用 户可以通过客户端进行对话, 服务器也可以发

38、送服务器消息,在客户 端还可以进行文件传输,文件传输有单线程和多线程的区别。 一、界面介绍 1. 服务器 服务器界面如下图所示: 图 1.1:服务器 2. 客户端 客户端界面如下图所示: 图 1.2:客户端 二、连接过程 1. 服务器连接 首先运行服务器进行端口设置,这里默认值为7000 图 2.1:客户端连接示意图1 图 2.2:客户端连接示意图2 通过以上设置,服务器即已经初始化完成,等待客户端连入。 2. 客户端接入过程 图 2.3:客户端连接示意图 1 图 2.4:客户端连接示意图2 客户端连接时需要输入用户名、服务器地址I,这里由于是本机 测试输入localhost即可连入服务器,端

39、口也需要与服务器端口一 致,为默认值7000.按照上诉操作,当弹出socket 连接成功消息盒 时即表示当前客户端已经与服务器连接好了就可以进行消息发送了。 三、聊天界面 图 3.1:聊天界面 当多个客户端同时连接上服务器之后就可以直接进行聊天了,图示如3.1 所示。 四、FTP文件传输 1.FTP客户端界面 2. 器平台,利用这个软件可以创建一个用户,如图 图 4.2:Quick Easy FTP Server界面 从这里我们把 F 盘设为我们的根目录, 同时对其权限设置下载、 上传、改名、 删除、创建目录全部选上, 这样我们就可以对F 盘中的文件进行相应操作, 然后 启动服务器,等待FTP

40、 客户端连接。 3.操作流程 图 4.3:查询界面 我们可以看到在搭建好服务器之后,在FTP 客户端输入相应的服务器地址 并且用户名要与服务器创建的一致才能连接上,点击查询就出现了如图所示的界 面,显示的内容为 F 盘中的文件,此时就可以对这些文件进行上传、下载、删除 等操作了。 同时,多线程文件传输指的是在文件传输过程中可以多个任务同时进行,不 会因为一个下载、上传或者删除的操作而使得界面不可用,提高效率。 面向对象程序设计课程调查 为了进一步提高教学质量,使同学们能够更好地学习本门课程,达到课程教 学目标,现面向同学们做一个本课程的调查,希望大家认真填写,谢谢。 1、关于教学设班: 根据不

41、同编程基础分班无差别从基础讲起 其它: 2、关于教学内容: 侧重方法理论,不限于某种语言侧重方法的应用,针对某种语言 其它: 3、关于教学方式: 侧重语法,采用示例程序讲解侧重应用实例讲解语法结合实例讲解 其它: 4、实验课学时数: 较少,应适当增加较适中较多,希望有更多自主安排时间 其它: 5、关于电子教案: 内容详实,清楚太过冗余太过简略 其它: 6、关于考核方式(双选) : 肯定,应注重应用,采用自由创作考核方式 否定,应更加注重基础知识和语法,采用笔试考核方式 都重要,应从上述两个方面全面考核 采用阶段性考核与期末考核相结合 采用期末总考核 其它: 对于本门课程的其它建议: _ _ _ 姓名: _ 学号:_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1