计算机网络课程设计报告-简单FTP服务器实现参考.docx

上传人:wj 文档编号:1948245 上传时间:2023-05-02 格式:DOCX 页数:10 大小:132.61KB
下载 相关 举报
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第1页
第1页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第2页
第2页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第3页
第3页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第4页
第4页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第5页
第5页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第6页
第6页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第7页
第7页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第8页
第8页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第9页
第9页 / 共10页
计算机网络课程设计报告-简单FTP服务器实现参考.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

计算机网络课程设计报告-简单FTP服务器实现参考.docx

《计算机网络课程设计报告-简单FTP服务器实现参考.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告-简单FTP服务器实现参考.docx(10页珍藏版)》请在冰点文库上搜索。

计算机网络课程设计报告-简单FTP服务器实现参考.docx

计算机网络课程设计报告

学 院:

专 业:

班 级:

设计题目:

简单FTP服务器实现

组 长:

组 员

指导教师:

成 绩:

时 间:

2014至2015学年度第1 学期

9月25日至10月30日

简单FTP服务器实现

1关键技术

1.1FTP协议

FTP的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。

图1 FTP服务示意图

在开始阶段,标准FTP命令由用户PI产生并通过控制连接传送到服务器进程。

服务器PI向用户PI返回标准应答。

FTP命令指定数据连接参数和文件系统操作。

用户DTP在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。

数据端口不必在开始FTP命令的机器上,但用户或用户FTP进程必须确定它在指定的数据端口上侦听。

这个数据连接是全双工的。

FTP协议中对应答码的意义有明确的规定,如下表所示:

表1FTP协议应答码

应答码

意义

应答码

意义

110

重新启动标记应答。

在这种情况下文本是确定的,它必须是:

MARKyyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。

120

服务在nnn分钟内准备好

125

数据连接已打开,准备传送

150

文件状态良好,打开数据连接

200

命令成功

202

命令未实现

211

系统状态或系统帮助响应

212

目录状态

213

文件状态

214

帮助信息,信息仅对人类用户有用

215

名字系统类型

220

对新用户服务准备好

221

服务关闭控制连接,可以退出登录

225

数据连接打开,无传输正在进行

226

关闭数据连接,请求的文件操作

227

进入被动模式

成功

230

用户登录

250

请求的文件操作完成

257

创建"PATHNAME"

331

用户名正确,需要口令

332

登录时需要帐户信息

350

请求的文件操作需要进一步命令

421

不能提供服务,关闭控制连接

425

不能打开数据连接

426

关闭连接,中止传输

450

请求的文件操作未执行

451

中止请求的操作:

有本地错误

452

未执行请求的操作:

系统存储空间不足

500

格式错误,命令不可识别

501

参数语法错误

502

命令未实现

503

命令顺序错误

504

此参数下的命令功能未实现

530

未登录

532

存储文件需要帐户信息

550

未执行请求的操作

551

请求操作中止:

页类型未知

552

请求的文件操作中止,存储分配溢出

553

未执行请求的操作:

文件名不合法

1.2TCP协议的编程

Socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。

可以将Socket看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。

Socket存在于通信域中,通信域是为了处理一般的线程通过Socket通信而引进的一种抽象概念。

Socket通常和同一个域中的Socket交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。

各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。

2功能设计

2.1功能示意图

客户端

下载

登陆

服务器端

下载

链接

主动

验证登陆

上传

被动

删除

图2 实现功能示意图

以FTP的工作原理和权限归属为基础,用C#语言编写程序,,用简单界面

展示,用socket编程和二进制输入输出流来实现了FTP文件上传,下载,删除,读取文件列表这几项功能。

采用端口为21和IP地址为127.0.0.1连接。

3代码实现

3.1启动服务器(服务器端)

//启动服务器

privatevoidbtnFtpServerStartStop_Click(objectsender,EventArgse)

