首页 MFCFTP文件传输

MFCFTP文件传输

举报
开通vip

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

MFCFTP文件传输
大学研究生堂下考试答卷1学期2014-2015学年第考试科目—姓  名  年  级  专  业—2014年12月28日《面向对象程序设计》课程 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 学号:—姓名:—学院:  题目基于MFC的聊天室与FTP文件传输系统选题勻匕冃景首先经过一个学期关于C的学习,我们希望能够运用所学的知识做出一些具有使用价值的产品。另外,由于本身专业是通信工程,基于对通信软件编程方面兴趣,希望能够在完成课程设计的同时能够加深自己对通信底层原理的理解。因此我们选择的题目是基于MFC的网络聊天室与FTP文件传输的编程。并且希望最后编写好的程序能够在同学之间进行交流以及文件共享方面具有一定的实用价值。最后,希望在完成编程的过程中提高自己C方面的能力以适应今后的学习与发展。实现的功能:1.支持多个客户端与服务器端之间的连接。2.支持客户端与客户端之间的通信。3.支持服务器端与客户端之间的通信。4.FTP客户端方面支持文件的下载、上传、以及删除的功能。5.FTP文件传输方面拥有两个客户端,一个是用于单线程的,另一个是用于多线程的,本实例对两个客户端的工作方式进行了对比。实现环境及开发工具:1.windows7/8.1操作系统(实现环境)2.visualstudio2010/2013(开发工具)3.MSDN2008(帮组文档)4.StarUML(UML制图工具)基础知识由于本实例是通信网络编程,使用到了很多网络通信方面的知识,其中包括WinSock编程以及Winlnet编程。下面介绍一下两类编程的基础知识。一、WinSock编程1.介绍套接字是支持TCP/IP网络通信的基本操作单元。多个TCP连接或多个应用程序进程可能需要通过同一个  TCP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。套接字为不同的应用进程使用网络协议进行数据交换提供了接口,主要用于应用层与传输层之间。套接字分为三类:流式套接字、报文套接字以及原始套接字。其中最常使用的是流式套接字与报文套接字。流式套接字是面向连接的,在数据传输之前需要在双方之间建立起连接,主要用于  TCP业务;报文套接字是面向无连接的,在数据传输之间无需建立连接,只需要知道对方的IP网络地址已经对应的业务端口就可以把业务发送到目的端,报文套接字主要是用于传输基于UDP的业务。由于Windows提供了SOCKET的API函数,因此简化了整个套接字应用编程的难度,但是对于一般的初学者来说使用  SOCKETAPI函数进行编程还是具有一定的难度,其主要适用于对整个协议工作过程有深入了解的专业人士使用。因此为了降低编程的门槛,微软公司将  SOCKETAPI函数圭寸装为了一个新的类CAsyncSocket类,通过调用CasyncSocket类的成员函数就能够完成网络编程的功能。但是,  CasyncSocket的封装性对于一般用户来说还是太过于复杂,对于一般人的使用还是有一定的难度,因此微软又在CAsyncSocket类的基础上派生了CSocekt类,极大地简化了套接字的编程。本实例采用的就是  CSocket编程。2.套接字工作过程由于本实例是采用C/S模式进行编程,是由客户端与服务器端组成的。流式套接字与报文套接字编程的原理是不一样的。1流式套接字原理流式套接字是面向连接的,在进行数据传输之前需要在服务器与客户端之间先建立起连接。其建立连接的过程主要分为四步。i•服务器端初始化套接字并绑定端口。ii.服务器端套接字启动监听状态,调用Listen()函数。iii.客户端端建立套接字并绑定端口。iv.客户端请求连接。v.服务器端接受连接请求。其工作过程见图1.1。客门沖j  Hl务器能图1.1:流式套接字工作过程2报文套接字工作原理报文套接字不需要在数据传输之间建立连接,只需绑定对应的端口然后将数据发往对应的网络地址即可。其工作过程见图  1.2。窑户炜  服.齐誥端图1.2:报文套接字工作过程二、Winlnet编程Winlnet是windowsinternet扩展应用程序高级编程接口,是专为开发具有Internet功能的客户机端应用程序而提供的。它有两种形式:WinlnetAPI包含一个C语言的函数集,MFCWinlnet类则是对前者的面向对象的封装。Winlnet主要用于Internet关于FTP文件传输协议,HTTP超文本传输协议以及Gopher文件传输协议。1MFC中Winlnet包含的类i.CinternetSession类:由CObject类派生,代表应用程序的一次Internet会话,每个访问Internet的应用程序都需要一个ClnternetSession类对象。ii.连接类:连接类主要包括  CinternetConnection类以及它的派生类CFtpConnection类、CHttpConnection类和CGopherConnection类。iii.文件类:包括ClnternetFile类以及它派生的CHttpFile类和CGopherFile类,另外文件查找类CFileFind也是文件类。iv.CInternetException类:MFCWinlnet类的成员函数在执行时所发生的错误或异常,往往用try/catch逻辑结构来处理异常。2Winlnet编程的步骤i.创建ClnternetSession类对象,创建并初始化Internet会话ii.创建连接对象类,建立ClnternetSession对象与网络服务器的连接,也就是应用程序与服务器的连接。本实例创建  CFtpConnection类。iii.创建文件检索类,对文件进行检索。iv.仓建异常类ClnetnetException类,处理错误。V.关闭各种类,释放资源。三、多线程编程Windows本身是一个多进程多线程的操作系统,因此在日常的应用编与中取好能够使用多线程的技术。在windows环境下开发多线程应用程序可以利用提供的Win32API接口函数,也可以利用微软提供的MFC类库进行开发。两种方式对于多线程编程原理是一样的,用户可以根据需要选择相应的工具。本实例主要用到的是MFC类库实现多线程调度与处理。MFC类库提供了对多线程编程的支持,使得多线程能方便的实现。MFC区分两种类型的线程:工作线程和用户接口线程。工作线程没有消息机制,通常用来执行后台计算和维护任务。MFC为用户接口线程提供消息机制,用来处理用户的输入,响应用户产生的事件消息。但对于Win32的API来说,这两种线程并没有区别,它只需要线程的启动地址便启动线程执行任务。用户接口线程的一个典型应用就是类  CWinApp,类CWinApp是CWinThread类的派生类,应用程序的主线程是由它提供,并由它负责处理用户产生的事件和消息。系统设计本实例借用StarUML软件绘制了整个程序的UML类视图,这个类视图在前期的代码编写上提供了很多帮助。UML类视图能够清晰地表明类与类之间的关系以及各个类所具有成员函数与成员变量。1.客户端类视图Umwbc砌里啸…护詞訓—2.服务器端类视图CDkitoq4OrAccEpt(j;vpidFTP文件传输客户端一、单线程FTP客户端设计步骤1.之前在CClientDIg类中已经添加了两个对话框的资源,为IDD_DIALOG_FTP对话框添加控件以及为控件添加成员变量。其界面布局以及成员变量之间的关系分别如图2.1表2.1所示。在头文件中添加头文件#includevafxinet.h>。2.为按钮添加消息响应:1为“查询”按钮添加消息响应voidCFtpDlg::OnQuery(),用于查询FTP服务器端上的文件。具体代码如下:voidCFtpDlg::OnQuery(){//TODO:在此添加控件通知处理程序代码〃m_btnDownload.EnableWindow(TRUE);strflag="";  //初始化初始路径UpdateData(TRUE);while(m_listFile.GetCount()!=0)m_listFile.DeleteString(0);〃清空列表框  一  一List("");  //查询服务器上的文件m_btnUpload.EnableWindow(TRUE);m_btnDownload.EnableWindow(FALSE);m_btnremove.EnableWindow(FALSE);}_2为“下载”按钮添加消息响应voidCFtpDlg::OnDownload(),用于下载FTP服务器端的文件。具体代码如下:voidCFtpDlg::OnDownload(){//TODO:在此添加控件通知处理程序代码intsel=m_listFile.GetCurSel();CStringstrfilename;m_listFile.GetText(sel,strfilename);//获取要下载文件的文件名if(strfilename.GetAt(0)!='[')  〃判断是否为文件夹,如果不为文件夹便下载{CStringstrpathname;CFileDialogdlg(FALSE,"",strfilename);//新建一个文件对话框,FALSE表示为存储类型对话框,详情见MSDNif(dlg.DoModal()==IDOK){strpathname=dlg.GetPathName();  //保存文件要存储的路径strfilename=strflagstrfilename;if(Download(strfilename,strpathname))//调用download函数下载文件MessageBox('下载成功");elseMessageBox('下载失败");}—}elseMessageBox("不能下载目录");}3为“上传”按钮添加消息响应voidCFtpDlg::OnUpload(),用于上传文件到FTP服务器。具体代码如下:voidCFtpDlg::OnUpload(){//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);CStringstrfilename;CStringstrpathname;CFileDialogdlg(TRUE);//创建用于上传类型的文件对话框if(dlg.DoModal()==IDOK){strfilename=dlg.GetFileName();〃保存文件名strpathname=dlg.GetPathName();保存文件路径if(Upload(strpathname,strfilename))/碉用上传函数MessageBox("上传成功");elseMessageBox("上传失败");}elseMessageBox('请选择文件");}4为“删除”按钮添加消息响应voidCFtpDlg::OnRemove(),用于删除FTP服务器上的文件。具体代码如下:voidCFtpDlg::OnRemove()  〃删除文件{//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);ClnternetSession*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(ClnternetException*e){e->Delete();pconnect->Close();}intsel=m_listFile.GetCurSel();CStringstrfilename;m_listFile.GetText(sel,strfilename);if(strfilename.GetAt(O)!='['){intflag=MessageBox("是否删除文件","删除",MB_YESNO);if(flag==IDYES){pconnect->Remove(strfilename);MessageBox('删除成功");}}elseMessageBox('不能删除文件夹");}3•为CFtpDIg类添加成员函数①添加用于查询服务器文件的函数voidCFtpDlg::List(CStringstrsourcename)具体代码:voidCFtpDlg::List(CStringstrsourcename)//新建一个Internet会话〃建立一个用于ftp连接的指针//建立一个用于文件查询的指针{ClnternetSession*psession;CFtpConnection*pconnect;CFtpFileFind*pfilefind;CStringstrfilename;pconnect=NULL;pfilefind=NULL;BOOLbContinue;psession=newClnternetSession();初始化internet会话对象try{pconnect=  psession->GetFtpConnection(m_strServernamm_strUsername,m_strPwd);/通过internet会话对象调用函数创建ftp连接一}一catch(ClnternetException*e){e->Delete();pconnect=NULL;}if(pconnect!=NULL)//初始化文件查找指{pfilefind=newCFtpFileFind(pconnect);IllibContinue=pfilefind->FindFile("*");  //如果为初始路径查找全部文件,返回值为bool型}elsebContinue=pfilefind->FindFile(strsourcename);//查找相应路径文件if(!bContinue){pfilefind->Close();pfilefind=NULL;}while(bContinue){bContinue=pfilefind->FindNextFileA();//继续查找下一个文件strfilename=pfilefind->GetFileName();//获得文件名if(pfilefind->lsDirectory())〃判断是否为目录屮括号显示strfilename="["strfilename"]";//如果为目录则加上表框中m_listFile.AddString(strfilename);//将文件名加入到列}if(pfilefind!=NULL){pfilefind->Close();pfilefind=NULL;}}deletepfilefind;if(pconnect!=NULL){pconnect->Close();deletepconnect;}deletepsession;}②添加响应单击列表框的消息效应  voidCFtpDlg::OnDblclkListFile(),用于获取列表框文件的信息。具体代码:voidCFtpDlg::OnSelchangeListFile(){//TODO:在此添加控件通知处理程序代码mbtnquery.EnableWindow(TRUE);m_btnremove.EnableWindow(TRUE);m_btnDownload.EnableWindow(TRUE);}3添加响应双击列表框的消息响应voidCFtpDlg::OnSelchangeListFile(),用于双击列表框时获取信息。代码如下:voidCFtpDlg::OnDblclkListFile(){//TODO:在此添加控件通知处理程序代码CStringstrfilename;intsel=m」istFile.GetCurSel();  //获得双击文件在列表框中的位置索引  一m」istFile.GetText(sel,strfilename);//调用gettext获得文件名并将其存入字符串中intlength=strfilename.GetLength();//获取文件名的长度if(strfilename.GetAt(O)=='[')  〃判断是否为文件夹{strfilename=strfilename.Mid(1,length-2);strflag=strfilename"/";  //保存新的路径}while(m_listFile.GetCount()!=0)m_listFile.DeleteString(0);〃清空列表框  一  一List(strflag);  〃调用列表框查询新路径下的文件}4添加下载文件函数,用于下载服务器端的文件BOOLCFtpDlg::Download(CStringstrfilename,CStringstrpathname^BOOLCFtpDlg::Download(CStringstrfilename,CStringstrpathname){UpdateData(TRUE);ClnternetSession*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(ClnternetException*e){e->Delete();pconnect->Close();returnFALSE;}if(pconnect!=NULL){if(!pconnect->GetFile(strfilename,strpathname))/调用getfile文件下载文件{pconnect->Close();deletepconnect;deletepsession;returnFALSE;}}if(pconnect!=NULL){pconnect->Close();deletepconnect;}deletepsession;returnTRUE;}5添加上传文件函数,用于上传文件到服务器端BOOLCFtpDlg::Upload(CStringstrpathname,CStringstrfilename。代码如下:BOOLCFtpDlg::Upload(CStringstrpathname,CStringstrfilename){UpdateData(TRUE);ClnternetSession*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(ClnternetException*e){e->Delete();pconnect->Close();returnFALSE;}if(pconnect!=NULL){if(!pconnect->PutFile(strpathname,strfilename))/上传文件pconnect->Close();deletepconnect;deletepsession;returnFALSE;}}if(pconnect!=NULL){pconnect->Close();deletepconnect;}deletepsession;returnTRUE;}4.为CFtpDlg类添加成员变量CStringstrflag,用于存储查询文件的路径。二、多线程FTP文件传输客户端设计步骤由于MFC中的多线程分为用户接口线程和工作线程,  本实例主要用到的是工作线程。工作线程主要作用是在需要启动该线程函数的时候只需调用AfxBeginThread()函数即可。此函数的作用是调用对应的线程函数以实现对应的功能。功能函数的函数原型如下:UINTThreadFunc(LPVOIDpParam){if(pParam==NULL)AfxEndThread(NULL);}其中参数pParam是一个空指针,其可以指向任意的数据类型,只需在对应的线程函数下编写函数的功能即可。一样,详情见图2.1和表2.1。2为按钮添加消息响应1为“查询”按钮添加消息响应询文件的线程函数。2为“下载”按钮添加消息响应动下载文件的线程函数。3为“上传”按钮添加消息响应上传文件的线程函数。4为“删除”按钮添加消息响应删除文件的线程函数。1.为IDD_DIALOG_MTFTP对话框添加相应的控件,然后为相应的控件添加成员变量。界面布局与成员变量的添加均与之前单线程  FTP客户端voidMTFtpDlg::OnQuery(),用于启动查voidMTFtpDlg::OnDownload(),用于启voidMTFtpDlg::OnUpload(),用于启动voidMTFtpDlg::OnRemove(),用于启动3•为CMTFtpDlg类添加成员函数和成员变量添加成员变量CStringstrhold,用于存储查询路径,添加成员函数voidMTFtpDlg::OnDblclkListFilemt(),用于响应鼠标双击列表框消息,用于获取问价信息。4.功能函数编写在MTFtpDlg类中添加一个头文件mtftp.h,用于编写各个线程函数,其各功能函数的编程与之前的单线程  FTP客户端的编程几乎一样,只需在各个对应的线程函数内编写即可。由于  mtftp.h中使用了MFC的类库和Winlnet的函数,所以需要在mtftp.h中添加头文件#include"MTFtpDlg.h",#include。三、运行结果课程小结由于自己之前自学过C编程,大学本科时也开设了相关MFC编程的课程,所以对C编程有一定的了解。但是因为对于C编程的基本语法是通过自学的,还是有一定的局限性,因此在上面向对象程序设计这门课的过程中老师还是帮助我解决了许多之前一直困扰我的疑惑。在上课的过程中以及在课后关于程序的编写我都花了大量的精力,虽然比较辛苦但是我还是比较快乐,特别满足于当遇到困难之后通过各种方法将其解决之后的快感。在做课程设计的过程中和组员一起收获了很多的快乐,不仅能够巩固C语言的基本理论知识,而且还能够发现自己的不足,在整个过程中感觉C语言具有语言简洁、使用灵活、执行效率高等特点。另外也发现了理论知识和实际动手操作还是有一定的区别,在整个过程中更加深刻地理解了C的抽象性、封装性、继承性、和多态性。通过本次的课程设计我对整个程序设计的具体流程以及其中的原理有了更加深刻的理解。由于本次课程设计是以小组的形式完成的,我深刻体会到了团队的重要性,当我遇到困难时总是和组内成员一起讨论解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,多数情况下问题会得到解决,即使有时问题无法当场解决,但是通过大家的讨论也会对问题有更深一步地理解。在此,我要感谢我的组员薛尧、李玉菱两位同学,感谢他们和我一起共同面对冋题,共同解决冋题。接下来我希望对课程提一点小小的建议,我希望在以后的课程中能够增加实践环节,老师在课堂上可以布置一定的任务让同学们自己动手操作,由于本身课程的学时比较少,只有通过这样的方式才能够推动同学更加主动的去学习。另外还要特别感谢一下甘玲老师,老师在课堂上讲课清晰、明确,知识点的讲解非常生动、准确,讲课的过程非常幽默、易于接受。在学习的过程中曾经遇到过许多问题也向老师请教过,  感谢老师耐心的解答。填表日期:2014.12.24聊天室操作手册本次基于MFC开发的聊天室主要由服务器和客户端构成,不同用户可以通过客户端进行对话,服务器也可以发送服务器消息,在客户端还可以进行文件传输,文件传输有单线程和多线程的区别。一、界面介绍1.服务器服务器界面如下图所示:图1.1:服务器2.客户端客户端界面如下图所示:图1.2:客户端连接过程1.服务器连接首先运行服务器进行端口设置,这里默认值为  7000图2.1:客户端连接示意图1图2.2:客户端连接示意图2通过以上设置,服务器即已经初始化完成,等待客户端连入2.客户端接入过程图2.4:客户端连接示意图2客户端连接时需要输入用户名、服务器地址  I,这里由于是本机测试输入localhost  即可连入服务器,端口也需要与服务器端口一致,为默认值7000.按照上诉操作,当弹出socket连接成功消息盒时即表示当前客户端已经与服务器连接好了就可以进行消息发送了。三、聊天界面图3.1:聊天界面当多个客户端同时连接上服务器之后就可以直接进行聊天了,图示如3.1所示四、FTP文件传输1.FTP客户端界面«1'—■FT电■-申*i*mi|HikKi图4.2:QuickEasyFTPServer界面从这里我们把F盘设为我们的根目录,同时对其权限设置下载、上传、改名、删除、创建目录全部选上,这样我们就可以对F盘中的文件进行相应操作,然后启动服务器,等待FTP客户端连接。3.操作流程U^a^rTicin]匚1_E.[1KG.P0mo!07J-n_RFWTSTONJfacl^-oz]fAdatM--Dtmev1.La/wsr*CISE]lAricritBfi.卜Kjtg.创LJ.辛匡8W局.漱£口'ti寸IDrv.ACJ-.1U2.4Abf『5*口"和负舸天yi.WAndroid.视魅聃天_V1.4.rar[b£iidliyun日dwri口andiB  mF6忖射TC^udCacl-ie]LDawrilu^Ej匚‘1弋曰亍h的芮方济iLfe6.3OseS^?554li:8b7fe8c9f9]d:4e;(Fvnflt■忖r叶科|齐]lufl图4.3:查询界面我们可以看到在搭建好服务器之后,在  FTP客户端输入相应的服务器地址并且用户名要与服务器创建的一致才能连接上,  点击查询就出现了如图所示的界面,显示的内容为F盘中的文件,此时就可以对这些文件进行上传、下载、删除等操作了。同时,多线程文件传输指的是在文件传输过程中可以多个任务同时进行,不会因为一个下载、上传或者删除的操作而使得界面不可用,提高效率。《面向对象程序设计》课程调查为了进一步提高教学质量,使同学们能够更好地学习本门课程,达到课程教学目标,现面向同学们做一个本课程的调查,希望大家认真填写,谢谢。1、  关于教学设班:□根据不同编程基础分班  □无差别从基础讲起其它:  2、  关于教学内容:□侧重方法理论,不限于某种语言  □侧重方法的应用,针对某种语言其它:  3、  关于教学方式:□侧重语法,采用示例程序讲解□侧重应用实例讲解□语法结合实例讲解其它:  4、  实验课学时数:□较少,应适当增加  □较适中□较多,希望有更多自主安排时间其它:  5、  关于电子 教案 中职数学基础模块教案 下载北师大版¥1.2次方程的根与系数的关系的教案关于坚持的教案初中数学教案下载电子教案下载 :□内容详实,清楚  □太过冗余  □太过简略其它:  6关于考核方式(双选):□肯定,应注重应用,采用自由创作考核方式□否定,应更加注重基础知识和语法,采用笔试考核方式□都重要,应从上述两个方面全面考核□采用阶段性考核与期末考核相结合□采用期末总考核其它:  对于本门课程的其它建议:  姓名:  学号:  
本文档为【MFCFTP文件传输】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_686908
暂无简介~
格式:doc
大小:78KB
软件:Word
页数:58
分类:
上传时间:2022-07-22
浏览量:0