一 简述

  命令行协议是一种使用比较多的协议,其优点在于使用简单易于扩展性,同时也利于解析和使用。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. Android短信拦截和电话拦截

    MainActivity: package com.wyl.bctest; import android.support.v7.app.ActionBarActivity; import androi ...

  2. 基于FPGA的DW8051移植(二)

    基于上一篇博文继续,本来想换到oc8051,但是还是不甘心,弄了这么久还是没有弄出来,真是打击屎了. 上一篇说3f进入了operation code所以判断是代码错误,后来发现不可以这么判断. 因为地 ...

  3. 带OpenSSL和MySQL的静态编译版本~

    http://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/ http://www.npcglib.org/~stathis/blog/preco ...

  4. 一步一步重写 CodeIgniter 框架 (9) —— 使用 CodeIgniter 类库

    通过前面几节的内容,我们从零开始搭建了一个非常方便的MVC框架,理解了 CodeIgniter 框架最核心的部分.然而一个框架的便利不仅仅在于提供一个MVC就可以了,它还必须具有较高的扩展性.下面将从 ...

  5. iOS插件化研究之中的一个——JavaScriptCore

    原文:p=191">http://chentoo.com/?p=191 一.前言 一样的开篇问题,为什么要研究这个?iOS为什么要插件化?为什么要借助其它语言比方html5 js甚至脚 ...

  6. 基于Qt的简单计算器

    界面: UI ui由qtdesign中托控件形成. #ifndef WIDGET_H #define WIDGET_H #include <vector> #include <QWi ...

  7. linux+nginx+mysql+php高性能服务器搭建

    1.安装基础包 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freet ...

  8. IOS_Note

    关键字:可以搜索这些关键字找到具体内容 退回输入键盘.CGRect.CGPoint & CGSize.设置透明度.设置背景色.自定义颜色. 竖屏.横屏.状态栏高  (显示时间和网络状态). 导 ...

  9. 架构漫谈:UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别

    这是一堂关于UML基础知识的补习课:现在我们做项目时间都太紧了,基本上都没有做过真正的class级别的详细设计,更别提使用UML来实现规范建模了:本篇主要就以前自己一直感觉很迷糊的几种class之间的 ...

  10. windows phone8手机玩玩

    背景介绍 北京移动在搞活动,预存话费赠手机活动,因此办理了一个,来玩新手机了. 上手一周了,白色的手机,对我来说配置凑合,主要是想学习wp8手机的开发,这样也有个样机玩玩.开发人员就是这么的喜欢玩. ...