版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、大学研究生堂下考试答卷2014-2015学年第 1 学期考试科目 姓 名 年 级 专 业 2014年 12月 28日 面向对象程序设计课程报告学号: 姓名: 学院: 题目基于MFC的聊天室与FTP文件传输系统选题背景首先经过一个学期关于C+的学习,我们希望能够运用所学的知识做出一些具有使用价值的产品。另外,由于本身专业是通信工程,基于对通信软件编程方面兴趣,希望能够在完成课程设计的同时能够加深自己对通信底层原理的理解。因此我们选择的题目是基于MFC的网络聊天室与FTP文件传输的编程。并且希望最后编写好的程序能够在同学之间进行交流以及文件共享方面具有一定的实用价值。最后,希望在完成编程的过程中提
2、高自己C+方面的能力以适应今后的学习与发展。 实现的功能:1支持多个客户端与服务器端之间的连接。2支持客户端与客户端之间的通信。3支持服务器端与客户端之间的通信。4FTP客户端方面支持文件的下载、上传、以及删除的功能。5FTP文件传输方面拥有两个客户端,一个是用于单线程的,另一个是用于多线程的,本实例对两个客户端的工作方式进行了对比。实现环境及开发工具:1.windows 7/8.1操作系统(实现环境)2.visual studio2010/2013(开发工具)3.MSDN2008(帮组文档)4.StarUML(UML制图工具)基础知识由于本实例是通信网络编程,使用到了很多网络通信方面的知识,
3、其中包括WinSock编程以及WinInet编程。下面介绍一下两类编程的基础知识。一、WinSock编程1.介绍套接字是支持TCP/IP网络通信的基本操作单元。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。套接字为不同的应用进程使用网络协议进行数据交换提供了接口,主要用于应用层与传输层之间。套接字分为三类:流式套接字、报文套接字以及原始套接字。其中最常使用的是流式套接字与报文套接字。流式套接字是面向连接的,在数据传输之前需要在双方之间建立起连
4、接,主要用于TCP业务;报文套接字是面向无连接的,在数据传输之间无需建立连接,只需要知道对方的IP网络地址已经对应的业务端口就可以把业务发送到目的端,报文套接字主要是用于传输基于UDP的业务。由于Windows提供了SOCKET的API函数,因此简化了整个套接字应用编程的难度,但是对于一般的初学者来说使用SOCKET API函数进行编程还是具有一定的难度,其主要适用于对整个协议工作过程有深入了解的专业人士使用。因此为了降低编程的门槛,微软公司将SOCKET API函数封装为了一个新的类CAsyncSocket类,通过调用CasyncSocket类的成员函数就能够完成网络编程的功能。但是,Cas
5、yncSocket的封装性对于一般用户来说还是太过于复杂,对于一般人的使用还是有一定的难度,因此微软又在CAsyncSocket类的基础上派生了CSocekt类,极大地简化了套接字的编程。本实例采用的就是CSocket编程。2.套接字工作过程由于本实例是采用C/S模式进行编程,是由客户端与服务器端组成的。流式套接字与报文套接字编程的原理是不一样的。流式套接字原理流式套接字是面向连接的,在进行数据传输之前需要在服务器与客户端之间先建立起连接。其建立连接的过程主要分为四步。i服务器端初始化套接字并绑定端口。ii.服务器端套接字启动监听状态,调用Listen()函数。iii客户端端建立套接字并绑定端
6、口。iv.客户端请求连接。v.服务器端接受连接请求。其工作过程见图1.1。图1.1:流式套接字工作过程报文套接字工作原理报文套接字不需要在数据传输之间建立连接,只需绑定对应的端口然后将数据发往对应的网络地址即可。其工作过程见图1.2。图1.2:报文套接字工作过程二、WinInet编程WinInet是windows internet扩展应用程序高级编程接口,是专为开发具有Internet功能的客户机端应用程序而提供的。它有两种形式:WinInet API包含一个C语言的函数集,MFC WinInet类则是对前者的面向对象的封装。WinInet主要用于Internet关于FTP文件传输协议,HTT
7、P超文本传输协议以及Gopher文件传输协议。MFC中WinInet包含的类i.CinternetSession类:由CObject类派生,代表应用程序的一次Internet会话,每个访问Internet的应用程序都需要一个CInternetSession类对象。ii.连接类:连接类主要包括CinternetConnection类以及它的派生类CFtpConnection类、CHttpConnection类和CGopherConnection类。iii.文件类:包括CInternetFile类以及它派生的CHttpFile类和CGopherFile类,另外文件查找类CFileFind也是文件类
8、。iv.CInternetException类:MFC WinInet类的成员函数在执行时所发生的错误或异常,往往用try/catch逻辑结构来处理异常。WinInet编程的步骤i.创建CInternetSession类对象,创建并初始化Internet会话ii.创建连接对象类,建立CInternetSession对象与网络服务器的连接,也就是应用程序与服务器的连接。本实例创建CFtpConnection类。iii.创建文件检索类,对文件进行检索。iv.创建异常类CInetnetException类,处理错误。v.关闭各种类,释放资源。三、多线程编程Windows本身是一个多进程多线程的操作系
9、统,因此在日常的应用编写中最好能够使用多线程的技术。在windows环境下开发多线程应用程序可以利用提供的Win32API接口函数,也可以利用微软提供的MFC类库进行开发。两种方式对于多线程编程原理是一样的,用户可以根据需要选择相应的工具。本实例主要用到的是MFC类库实现多线程调度与处理。MFC类库提供了对多线程编程的支持,使得多线程能方便的实现。MFC区分两种类型的线程:工作线程和用户接口线程。工作线程没有消息机制,通常用来执行后台计算和维护任务。MFC为用户接口线程提供消息机制,用来处理用户的输入,响应用户产生的事件消息。但对于Win32的API来说,这两种线程并没有区别,它只需要线程的启
10、动地址便启动线程执行任务。用户接口线程的一个典型应用就是类CWinApp,类CWinApp是CWinThread类的派生类,应用程序的主线程是由它提供,并由它负责处理用户产生的事件和消息。系统设计本实例借用StarUML软件绘制了整个程序的UML类视图,这个类视图在前期的代码编写上提供了很多帮助。UML类视图能够清晰地表明类与类之间的关系以及各个类所具有成员函数与成员变量。1.客户端类视图2.服务器端类视图系统实现FTP文件传输客户端一、单线程FTP客户端设计步骤1.之前在CClientDlg类中已经添加了两个对话框的资源,为IDD_DIALOG_FTP对话框添加控件以及为控件添加成员变量。其
11、界面布局以及成员变量之间的关系分别如图2.1表2.1所示。在头文件中添加头文件#include<afxinet.h>。图2.1:FTP客户端表2.1:单线程客户端添加成员变量控件类型ID变量名控件类型ID变量名CButtonIDC_BUTTON_DOWNLOADm_btnDownloadCButtonIDC_BUTTON_RMOVEm_btnremoveCButtonIDC_BUTTON_UPLOADm_btnUploadCStringIDC_EDIT_PWDm_strPwdCStringIDC_EDIT_USERNAMEm_strUsernameCStringIDC_EDIT_S
12、ERVERNAMEm_strServernameCListBoxIDC_LIST_FIELm_listFileCButtonIDOKm_btnquery2.为按钮添加消息响应:为“查询”按钮添加消息响应void CFtpDlg:OnQuery(),用于查询FTP服务器端上的文件。具体代码如下:void CFtpDlg:OnQuery()/ TODO: 在此添加控件通知处理程序代码/m_btnDownload.EnableWindow(TRUE);strflag = ""/初始化初始路径UpdateData(TRUE);while (m_listFile.GetCount()
13、 != 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_listFile.GetCur
14、Sel();CString strfilename;m_listFile.GetText(sel, strfilename);/获取要下载文件的文件名if (strfilename.GetAt(0) !='')/判断是否为文件夹,如果不为文件夹便下载CString strpathname;CFileDialog dlg(FALSE, "", strfilename);/新建一个文件对话框,FALSE表示为存储类型对话框,详情见MSDNif (dlg.DoModal() = IDOK)strpathname = dlg.GetPathName();/保存文件要
15、存储的路径strfilename = strflag + strfilename;if (Download(strfilename, strpathname)/调用download函数下载文件MessageBox("下载成功");elseMessageBox("下载失败");elseMessageBox("不能下载目录");为“上传”按钮添加消息响应void CFtpDlg:OnUpload(),用于上传文件到FTP服务器。具体代码如下:void CFtpDlg:OnUpload()/ TODO: 在此添加控件通知处理程序代码Upda
16、teData(TRUE);CString strfilename;CString strpathname;CFileDialog dlg(TRUE);/创建用于上传类型的文件对话框if (dlg.DoModal() = IDOK)strfilename = dlg.GetFileName();/保存文件名strpathname = dlg.GetPathName();/保存文件路径if (Upload(strpathname, strfilename)/调用上传函数MessageBox("上传成功");elseMessageBox("上传失败");els
17、eMessageBox("请选择文件");为“删除”按钮添加消息响应void CFtpDlg:OnRemove(),用于删除FTP服务器上的文件。具体代码如下:void CFtpDlg:OnRemove()/删除文件/ TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);CInternetSession* psession;CFtpConnection* pconnect;pconnect = NULL;psession = new CInternetSession(AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACC
18、ESS);trypconnect = 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=Messag
19、eBox("是否删除文件", "删除", MB_YESNO);if (flag = IDYES)pconnect->Remove(strfilename);MessageBox("删除成功");elseMessageBox("不能删除文件夹");3.为CFtpDlg类添加成员函数添加用于查询服务器文件的函数void CFtpDlg:List(CString strsourcename),具体代码:void CFtpDlg:List(CString strsourcename)CInternetSession*
20、 psession;/新建一个Internet会话CFtpConnection* pconnect;/建立一个用于ftp连接的指针CFtpFileFind* pfilefind;/建立一个用于文件查询的指针CString strfilename;pconnect = NULL;pfilefind = NULL;BOOL bContinue;psession = new CInternetSession();/初始化internet会话对象trypconnect = psession->GetFtpConnection(m_strServername, m_strUsername, m_s
21、trPwd);/通过internet会话对象调用函数创建ftp连接catch (CInternetException* e)e->Delete();pconnect = NULL;if (pconnect != NULL)pfilefind = new CFtpFileFind(pconnect);/初始化文件查找指针if (strsourcename = "")bContinue = pfilefind->FindFile("*");/如果为初始路径查找全部文件,返回值为bool型elsebContinue = pfilefind->
22、FindFile(strsourcename);/查找相应路径文件if (!bContinue)pfilefind->Close();pfilefind = NULL;while (bContinue)bContinue = pfilefind->FindNextFileA();/继续查找下一个文件strfilename = pfilefind->GetFileName();/获得文件名if (pfilefind->IsDirectory()/判断是否为目录strfilename = "" + strfilename + ""/如
23、果为目录则加上中括号显示m_listFile.AddString(strfilename);/将文件名加入到列表框中if (pfilefind != NULL)pfilefind->Close();pfilefind = NULL;delete pfilefind;if (pconnect != NULL)pconnect->Close();delete pconnect;delete psession;添加响应单击列表框的消息效应void CFtpDlg:OnDblclkListFile(),用于获取列表框文件的信息。具体代码:void CFtpDlg:OnSelchangeLi
24、stFile()/ TODO: 在此添加控件通知处理程序代码m_btnquery.EnableWindow(TRUE);m_btnremove.EnableWindow(TRUE);m_btnDownload.EnableWindow(TRUE);添加响应双击列表框的消息响应void CFtpDlg:OnSelchangeListFile(),用于双击列表框时获取信息。代码如下:void CFtpDlg:OnDblclkListFile()/ TODO: 在此添加控件通知处理程序代码CString strfilename;int sel = m_listFile.GetCurSel();/获得
25、双击文件在列表框中的位置索引m_listFile.GetText(sel, strfilename);/调用gettext获得文件名并将其存入字符串中int length = strfilename.GetLength();/获取文件名的长度if (strfilename.GetAt(0) = '')/判断是否为文件夹strfilename = strfilename.Mid(1, length - 2);strflag += strfilename + "/"/保存新的路径while (m_listFile.GetCount() != 0) m_listF
26、ile.DeleteString(0);/清空列表框List(strflag);/调用列表框查询新路径下的文件添加下载文件函数,用于下载服务器端的文件BOOL CFtpDlg:Download(CString strfilename, CString strpathname)。BOOL CFtpDlg:Download(CString strfilename, CString strpathname)UpdateData(TRUE);CInternetSession* psession;CFtpConnection* pconnect;pconnect = NULL;psession = ne
27、w CInternetSession(AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS);trypconnect = psession->GetFtpConnection(m_strServername, m_strUsername, m_strPwd);catch (CInternetException* e)e->Delete();pconnect->Close();return FALSE;if (pconnect != NULL)if (!pconnect->GetFile(strfilename, strpathna
28、me)/调用getfile文件下载文件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 strpathname, C
29、String strfilename)UpdateData(TRUE);CInternetSession* psession;CFtpConnection* pconnect;pconnect = NULL;psession = new CInternetSession(AfxGetAppName(), 1, PRE_CONFIG_INTERNET_ACCESS);trypconnect = psession->GetFtpConnection(m_strServername, m_strUsername, m_strPwd);catch (CInternetException* e)e
30、->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类添加成员变量CStrin
31、g strflag,用于存储查询文件的路径。二、多线程FTP文件传输客户端设计步骤由于MFC中的多线程分为用户接口线程和工作线程,本实例主要用到的是工作线程。工作线程主要作用是在需要启动该线程函数的时候只需调用AfxBeginThread()函数即可。此函数的作用是调用对应的线程函数以实现对应的功能。功能函数的函数原型如下:UINT ThreadFunc(LPVOID pParam)if(pParam=NULL)AfxEndThread(NULL);其中参数pParam是一个空指针,其可以指向任意的数据类型,只需在对应的线程函数下编写函数的功能即可。1.为IDD_DIALOG_MTFTP对话框
32、添加相应的控件,然后为相应的控件添加成员变量。界面布局与成员变量的添加均与之前单线程FTP客户端一样,详情见图2.1和表2.1。2为按钮添加消息响应为“查询”按钮添加消息响应void MTFtpDlg:OnQuery(),用于启动查询文件的线程函数。为“下载”按钮添加消息响应void MTFtpDlg:OnDownload(),用于启动下载文件的线程函数。为“上传”按钮添加消息响应void MTFtpDlg:OnUpload(),用于启动上传文件的线程函数。为“删除”按钮添加消息响应void MTFtpDlg:OnRemove(),用于启动删除文件的线程函数。3.为CMTFtpDlg类添加成员
33、函数和成员变量添加成员变量CString strhold,用于存储查询路径,添加成员函数void MTFtpDlg:OnDblclkListFilemt(),用于响应鼠标双击列表框消息,用于获取问价信息。4.功能函数编写在MTFtpDlg类中添加一个头文件mtftp.h,用于编写各个线程函数,其各功能函数的编程与之前的单线程FTP客户端的编程几乎一样,只需在各个对应的线程函数内编写即可。由于mtftp.h中使用了MFC的类库和WinInet的函数,所以需要在mtftp.h中添加头文件#include"MTFtpDlg.h",#include<afxinet.h>
34、。三、运行结果课程小结 由于自己之前自学过C+编程,大学本科时也开设了相关MFC编程的课程,所以对C+编程有一定的了解。但是因为对于C+编程的基本语法是通过自学的,还是有一定的局限性,因此在上面向对象程序设计这门课的过程中老师还是帮助我解决了许多之前一直困扰我的疑惑。在上课的过程中以及在课后关于程序的编写我都花了大量的精力,虽然比较辛苦但是我还是比较快乐,特别满足于当遇到困难之后通过各种方法将其解决之后的快感。在做课程设计的过程中和组员一起收获了很多的快乐,不仅能够巩固C+语言的基本理论知识,而且还能够发现自己的不足,在整个过程中感觉C+语言具有语言简洁、使用灵活、执行效率高等特点。另外也发现
35、了理论知识和实际动手操作还是有一定的区别,在整个过程中更加深刻地理解了C+的抽象性、封装性、继承性、和多态性。通过本次的课程设计我对整个程序设计的具体流程以及其中的原理有了更加深刻的理解。由于本次课程设计是以小组的形式完成的,我深刻体会到了团队的重要性,当我遇到困难时总是和组内成员一起讨论解决方案,多数情况下问题会得到解决,即使有时问题无法当场解决,但是通过大家的讨论也会对问题有更深一步地理解。在此,我要感谢我的组员薛尧、李玉菱两位同学,感谢他们和我一起共同面对问题,共同解决问题。接下来我希望对课程提一点小小的建议,我希望在以后的课程中能够增加实践环节,老师在课堂上可以布置一定的任务让同学们自己动手操作,由于本身课程的学时比较少,只有通过这样的方式才能够推动同学更加主动的去学习。另外还要特别感谢一下甘玲老师,老师在课堂上讲课清晰、明确,知识点的讲解非常生动、准确,讲课的过程非常幽默、易于接受。在学习的过程中曾经遇到过许多问题也向老师请教过,感谢老师耐心的解答。填表日期: 2014.12.24 聊天室操作手册本次基于MFC开发的聊天室主要由服务器和客户端构成,不同用户可以通过客户端进行对话,服务器也可以发送服务器消息,在客户端还可以进行文件传输,文件传输有单线程和多线程的区别。一、 界面介绍1.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 有余数的除法(2位数除以1位数)单元测试试题
- 小学四年级数学三位数除以两位数水平测试习题大全附答案
- 小学三年级数学三位数除以一位数质量作业模拟题大全附答案
- 芯片设计与制造服务合同
- 商场店面装修改造及国际化形象塑造合同3篇
- 工业互联网平台开发投资合同
- 电动汽车充电桩建设工程承包合同
- 影视制作行业版权转让合同
- 学校门卫聘用合同
- 低压配电柜维修合同范本
- 初中 初一 数学 绝对值 课件
- 中国律师学完整版课件全套教学ppt教程
- 守纪律讲卫生懂礼仪
- 脑控受害者解救方法
- 全国“创新杯”说课大赛计算机应用基础类优秀作品-:处理数据说课课件(35页PPT)
- 滁州市城市规划管理技术规定
- 保理业务解决方案
- 图纸会审答疑
- PCCP安装与水压试验
- 招标工作手册
- 信访事项听证程序流程图
评论
0/150
提交评论