设为首页 收藏本站
查看: 1304|回复: 0

[经验分享] ESFramework Demo -- 简单的FTP服务器Demo(附源码)

[复制链接]

尚未签到

发表于 2016-6-10 11:06:56 | 显示全部楼层 |阅读模式
   FTP服务器最核心的功能就是提供文件的上传、下载服务。在ESFramework Demo -- 文件传送Demo(附源码)一文中,我们演示了如何在客户端与客户端之间相互传送文件,现在我们就实现一个简单的FTP服务器,以演示如何在客户端与服务器之间传送文件。在阅读本文之前,请务必先掌握ESFramework开发手册(03) -- 文件(夹)传送 一文中介绍的文件传送的流程及相关的API的用法。
  本Demo主要演示以下功能:
  (1)客户端浏览服务器默认目录下的所有文件。
  (2)客户端上传文件到服务器的默认目录下。
  (3)客户端可以下载服务器默认目录下任何一个文件。
  
一.定义信息类型
   根据上面提到的功能需求,我们需要定义相应的信息类型:
public static class FtpInformationTypes{/// <summary>/// 获取所有文件名。C->S/// </summary>public const int GetAllFileNames = 0;/// <summary>/// 请求下载文件。C->S/// </summary>public const int DownloadFile = 1;        }   上传文件就不用定义额外的信息类型了,可以直接使用IFileOutter的请求发送文件方法就可以了。
  
二.服务端
   服务端将文件目录设定在运行目录下的"FileFold"文件夹,所有上传的文件都将被保存到这个目录,所有要下载的文件也来自这个目录。
   服务端的CustomizeHandler类实现了自定义信息处理器接口ICustomizeHandler,当收到来自客户端的FtpInformationTypes.GetAllFileNames同步调用时,就将FileFold目录下的所有文件列表返回给客户端。当收到请求下载文件的信息时,就调用IFileController.BeginSendFile方法将指定的文件发给客户端。
   当客户端要上传文件时,会直接调用IFileOutter的BeginSendFile,此时,服务端将触发IFileController的FileRequestReceived事件。所以,服务端需要预定并处理这个事件:
void fileController_FileRequestReceived(string fileID, string senderID, string fileName, ulong fileLength, ESPlus.FileTransceiver.ResumedProjectItem resumedProjectItem, string comment){int index = fileName.LastIndexOf('\\');string filePath = string.Format(@"{0}FileFold\{1}", AppDomain.CurrentDomain.BaseDirectory, fileName.Substring(index +1));this.fileController.BeginReceiveFile(fileID, filePath);}   服务端将保存文件的路径设定在FileFold目录下,然后调用IFileController.BeginReceiveFile方法开始接收文件。当然,这里的处理做了很多简化,比如没有判断磁盘空间是否足够、是否有同名文件等等。
  
三.客户端
   客户端登录成功后,进入主界面。主界面初始化时,将向服务器发送FtpInformationTypes.GetAllFileNames同步调用,然后将返回的文件列表显示在ListView中。
   双击ListView中的某个文件时,就向服务器发送FtpInformationTypes.DownloadFile信息。就像上面描述的一样,服务端就会调用IFileController.BeginSendFile方法发送指定的文件,然后,客户端也会触发IFileOutter.FileRequestReceived事件,处理这个事件时,我们让用户选择要存储的路径。
void fileOutter_FileRequestReceived(string projectID, string senderID, string fileName, ulong totalSize, ResumedProjectItem resumedFileItem, string comment){if (this.InvokeRequired){this.Invoke(new CbReadyToAcceptFileAsyn(this.fileOutter_FileRequestReceived), projectID, senderID, fileName, totalSize, resumedFileItem, comment);}else{string savePath = ESBasic.Helpers.FileHelper.GetPathToSave("保存", fileName, null);if (string.IsNullOrEmpty(savePath)){this.fileOutter.RejectFile(projectID);}else{this.fileOutter.BeginReceiveFile(projectID, savePath);}}           }  如果用户取消了保存路径的选择,表示放弃下载文件,这样就调用IFileOutter.RejectFile来进行取消操作。
当客户端点击上传按钮时,就直接调用IFileOutter.BeginSendFile来准备上传文件。
private void toolStripButton_upLoad_Click(object sender, EventArgs e){string filePath = ESBasic.Helpers.FileHelper.GetFileToOpen("打开");if (filePath == null){return;}string fileID;SendingFileParas sendingFileParas = new SendingFileParas(2048, 0);//文件数据包大小,可以根据网络状况设定,局网内可以设为204800,传输速度可以达到30M/s以上;公网建议设定为2048或4096或8192this.fileOutter.BeginSendFile(NetServer.SystemUserID, filePath, null, sendingFileParas, out fileID);}  这将引发服务端IFileController的FileRequestReceived事件触发,然后,服务端会调用IFileController.BeginReceiveFile方法,从而启动文件的正式传递。
   下图是客户端正在进行上传下载文件时的截图:
DSC0000.jpg
   本文是一个最简单的演示文件上传下载功能的demo,非常的粗糙,仅仅用于示范如何使用ESPlus提供的文件传送功能在服务端和客户端之间传递文件。若要正式开发一个文件服务器系统,本文只能算是一个简陋的起点,还有很多复杂的事情要做,那已经超出了本文的内容,但你若有任何想法,欢迎与我们讨论。
  
四.源码下载
  ESFramework.Demos.Ftp 源码
  
  阅读 更多ESFramework开发手册系列文章。
  -----------------------------------------------------------------------------------------------------------------------------------------------
  关于ESFramework的任何问题,欢迎联系我们:
  电话:027-87638960
  Q Q:372841921
邮件:esframework@oraycn.com
  


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228582-1-1.html 上篇帖子: virtual box中安装red hat并实现 ftp功能 下篇帖子: 一个FTP Pool工具类的实现(Commons Pool)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表