计算机网络课程设计报告-简单FTP服务器实现.doc_第1页
计算机网络课程设计报告-简单FTP服务器实现.doc_第2页
计算机网络课程设计报告-简单FTP服务器实现.doc_第3页
计算机网络课程设计报告-简单FTP服务器实现.doc_第4页
计算机网络课程设计报告-简单FTP服务器实现.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机网络课程设计报告学 院: 专 业: 班 级: 设计题目: 简单ftp服务器实现 组 长:组 员 指导教师: 成 绩: 时 间: 2014至 2015学年度 第 1 学期9月25日至10月30日简单ftp服务器实现1 关键技术1.1 ftp协议ftp的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。图1 ftp 服务示意图在开始阶段,标准ftp命令由用户pi产生并通过控制连接传送到服务器进程。服务器pi向用户pi返回标准应答。ftp命令指定数据连接参数和文件系统操作。用户dtp在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。数据端口不必在开始ftp命令的机器上,但用户或用户ftp进程必须确定它在指定的数据端口上侦听。这个数据连接是全双工的。ftp协议中对应答码的意义有明确的规定,如下表所示: 表1 ftp协议应答码应答码意义应答码意义110重新启动标记应答。在这种情况下文本是确定的,它必须是:mark yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。120服务在nnn分钟内准备好125数据连接已打开,准备传送150文件状态良好,打开数据连接200命令成功202命令未实现211系统状态或系统帮助响应212目录状态213文件状态214帮助信息,信息仅对人类用户有用215名字系统类型220对新用户服务准备好221服务关闭控制连接,可以退出登录225数据连接打开,无传输正在进行226关闭数据连接,请求的文件操作成功227进入被动模式230用户登录250请求的文件操作完成257创建pathname331用户名正确,需要口令332登录时需要帐户信息350请求的文件操作需要进一步命令421不能提供服务,关闭控制连接425不能打开数据连接426关闭连接,中止传输450请求的文件操作未执行451中止请求的操作:有本地错误452未执行请求的操作:系统存储空间不足500格式错误,命令不可识别501参数语法错误502命令未实现503命令顺序错误504此参数下的命令功能未实现530未登录532存储文件需要帐户信息550未执行请求的操作551请求操作中止:页类型未知552请求的文件操作中止,存储分配溢出553未执行请求的操作:文件名不合法1.2 tcp协议的编程socket(套接字)是通信的基石,是支持tcp/ip协议的网络通信的基本操作单元。可以将socket看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。socket存在于通信域中,通信域是为了处理一般的线程通过socket通信而引进的一种抽象概念。socket通常和同一个域中的socket交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。各种进程使用这个相同的域互相之间用internet协议簇来进行通信。2 功能设计2.1 功能示意图服务器端客户端验证登陆链接下载登陆上传下载删除主动被动图2 实现功能示意图以ftp的工作原理和权限归属为基础,用c#语言编写程序,用简单界面展示,用socket编程和二进制输入输出流来实现了ftp文件上传,下载,删除,读取文件列表这几项功能。采用端口为21和ip地址为连接。3 代码实现3.1 启动服务器(服务器端)/ 启动服务器 private void btnftpserverstartstop_click(object sender, eventargs e) if (mytcplistener = null) listenthread = new thread(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 = 启动; / 使用数据连接发送文件流(客户端发送下载文件命令) private void sendfilebyusersession(user user, filestream fs) addinfo(向用户发送(文件流):.); try if (user.isbinary) byte bytes = new byte1024; binaryreaderbinaryreader=new binaryreader(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 streamreader streamreader = new streamreader(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); int length = 0; for (int i = 0; i ftpdir.length; i+) if (ftpdiri.endswith(.) length = ftpdiri.length - 2; for (int i = 0; i ftpdir.length; i+) s = ftpdiri; int index = s.lastindexof(t); if (index = -1) if (length s.length) index = length; else continue; string name = s.substring(index + 1); if (name = . | name = .) continue; / 判断是否为目录,在名称前加目录来表示 if (s0 = d | (s.tolower().contains() string namefield = name.split( ); int namefieldlength = namefield.length; string dirname; dirname = namefieldnamefieldlength - 1; / 对齐 dirname = dirname.padright(34, ); name = dirname; / 显示目录 lstbxftpresources.items.add(目录 + name); for (int i = 0; i ftpdir.length; i+) s = ftpdiri; int index = s.lastindexof(t); if (index = -1) if (length s.length) index = length; else continue; string name = s.substring(index + 1); if (name = . | name = .) continue; / 判断是否为文件 if (!(s0 = d | (s.tolower().contains() string namefield = name.split( ); int namefieldlength = namefield.length; string filename filename = namefieldnamefieldlength - 1; / 上传文件到服务器事件 private void btnupload_click(object sender, eventargs e) / 选择要上传的文件 openfiledialog openfiledialog = new openfiledialog(); openfiledialog.filename = openfiledialog.filenames.tostring(); openfiledialog.filter = 所有文件(*.*)|*.*; if (openfiledialog.showdialog() != dialogresult.ok) return; fileinfo fileinfo = new fileinfo(openfiledialog.filename); try string uri = geturistring(fileinfo.name); ftpwebrequest request = createftpwebrequest(uri, webrequestmethods.ftp.uploadfile); request.contentlength = fileinfo.length; int buflength = 8196; byte buffer = new bytebuflength; filestream filestream = fileinfo.openread(); stream responsestream = request.getrequeststream(); lstbxftpstate.items.add(打开上传流,文件上传中.); int contenlength = filestream.read(buffer, 0, buflength); while (contenlength != 0) responsestream.write(buffer, 0, contenlength); contenlength = filestream.read(buffer, 0, buflength); responsestream.close(); filestream.close(); ftpwebresponse response = 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 (webexception ex) lstbxftpstate.items.add(上传发生错误,返回信息为: + ex.status); lstbxftpstate.topindex = lstbxftpstate.items.count - 1; messagebox.show(ex.message, 上传失败); 4 实例演示首先在f:盘下新建文件夹计科112,在其中创建目录结构并放一些文件资源,例如图片,文档等。运行ftp服务器程序,然后点击“启动”按钮后就启动了ftp服务器,运行结果如下图所示。图3 ftp服务器启动ftp服务器程序中已经初始化用户名和密码,直接输入用户名和密码为19211203和19211205后点击“登录”按钮后就完成了用户验证的过程,并与ftp服务器建立了控制连接和数据连接。运行结果如下图:图4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论