网络程序课程设计FTP客户端.docx
《网络程序课程设计FTP客户端.docx》由会员分享,可在线阅读,更多相关《网络程序课程设计FTP客户端.docx(23页珍藏版)》请在冰豆网上搜索。
网络程序课程设计FTP客户端
河南理工大学
万方科技学院
课程设计报告
2015—2016学年第二学期
课程名称计算机网络
设计题目使用.NET技术编写FTP客户端
姓名
学号1516353004
专业班级计科15升-1班
指导教师李静
2016年06月23日
目录
1课题任务及要求1
1.1课题任务及要求1
2组员任务分工2
2.1组员任务及分工2
4课题相关算法及实现步骤4
4.1用户登录服务器,列表更新4
4.2双击事件功能的实现6
4.3登录失败获得服务器的响应信息7
4.4删除指定文件及文件夹8
4.5浏览上传文件9
4.6上传文件9
4.7下载文件11
4.8实现步骤13
5实现功能及操作简介14
5.1连接服务器14
5.2服务器响应信息14
5.3浏览14
5.4上传15
5.5下载15
5.6删除16
5.7进入目录和返回上级目录16
5.8退出16
6实验结果及分析17
6.1用户登录结果17
6.2服务器响应信息结果17
6.3浏览结果18
6.4上传结果18
6.5下载结果19
6.6删除结果20
6.7进入目录及返回上级目录结果21
6.8退出21
7心得体会22
8参考文献23
1课题任务及要求
1.1课题任务及要求
课题:
使用.NET技术编写FTP客户端
设计要求:
FTP客户端:
(1)根据服务器的IP地址,用户名,密码登陆FTP服务器。
(2)客户端上显示服务器响应信息。
(3)登陆成功后,客户端上显示服务器FTP目录及文件(目录和文件显示加以区别)。
(4)用户双击目录后可以进入该目录中,也可以双击“返回上级目录”,返回到上层目录。
(5)用户将本地文件上传至FTP服务器,以及采用多线程技术从服务器上下载文件。
(6)实现删除服务器上指定的文件和文件夹。
课题组人数:
限1人。
2组员任务分工
2.1组员任务及分工
刘凡11303090122任务分工:
完成程序源码,编写实验文档和PPT
3相关知识简介
3.1FTP
FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。
用于Internet上的控制文件的双向传输。
同时,它也是一个应用程序(Application)。
基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
在FTP的使用当中,用户经常遇到两个概念:
"下载"(Download)和"上传"(Upload)。
"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。
用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
3.2Serv-U软件
Serv-U是当前众多的FTP服务器软件之一。
通过使用Serv-U,用户能够将任何一台PC设置成一个FTP服务器,这样,用户或其他使用者就能够使用FTP协议,通过在同一网络上的任何一台PC与FTP服务器连接,进行文件或目录的复制,移动,创建,和删除等。
这里提到的FTP协议是专门被用来规定计算机之间进行文件传输的标准和规则,正是因为有了像FTP这样的专门协议,才使得人们能够通过不同类型的计算机,使用不同类型的操作系统,对不同类型的文件进行相互传递。
3.4相关FTP操作命令
FtpWebRequest类用于实现文件传输协议(Ftp)客户端的操作,用该类的Create方法初始化新的WebRequest对象,然后用该类的Method属性指定当前请求的命令是什么,这个值定义在结构体WebRequestMethods.ftp中,本次程序用到的命令有ListDirectoryDetails获取文件详细列表、DeleteFile删除文件、RemoveDirectory删除目录、DownloadFile下载文件、UploadFile上传文件等。
4课题相关算法及实现步骤
4.1用户登录服务器,列表更新
privatevoidbtnDenglu_Click(objectsender,EventArgse)
{
FileList="";
connect();
}
publicvoidconnect()
listBoxInfo.Items.Clear();
try
ftpServerIp=txtIp.Text;
ftpUserID=txtUsername.Text;
ftpPassword=txtPwd.Text;
req=(FtpWebRequest)FtpWebRequest.Create(newUri("ftp:
//"+ftpServerIp+"/"+FileList));
req.Credentials=newNetworkCredential(ftpUserID,ftpPassword);
req.KeepAlive=false;
req.Method=WebRequestMethods.Ftp.ListDirectoryDetails;
req.UseBinary=true;
FtpWebResponseresponse=GetFtpResponse(req);
listBoxInfo.Items.Add("服务器返回:
"+response.StatusDescription);
StreamReaderreader=newStreamReader(response.GetResponseStream());//
strings=reader.ReadToEnd();
string[]ftpDir=s.Split(Environment.NewLine.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
listBoxInfo.Items.AddRange(ftpDir);
ftpFileBox.Items.Add("返回上级目录");
for(inti=0;i{string[]fileinfo=ftpDir[i].Split('');stringtype=null;stringfilename=fileinfo[fileinfo.Length-1];if(filename=="."||filename=="..")continue;else{if(fileinfo[0].IndexOf('d')!=-1)type="<目录>";elsetype="<文件>";ftpFileBox.Items.Add(type+""+filename);}}reader.Close();response.Close();btnDenglu.Enabled=false;}catch(Exceptionex){MessageBox.Show("登陆失败!");MessageBox.Show(ex.ToString());}}4.2双击事件功能的实现privatevoidftpFileBox_MouseDoubleClick(objectsender,MouseEventArgse){try{String[]item=ftpFileBox.SelectedItem.ToString().Split('');stringtype=item[0];if(type.Equals("<目录>")){stringfile=item[1];FileList+=(file+"/");//进入目录ftp://ServerIp/目录名/ftpFileBox.Items.Clear();connect();}else{if(ftpFileBox.SelectedItem.ToString()=="返回上级目录"){FileList="";ftpFileBox.Items.Clear();connect();}}}catch(Exceptionex){MessageBox.Show(ex.Message);}}4.3登录失败获得服务器的响应信息privateFtpWebResponseGetFtpResponse(FtpWebRequestrequest){FtpWebResponseresponse=null;try{response=(FtpWebResponse)request.GetResponse();returnresponse;}catch(WebExceptionerr){listBoxInfo.Items.Add("出现异常,FTP返回状态:"+err.Status.ToString());FtpWebResponsee=(FtpWebResponse)err.Response;listBoxInfo.Items.Add("StatusCode:"+e.StatusCode);listBoxInfo.Items.Add("StatusDescription:"+e.StatusDescription);returnnull;}catch(Exceptionerr){listBoxInfo.Items.Add(err.Message);returnnull;}}4.4删除指定文件及文件夹privatevoidbtnShanchu_Click(objectsender,EventArgse){String[]item=ftpFileBox.SelectedItem.ToString().Split('');stringtype=item[0];stringfile=FileList+item[1];if(ftpFileBox.SelectedIndex>-1){try{if(type.Equals("<文件>")){req=(FtpWebRequest)FtpWebRequest.Create(newUri("ftp://"+ftpServerIp+"/"+file));req.Credentials=newNetworkCredential(ftpUserID,ftpPassword);req.KeepAlive=false;req.UseBinary=true;req.Method=WebRequestMethods.Ftp.DeleteFile;FtpWebResponseresponse=(FtpWebResponse)req.GetResponse();MessageBox.Show("删除文件成功!");}else{req=(FtpWebRequest)FtpWebRequest.Create(newUri("ftp://"+ftpServerIp+"/"+file));req.Credentials=newNetworkCredential(ftpUserID,ftpPassword);req.KeepAlive=false;req.UseBinary=true;req.Method=WebRequestMethods.Ftp.RemoveDirectory;FtpWebResponseresponse=(FtpWebResponse)req.GetResponse();MessageBox.Show("删除成功!");}ftpFileBox.Items.Clear();connect();}catch(Exceptionex){MessageBox.Show(ex.Message);}}}4.5浏览上传文件privatevoidbtnLiulan_Click(objectsender,EventArgse){if(btnDenglu.Enabled==true)MessageBox.Show("请?登?陆?FTP服务?器÷!?");else{openFileDialog1.ShowDialog();txtShangchuan.Text=openFileDialog1.FileName;//获取文件路径和文件名}}4.6上传文件privatevoidbtnShangchuan_Click(objectsender,EventArgse){if(txtShangchuan.Text=="")MessageBox.Show("没?有瓺选?择?要癮上?传?的?文?件t!?");else{stringFileSites=txtShangchuan.Text;FileInfofileInf=newFileInfo(FileSites);req=(FtpWebRequest)FtpWebRequest.Create(newUri("ftp://"+ftpServerIp+"/"+fileInf.Name));req.Credentials=newNetworkCredential(ftpUserID,ftpPassword);req.KeepAlive=false;req.Method=WebRequestMethods.Ftp.UploadFile;req.UseBinary=true;byte[]buff=newbyte[1024];//1024为缓冲区大小intContentLen;//打开一个文件流上传文件FileStreamfs=fileInf.OpenRead();try{Streamstrm=req.GetRequestStream();ContentLen=fs.Read(buff,0,1024);//流内容没有结束while(ContentLen!=0){//把内容从filestream写入uploadstreamstrm.Write(buff,0,ContentLen);ContentLen=fs.Read(buff,0,1024);}strm.Close();//关闭流fs.Close();txtShangchuan.Text="";MessageBox.Show("上传成功!");ftpFileBox.Items.Clear();connect();}catch(Exceptionex){MessageBox.Show(ex.ToString());}}}4.7下载文件privatevoidbtnXiazai_Click(objectsender,EventArgse){if(ftpFileBox.SelectedIndex>-1){String[]item=ftpFileBox.SelectedItem.ToString().Split('');stringtype=item[0];stringfile=FileList+item[1];if(type.Equals("<文件>")){try{req=(FtpWebRequest)FtpWebRequest.Create(newUri("ftp://"+ftpServerIp+"/"+file));req.Credentials=newNetworkCredential(ftpUserID,ftpPassword);req.Method=WebRequestMethods.Ftp.DownloadFile;req.UseBinary=true;SaveFileDialogsave=newSaveFileDialog();save.FileName=file;if(save.ShowDialog()==DialogResult.OK){FileStreamoutputStream=newFileStream(save.FileName,FileMode.Create);FtpWebResponseresponse=(FtpWebResponse)req.GetResponse();StreamftpStream=response.GetResponseStream();intreadCount;byte[]buffer=newbyte[1024];readCount=ftpStream.Read(buffer,0,1024);while(readCount>0){outputStream.Write(buffer,0,readCount);readCount=ftpStream.Read(buffer,0,1024);}ftpStream.Close();outputStream.Close();response.Close();MessageBox.Show("下载成功!");ftpFileBox.Items.Clear();connect();}}catch(Exceptionex){MessageBox.Show(ex.ToString());}}else{MessageBox.Show("不能下载目录!");}}else{MessageBox.Show("请选择文件进行下载!");}}4.8实现步骤1.窗体UI布局设计。2.FTP服务器的搭建。3.连接FTP服务器,实现用户登录。4.双击事件。5.服务器响应。6.上传文件。7.下载文件。8.删除文件及目录。8.退出程序。5实现功能及操作简介5.1连接服务器图5-1连接服务器5.2服务器响应信息图5-2服务器响应信息5.3浏览图5-3(a)浏览图5-3(b)浏览5.4上传图5-4上传5.5下载图5-5下载5.6删除图5-6删除5.7进入目录和返回上级目录图5-7进入目录和返回上级目录5.8退出 6实验结果及分析6.1用户登录结果分析:通过连接FTP服务器,实现用户的登录图6-1用户登录结果6.2服务器响应信息结果分析:通过FtpWebResponse获得服务器的响应信息图6-2(a)服务器响应信息结果图6-2(b)服务器相应信息结果6.3浏览结果分析:控件openFileDialog打开文件路径图6-3浏览结果6.4上传结果分析:通过文件路径找到文件信息,用fs.stream文件流实现上传文件图6-4(a)上传结果图6-4(b)上传结果6.5下载结果分析:创建流outputStream输出文件图6-5(a)下载结果图6-5(b)下载结果6.6删除结果分析:前缀type为”<文件>”时删除文件;前缀type为”<目录>”删除目录图6-6(a)删除结果图6-6(b)删除结果图6-6(c)删除结果图6-6(d)删除结果6.7进入目录及返回上级目录结果分析:当前缀type为”<目录>”时进入列表,向ftpFileBox中添加项”返回上一层”,选中项为”返回上一层”时更新至根目录列表图6-7(a)进入目录和返回上级目录结果图6-7(b)进入目录和返回上级目录结果6.8退出7心得体会此次我完成的课程设计题目是使用.NET技术编写FTP客户端。虽然程序与心里预期的结果有些差距,但是整体的功能基本实现了。虽然本学期主要学习的是C#网络编程,但是仍然感觉到很累,课程设计是一个综合知识运用的过程,没有前面汗水的积累,就没有现在代码的信手拈来,所以说我们要想巩固知识的最好办法就是经常运用它。这次课程设计主要用的知识是FTP的相关知识。FTP程序开发由于是新知识,所以应用起来还是有一些难度的。首先要解决的就是数据传输的问题,在查阅相关资料后我知道了与FTP服务器进行数据传输的主要步骤包括:1.根据Uri创建FtpWebRequest对象2.获取与FTP服务器通信的凭据3.设置KeepAlive的值为false,请求完成后关闭与服务器的控制连接4.设置发送到FTP服务器的命令5.用FtpWebRequest封装FTP服务器对请求的响应6.传输二进制流和文件流。掌握了以上的步骤,这个程序实现起来就不难了。这次课程设计让我巩固掌握了FTP网络程序开发的相关知识,,收获还是比较大的。更让我懂得了代码只有自己敲出来,才是你自己的,没有数量的积累是不会有质的飞跃的道理。今后我定会继续学习相关知识,写出更简便、好用的程序。8参考文献[1]何波、傅由甲.C#网络程序开发.2014年北京清华大学出版社[2]明日科技.C#开发技术大全.2011年北京人民邮电出版社[3]于国防、李剑.C#.NET网络程序设计实用教程.2013年北京清华大学出版社
string[]fileinfo=ftpDir[i].Split('');
stringtype=null;
stringfilename=fileinfo[fileinfo.Length-1];
if(filename=="."||filename=="..")
continue;
else
if(fileinfo[0].IndexOf('d')!
=-1)
type="<目录>";
type="<文件>";
ftpFileBox.Items.Add(type+""+filename);
reader.Close();
response.Close();
btnDenglu.Enabled=false;
catch(Exceptionex)
MessageBox.Show("登陆失败!
");
MessageBox.Show(ex.ToString());
4.2双击事件功能的实现
privatevoidftpFileBox_MouseDoubleClick(objectsender,MouseEventArgse)
String[]item=ftpFileBox.SelectedItem.ToString().Split('');
stringtype=item[0];
if(type.Equals("<目录>"))
stringfile=item[1];
FileList+=(file+"/");//进入目录ftp:
//ServerIp/目录名/
ftpFileBox.Items.Clear();
if(ftpFileBox.SelectedItem.ToString()=="返回上级目录")
MessageBox.Show(ex.Message);
4.3登录失败获得服务器的响应信息
privateFtpWebResponseGetFtpResponse(FtpWebRequestrequest)
FtpWebResponseresponse=null;
response=(FtpWebResponse)request.GetResponse();
returnresponse;
catch(WebExceptionerr)
listBoxInfo.Items.Add("出现异常,FTP返回状态:
"+err.Status.ToString());
FtpWebResponsee=(FtpWebResponse)err.Response;
listBoxInfo.Items.Add("StatusCode:
"+e.StatusCode);
listBoxInfo.Items.Add("StatusDescription:
"+e.StatusDescription);
returnnull;
catch(Exceptionerr)
listBoxInfo.Items.Add(err.Message);
4.4删除指定文件及文件夹
privatevoidbtnShanchu_Click(objectsender,EventArgse)
stringfile=FileList+item[1];
if(ftpFileBox.SelectedIndex>-1)
if(type.Equals("<文件>"))
//"+ftpServerIp+"/"+file));
req.Method=WebRequestMethods.Ftp.DeleteFile;
FtpWebResponseresponse=(FtpWebResponse)req.GetResponse();
MessageBox.Show("删除文件成功!
req.Method=WebRequestMethods.Ftp.RemoveDirectory;
MessageBox.Show("删除成功!
4.5浏览上传文件
privatevoidbtnLiulan_Click(objectsender,EventArgse)
if(btnDenglu.Enabled==true)
MessageBox.Show("请?
登?
陆?
FTP服务?
器÷!
?
openFileDialog1.ShowDialog();
txtShangchuan.Text=openFileDialog1.FileName;//获取文件路径和文件名
4.6上传文件
privatevoidbtnShangchuan_Click(objectsender,EventArgse)
if(txtShangchuan.Text=="")
MessageBox.Show("没?
有瓺选?
择?
要癮上?
传?
的?
文?
件t!
stringFileSites=txtShangchuan.Text;
FileInfofileInf=newFileInfo(FileSites);
//"+ftpServerIp+"/"+fileInf.Name));
req.Method=WebRequestMethods.Ftp.UploadFile;
byte[]buff=newbyte[1024];//1024为缓冲区大小
intContentLen;
//打开一个文件流上传文件
FileStreamfs=fileInf.OpenRead();
Streamstrm=req.GetRequestStream();
ContentLen=fs.Read(buff,0,1024);
//流内容没有结束
while(ContentLen!
=0)
//把内容从filestream写入uploadstream
strm.Write(buff,0,ContentLen);
strm.Close();//关闭流
fs.Close();
txtShangchuan.Text="";
MessageBox.Show("上传成功!
4.7下载文件
privatevoidbtnXiazai_Click(objectsender,EventArgse)
req.Method=WebRequestMethods.Ftp.DownloadFile;
SaveFileDialogsave=newSaveFileDialog();
save.FileName=file;
if(save.ShowDialog()==DialogResult.OK)
FileStreamoutputStream=newFileStream(save.FileName,FileMode.Create);
StreamftpStream=response.GetResponseStream();
intreadCount;
byte[]buffer=newbyte[1024];
readCount=ftpStream.Read(buffer,0,1024);
while(readCount>0)
outputStream.Write(buffer,0,readCount);
ftpStream.Close();
outputStream.Close();
MessageBox.Show("下载成功!
MessageBox.Show("不能下载目录!
MessageBox.Show("请选择文件进行下载!
4.8实现步骤
1.窗体UI布局设计。
2.FTP服务器的搭建。
3.连接FTP服务器,实现用户登录。
4.双击事件。
5.服务器响应。
6.上传文件。
7.下载文件。
8.删除文件及目录。
8.退出程序。
5实现功能及操作简介
5.1连接服务器
图5-1连接服务器
5.2服务器响应信息
图5-2服务器响应信息
5.3浏览
图5-3(a)浏览
图5-3(b)浏览
5.4上传
图5-4上传
5.5下载
图5-5下载
5.6删除
图5-6删除
5.7进入目录和返回上级目录
图5-7进入目录和返回上级目录
5.8退出
6实验结果及分析
6.1用户登录结果
分析:
通过连接FTP服务器,实现用户的登录
图6-1用户登录结果
6.2服务器响应信息结果
通过FtpWebResponse获得服务器的响应信息
图6-2(a)服务器响应信息结果
图6-2(b)服务器相应信息结果
6.3浏览结果
控件openFileDialog打开文件路径
图6-3浏览结果
6.4上传结果
通过文件路径找到文件信息,用fs.stream文件流实现上传文件
图6-4(a)上传结果
图6-4(b)上传结果
6.5下载结果
创建流outputStream输出文件
图6-5(a)下载结果
图6-5(b)下载结果
6.6删除结果
前缀type为”<文件>”时删除文件;前缀type为”<目录>”删除目录
图6-6(a)删除结果
图6-6(b)删除结果
图6-6(c)删除结果
图6-6(d)删除结果
6.7进入目录及返回上级目录结果
当前缀type为”<目录>”时进入列表,向ftpFileBox中添加项”返回上一层”,选中项为”返回上一层”时更新至根目录列表
图6-7(a)进入目录和返回上级目录结果
图6-7(b)进入目录和返回上级目录结果
6.8退出
7心得体会
此次我完成的课程设计题目是使用.NET技术编写FTP客户端。
虽然程序与心里预期的结果有些差距,但是整体的功能基本实现了。
虽然本学期主要学习的是C#网络编程,但是仍然感觉到很累,课程设计是一个综合知识运用的过程,没有前面汗水的积累,就没有现在代码的信手拈来,所以说我们要想巩固知识的最好办法就是经常运用它。
这次课程设计主要用的知识是FTP的相关知识。
FTP程序开发由于是新知识,所以应用起来还是有一些难度的。
首先要解决的就是数据传输的问题,在查阅相关资料后我知道了与FTP服务器进行数据传输的主要步骤包括:
1.根据Uri创建FtpWebRequest对象2.获取与FTP服务器通信的凭据3.设置KeepAlive的值为false,请求完成后关闭与服务器的控制连接4.设置发送到FTP服务器的命令5.用FtpWebRequest封装FTP服务器对请求的响应6.传输二进制流和文件流。
掌握了以上的步骤,这个程序实现起来就不难了。
这次课程设计让我巩固掌握了FTP网络程序开发的相关知识,,收获还是比较大的。
更让我懂得了代码只有自己敲出来,才是你自己的,没有数量的积累是不会有质的飞跃的道理。
今后我定会继续学习相关知识,写出更简便、好用的程序。
8参考文献
[1]何波、傅由甲.C#网络程序开发.2014年北京清华大学出版社
[2]明日科技.C#开发技术大全.2011年北京人民邮电出版社
[3]于国防、李剑.C#.NET网络程序设计实用教程.2013年北京清华大学出版社
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1