一 简述

  命令行协议是一种使用比较多的协议,其优点在于使用简单易于扩展性,同时也利于解析和使用。FTP,POP,SMTP等均采用命令行协议,其中FTP在早起互联网时期成为网络资源共享的主要方式,可见FTP协议之重要性。我想正是由于命令行协议的优势所以ss的默认协议就是它。

  对于FTP的详细介绍这里可以参考:http://www.cnblogs.com/luoxn28/p/5585458.html,或者其他博文。不管什么博文还是来看代码最能理解其工作机制和原理。

另外FTP也常在计算机软件系统架构中担任文件服务器一职,提供文件上传下载服务,如图片

二 FTP服务器

  2.1 功能需求

    FTPServer作为服务器,首先应该提供用户管理功能,文件资源管理(类似于windows资源管理器),FTP命令以及文件传输,协议封装等主要职能

  2.2 用户管理

    这里可以连接windows系统用户也可以预定义相关用户并以配置文件或者其他方式存储,FTP有匿名和非匿名用户登录认证,这取决于FTP服务的安全性和共享性,对于匿名用户来说该用户是共享且开放的,对于非匿名用户可以通过权限来控制文件的访问与管理。

  2.3 资源管理

  文件资源管理类似于windows资源管理器,只是这里管理的对象是文件而已,所谓文件管理主要包括,查询,查看,创建,删除,修改,其中查询文件列表链接到递归知识。

  2.4 FTP命令

    SS已封装好命令基类,所以这里只需按照FTP协议的命令进行相应命令类定义

  2.5 文件传输

    FTP文件传输有主被动之分,所谓的主被动针对客户端来说,主动模式下,用户发送上传或者下载文件服务命令,同时在发送的命令参数中携带客户端主动打开的端口告诉给服务器,在服务器接收到该信息并尝试与该端口建立连接并传输文件流,反之亦然。FTP提供文件传输通道的建立与关闭。

  2.6 协议封装

     FTP命令均是字符串,且确定,所以SS采用字符串资源管理器来封装FTP命令,对于服务器来说直接使用相关字符串资源命令收发消息即可

三 通信过程

3.1 登陆

  登陆过程:客户端会发送PASS命令,携带用户名密码等验证信息给服务端,当然这是针对非匿名的FTP,在接收到的参数中进行用户授权验证,将验证结果返回客户端;

3.2 执行命令

命令的执行贯穿整个客户端服务端会话周期,如LIST命令,ABORT等等。

3.3 文件传输

  3.3.1  主动模式

    首先客户端发起文件传输命令如下载,上传,PORT,STOR、命令,携带客户端主动打开的客户端断开默认为20端口,此断开默认在防火墙内部不被过滤掉,服务器收到该命令向客户端发送接收ok命令,且尝试向客户端地址和断开发起连接,建立二进制文件流传输通道,代码详看PORT命令和STOR命令

 3.3.2 被动模式

    首先还是客户端向服务器发起上传或者下载命令请求,服务端开启随机端口名发送给客户端,客户端与服务器建立数据传输通道,开启文件传输

 DataConnection:数据连接通道类,该类主要负责传输通道维护工作,提供通道建立,文件传输,关闭等方法

  3.3.3 通道关闭

  通道关闭的原因有3:会话关闭,传输完成,传输异常,通道的关闭实为关闭Socket,当然这是在被动模式下由服务端开启的端口,这样也就起到回收的作用。

 public virtual void Close()
{
StopListener(); if (Client != null && !m_IsClosed)
{
try
{
Client.Shutdown(SocketShutdown.Both);
}
catch (Exception e)
{
m_Session.Logger.Error(e);
} try
{
Client.Close();
}
catch (Exception e)
{
m_Session.Logger.Error(e);
}
finally
{
Client = null;
m_Session = null;
m_IsClosed = true;
OnClose();
}
}
}

SuperSocket应用之FTP源码解析的更多相关文章

  1. FileZilla客户端源码解析

    FileZilla客户端源码解析 FTP是TCP/IP协议组的协议,有指令通路和数据通路两条通道.一般来说,FTP标准命令TCP端口号是21,Port方式数据传输端口是20. FileZilla作为p ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  7. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  8. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  9. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

随机推荐

  1. js中的总结汇总(以后的都收集到这篇)

    点1:js中的比较字符串是否相等,js中是用"=="这个来判断是否相等,这点跟java中不一样,java中是.equals()这种方法. 在之前写的ajax的demo中,因为用了. ...

  2. [转] iOS (OC) 中 KVC 与 KVO 理解

    转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...

  3. python成长之路——第六天

    定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...

  4. Linux常用命令  新手必看

    文件和目录cd /home 进入 '/ home' 目录'cd .. 返回上一级目录cd ../.. 返回上两级目录cd 进入个人的主目录cd ~user1 进入个人的主目录cd - 返回上次所在的目 ...

  5. 2014 HDU多校弟六场J题 【模拟斗地主】

    这是一道5Y的题目 有坑的地方我已在代码中注释好了 QAQ Ps:模拟题还是练的太少了,速度不够快诶 //#pragma comment(linker, "/STACK:16777216&q ...

  6. bresenham算法的FPGA的实现2

    在上一篇里http://www.cnblogs.com/sepeng/p/4045593.html <bresenham算法的FPGA的实现1>已经做了一个整体框架的布局,但是那个程序只是 ...

  7. Asp.Net Core

    开源Asp.Net Core小型社区系统 源码地址:Github 前言 盼星星盼月亮,Asp.Net Core终于发布啦!! Asp.Net发布时我还在上初中,没有赶上.但是Asp.Net Core我 ...

  8. 集合判断null

    Java 引用和指针差不多,null 引用 相当于 C++的空指针. isEmpty() 用于判断List内容是否为空,即表里一个元素也没有, 但是必须在 List<MallNews> g ...

  9. Python 内置函数 range的使用

    内置range函数可以用来方便的产生等差的数值序列.如: >>> range(5) [0, 1, 2, 3, 4] >>> range(1,5) [1, 2, 3, ...

  10. linux下find命令-atime,-ctime,-mtime真正含义

    linux下的-atime,-ctime,-mtime含义我们经常会在论坛或者群里面被问到,在linux或者unix下如何查看某文件的创建日期?经常又会有人说用find命令加选项-ctime,其实这里 ...