计算机网络课程设计简单FTP服务器实现Word文档下载推荐.docx
- 文档编号:6755359
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:13
- 大小:167.94KB
计算机网络课程设计简单FTP服务器实现Word文档下载推荐.docx
《计算机网络课程设计简单FTP服务器实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计简单FTP服务器实现Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。
这个数据连接是全双工的。
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();
Ftp服务已停止!
"
lstboxStatus.TopIndex=lstboxStatus.Items.Count-1;
启动"
//使用数据连接发送文件流(客户端发送下载文件命令)
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);
StreamReaderstreamReader=newStreamReader(fs);
while(streamReader.Peek()>
-1)
user.dataSession.streamWriter.WriteLine(streamReader.ReadLine());
...]发送完毕!
finally
user.dataSession.Close();
fs.Close();
3.2文件传输操作(客户端)
由于代码过多且相似,以显示文件目录和上传文件为例。
//处理并显示文件目录列表
string[]ftpdir=s.Split(Environment.NewLine.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
intlength=0;
for(inti=0;
i<
ftpdir.Length;
i++)
if(ftpdir[i].EndsWith("
."
))
{length=ftpdir[i].Length-2;
}
s=ftpdir[i];
intindex=s.LastIndexOf('
\t'
if(index==-1)
if(length<
s.Length)
{index=length;
{continue;
stringname=s.Substring(index+1);
if(name=="
||name=="
.."
)
{continue;
//判断是否为目录,在名称前加"
目录"
来表示
if(s[0]=='
d'
||(s.ToLower()).Contains("
<
dir>
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;
//判断是否为文件
if(!
(s[0]=='
)))
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);
stringuri=GetUriString(fileinfo.Name);
FtpWebRequestrequest=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.TopIndex=lstbxFtpState.Items.Count-1;
上传完毕,服务器返回:
+response.StatusCode+"
"
+response.StatusDescription);
MessageBox.Show("
上传成功!
//上传成功后,立即刷新服务器目录列表
ShowFtpFileAndDirectory();
catch(WebExceptionex)
上传发生错误,返回信息为:
+ex.Status);
MessageBox.Show(ex.Message,"
上传失败"
4实例演示
首先在F:
\盘下新建文件夹计科112,在其中创建目录结构并放一些文件资源,例如图片,文档等。
运行FTP服务器程序,然后点击“启动”按钮后就启动了FTP服务器,运行结果如下图所示。
图3ftp服务器启动
FTP服务器程序中已经初始化用户名和密码,直接输入用户名和密码为19211203和19211205后点击“登录”按钮后就完成了用户验证的过程,并与FTP服务器建立了控制连接和数据连接。
运行结果如下图:
图4登陆后ftp服务器
图5登陆后ftp客户端
用户可以通过"
上传"
、“下载”和删除按钮来对FTP服务器上的文件进行操作。
5总结
我们的系统还存在着很多不足,一方面因为时间原因因为选题阶段和构思阶段浪费了大量的时间,有很多可以实现的功能没有实现比如说客户端的注销功能。
还有就是我们的系统不能经过多台电脑联网真实的模拟ftp服务器的功能,而只能在一台电脑上仿真模拟。
这次课程设计感觉对我们的学习能力和全局考虑能力有很大的提高,总体来说我们发挥了我们全部的水平,不过也有一些缺陷,比如说我们一开始不是很懂选择方向出现了一些问题,这是我们没有沟通好的地方,如果还有机会一定改进这些问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 简单 FTP 服务器 实现