{

if(myTcpListener==null)

{

listenThread=newThread(ListenClientConnect);listenThread.IsBackground=true;listenThread.Start();

lstboxStatus.Enabled=true;lstboxStatus.Items.Clear();

lstboxStatus.Items.Add("已经启动Ftp服务...");

btnFtpServerStartStop.Text="停止";

}

else

{

myTcpListener.Stop();myTcpListener=null;listenThread.Abort();

lstboxStatus.Items.Add("Ftp服务已停止!

");

lstboxStatus.TopIndex=lstboxStatus.Items.Count-1;btnFtpServerStartStop.Text="启动";

}

}

//使用数据连接发送文件流(客户端发送下载文件命令)

privatevoidSendFileByUserSession(Useruser,FileStreamfs)

{

AddInfo("向用户发送(文件流):

[...");try

{

if(user.isBinary)

{

byte[]bytes=newbyte[1024];BinaryReaderbinaryReader=newBinaryReader(fs);Intcount=binaryReader.Read(bytes,0,bytes.Length);while(count>0)

{

user.dataSession.binaryWriter.Write(bytes,0,count);user.dataSession.binaryWriter.Flush();

count=binaryReader.Read(bytes,0,bytes.Length);

}

}

else

{

StreamReaderstreamReader=newStreamReader(fs);while(streamReader.Peek()>-1)

{

user.dataSession.streamWriter.WriteLine(streamReader.ReadLine());

}

}

AddInfo("...]发送完毕!

");

}

finally

{

user.dataSession.Close();fs.Close();

}

}

3.2文件传输操作(客户端)

由于代码过多且相似,以显示文件目录和上传文件为例。

//处理并显示文件目录列表

string[] ftpdir = s.Split(Environment.NewLine.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);

intlength=0;

for(inti=0;i

{

if(ftpdir[i].EndsWith("."))

{length=ftpdir[i].Length-2;}

}

for(inti=0;i

{

s=ftpdir[i];

intindex=s.LastIndexOf('\t');if(index==-1)

{

if(length

{index=length;}else

{continue;}

}

stringname=s.Substring(index+1);if(name=="."||name=="..")

{continue;}

//判断是否为目录,在名称前加"目录"来表示

if(s[0]=='d'||(s.ToLower()).Contains("

"))

{

string[]namefield=name.Split('');intnamefieldlength=namefield.Length;stringdirname;

dirname=namefield[namefieldlength-1];

//对齐

dirname=dirname.PadRight(34,'');name=dirname;

//显示目录

lstbxFtpResources.Items.Add("[目录]"+name);

}

}

for(inti=0;i

{

s=ftpdir[i];

intindex=s.LastIndexOf('\t');if(index==-1)

{

if(length

{index=length;}else

{continue;}

}

stringname=s.Substring(index+1);if(name=="."||name=="..")

{continue;}

//判断是否为文件

if(!

(s[0]=='d'||(s.ToLower()).Contains("

")))

{

string[]namefield=name.Split('');intnamefieldlength=namefield.Length;stringfilename

filename=namefield[namefieldlength-1];

}

}

}

//上传文件到服务器事件

privatevoidbtnUpload_Click(objectsender,EventArgse)

{

//选择要上传的文件

OpenFileDialogopenFileDialog=newOpenFileDialog();openFileDialog.FileName=openFileDialog.FileNames.ToString();openFileDialog.Filter="所有文件(*.*)|*.*";

if(openFileDialog.ShowDialog()!

=DialogResult.OK)

{

return;

}

FileInfofileinfo=newFileInfo(openFileDialog.FileName);try

{

stringuri=GetUriString(fileinfo.Name);

FtpWebRequest request = CreateFtpWebRequest(uri,WebRequestMethods.Ftp.UploadFile);

request.ContentLength=fileinfo.Length;intbuflength=8196;

byte[]buffer=newbyte[buflength];FileStreamfilestream=fileinfo.OpenRead();

StreamresponseStream=request.GetRequestStream();

lstbxFtpState.Items.Add("打开上传流,文件上传中...");

intcontenlength=filestream.Read(buffer,0,buflength);while(contenlength!

=0)

{

responseStream.Write(buffer,0,contenlength);contenlength=filestream.Read(buffer,0,buflength);

}

responseStream.Close();filestream.Close();

FtpWebResponseresponse=GetFtpResponse(request);if(response==null)

{

lstbxFtpState.Items.Add("服务器未响应...");lstbxFtpState.TopIndex=lstbxFtpState.Items.Count-1;return;

}

lstbxFtpState.Items.Add("上传完毕,服务器返回:

" +response.StatusCode+""+response.StatusDescription);

lstbxFtpState.TopIndex=lstbxFtpState.Items.Count-1;

MessageBox.Show("上传成功!

");

//上传成功后,立即刷新服务器目录列表

ShowFtpFileAndDirectory();

}

catch(WebExceptionex)

{

ex.Status);

}

lstbxFtpState.Items.Add("上传发生错误,返回信息为:

" +

lstbxFtpState.TopIndex=lstbxFtpState.Items.Count-1;MessageBox.Show(ex.Message,"上传失败");

}

4实例演示

首先在F:

\盘下新建文件夹计科112,在其中创建目录结构并放一些文件资源,例如图片,文档等。

运行FTP服务器程序,然后点击“启动”按钮后就启动了FTP服务器,运行结果如下图所示。

图3 ftp服务器启动

FTP服务器程序中已经初始化用户名和密码,直接输入用户名和密码为和

后点击“登录”按钮后就完成了用户验证的过程,并与FTP服务器建立了控制连接和数据连接。

运行结果如下图:

图4 登陆后ftp服务器

图5 登陆后ftp客户端

用户可以通过"上传"、“下载”和删除按钮来对FTP服务器上的文件进行操作。

5总结

我们的系统还存在着很多不足,一方面因为时间原因因为选题阶段和构思

阶段浪费了大量的时间,有很多可以实现的功能没有实现比如说客户端的注销功能。

还有就是我们的系统不能经过多台电脑联网真实的模拟ftp服务器的功能,而只能在一台电脑上仿真模拟。

这次课程设计感觉对我们的学习能力和全局考虑能力有很大的提高,总体来说我们发挥了我们全部的水平,不过也有一些缺陷,比如说我们一开始不是很懂选择方向出现了一些问题,这是我们没有沟通好的地方,如果还有机会一定改进这些问题。

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2