• 基于ESFramework的FTP服务 —— ESFramework扩展之EsfFTP


       
       ESFramework体系的目标之一就是帮助快速构建IM与业务相结合的系统,在我们的业务应用中,经常会遇到类似这样的需求:商家或服务商需要提供一些资料(文档、影片宣传资料等)给他的用户,他希望用户能方便地下载这些资料,另外,用户也可以直接上传自己的文件到服务器供商家检阅。这种功能就像我们常用的FTP软件的功能一样,在这里,它通常可以直接集成到企业的业务应用中。

       EsfFTP是一个实现了Ftp功能的ESFramework扩展,它支持如下功能:
    (1)下载文件
    (2)上传文件
    (3)删除服务器上的文件
    (4)权限控制(Ftp可访问性控制)

       客户端通过IFtpOutter接口与服务器进行有关Ftp的交互。
          

       由于Ftp功能主要是文件的上传下载功能,所以IFtpOutter从IGeneralFileOutter接口继承,IGeneralFileOutter接口也被EsfIMCore扩展使用,以用于在用户之间进行P2P的文件传递。
       IFtpOutter.GetFtpDirectory()方法用于获取服务器的FTP目录,下图是一个获取FTP目录列表的截图:
          

       调用IFtpOutter.UploadFile()和IFtpOutter.DownloadFile()方法可以进行文件上传和下载。IFtpOutter.RemoveFile()方法用于删除服务器上的文件。
       这些方法都返回FtpAccessResult枚举值:

        [EnumDescription("进行ftp操作的结果")]
        
    public enum FtpAccessResult
        {
            [EnumDescription(
    "OK")]
            OK ,
            [EnumDescription(
    "没有权限")]
            NoPermission  ,
            [EnumDescription(
    "下载的目标文件不存在")]
            FileNotExist ,  
    //For Download
            [EnumDescription("上传的文件已经存在")]
            FileHasExisted 
    //For Upload
        }

       这个结果是由服务端返回的,如果是删除文件,则服务端在返回FtpAccessResult.OK之前就已经成功删除了文件。如果是上传或下载文件,则在返回FtpAccessResult.OK之前就已经开始文件传输了。
       下图是进行文件下载和上传的截图:



       IFtpOutter扩展在实现的过程中,解决了几个小问题:
    (1)如果多个用户同时下载同一个文件,这时服务端打开文件的方式必须是以“共享、读”的方式打开,否则,将无法对文件进行并行访问。像下面这样以“共享、读”的方式打开文件:

    FileStream fs = new FileStream(filePath, FileMode.Open ,FileAccess.Read ,FileShare.Read);    

    (2)效率!当有很多用户在下载上传文件时,如何保证服务器的效率。
       文件传递非常影响服务器的效率,起主要决定作用的是两个因素,一是每个文件包(FilePackage)的大小,而是两个文件包之间的发送间隔时间的大小。我曾试过,如果间隔时间为0ms,那么当仅仅几个用户下载文件时,服务端的Cpu利用率就是90%-100%。当我把间隔时间设为20ms,同等情况下服务器Cpu利用率为3%-5%,这就正常了。同样FilePackage的大小取值,是1k?还是100k?对效率的影响都是非常大的。至于间隔时间和FilePackage的大小取值到底为多少,需要根据我们的应用环境和网络环境来决定。EsfFTP提供的默认值是:时间间隔为20ms,FilePackage大小为10k。

       在ESFramework V1.0 高级演示(0915)中,提供了FTP演示功能,需要试用的朋友可以从ESFramework体系 (序) “下载”部分下载用用看。
       下载解压后,打开ApplicationServerSystem文件夹(服务端程序)下的ApplicationServerSystem.exe.config文件,找到"ftpManager"的配置,将FtpDirectoryPath属性的值修改为你要开放的Ftp目录,然后运行即可。

          
       转到:ESFramework体系 (序)

  • 相关阅读:
    Jzoj4782 Math
    Jzoj4778 数列编辑器
    Jzoj4778 数列编辑器
    力扣算法题—067二进制求和
    力扣算法题—066加一
    最小凸包算法
    力扣算法题—065有效数字
    力扣算法题—064最小路径之和
    力扣算法题—063不同路径2
    力扣算法题—062不同路径
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/505008.html
Copyright © 2020-2023  润新知