大约在去年的12月份,我们开始着手设计和开发这项功能,而该项功能主要是解决类似于一些
帖子附件(图片或文件)访问比较频繁,同时附件的体积又比较大,从而造成对主站服务器访问压
力过大的问题。而实现了该项功能之后,在一些合作伙伴的站点上使用了一段时间,发现该功能明
显的降低了主站服务器的负载,使其可以节省更多的资源(cpu,内存等) 用于处理用户的其它访问
请求。
下面就简要介绍一下该功能的一些实现细节, 该项功能所实现的流程如下图所示:
而主要的核心就是采用FTP协议上传附件到远程的服务器上,这样当用户点开网页或进行附件下
载时,就会将链接指向远程的FTP服务上(该服务器要支持HTTP协议访问其资源)。而这个类的原
型链接如下:
http://www.csharphelp.com/archives/archive9.html
本人在其基础上修改了该类在DEBUG模式下上传文件过程中的BUG,同时翻译了其注释内容。大
家可在dicuz.common.dll(discuz!nt 2.1以后的版块)的中找到该类(使用Reflector)。
下面是其核心代码(您可在下个开源版本中获取该类的全部代码):
Code
/**//// <summary>
/// FTP类
/// </summary>
public class FTP
{
变量声明#region 变量声明
/**//// <summary>
/// 服务器连接地址
/// </summary>
public string server;
/**//// <summary>
/// 登陆帐号
/// </summary>
public string user;
/**//// <summary>
/// 登陆口令
/// </summary>
public string pass;
/**//// <summary>
/// 端口号
/// </summary>
public int port;
/**//// <summary>
/// 无响应时间(FTP在指定时间内无响应)
/// </summary>
public int timeout;
/**//// <summary>
/// 服务器错误状态信息
/// </summary>
public string errormessage;
/**//// <summary>
/// 服务器状态返回信息
/// </summary>
private string messages;
/**//// <summary>
/// 服务器的响应信息
/// </summary>
private string responseStr;
/**//// <summary>
/// 链接模式(主动或被动,默认为被动)
/// </summary>
private bool passive_mode;
/**//// <summary>
/// 上传或下载信息字节数
/// </summary>
private long bytes_total;
/**//// <summary>
/// 上传或下载的文件大小
/// </summary>
private long file_size;
/**//// <summary>
/// 主套接字
/// </summary>
private Socket main_sock;
/**//// <summary>
/// 要链接的网络地址终结点
/// </summary>
private IPEndPoint main_ipEndPoint;
/**//// <summary>
/// 侦听套接字
/// </summary>
private Socket listening_sock;
/**//// <summary>
/// 数据套接字
/// </summary>
private Socket data_sock;
/**//// <summary>
/// 要链接的网络数据地址终结点
/// </summary>
private IPEndPoint data_ipEndPoint;
/**//// <summary>
/// 用于上传或下载的文件流对象
/// </summary>
private FileStream file;
/**//// <summary>
/// 与FTP服务器交互的状态值
/// </summary>
private int response;
/**//// <summary>
/// 读取并保存当前命令执行后从FTP服务器端返回的数据信息
/// </summary>
private string bucket;
#endregion
构造函数#region 构造函数
/**//// <summary>
/// 构造函数
/// </summary>
public FTP()
{
server = null;
user = null;
pass = null;
port = 21;
passive_mode = true;
main_sock = null;
main_ipEndPoint = null;
listening_sock = null;
data_sock = null;
data_ipEndPoint = null;
file = null;
bucket = "";
bytes_total = 0;
timeout = 10000; //无响应时间为10秒
messages = "";
errormessage = "";
}
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="server">服务器IP或名称</param>
/// <param name="user">登陆帐号</param>
/// <param name="pass">登陆口令</param>
public FTP(string server, string user, string pass)
{
this.server = server;
this.user = user;
this.pass = pass;
port = 21;
passive_mode = true;
main_sock = null;
main_ipEndPoint = null;
listening_sock = null;
data_sock = null;
data_ipEndPoint = null;
file = null;
bucket = "";
bytes_total = 0;
timeout = 10000; //无响应时间为10秒
messages = "";
errormessage = "";
}
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="server">服务器IP或名称</param>
/// <param name="port">端口号</param>
/// <param name="user">登陆帐号</param>
/// <param name="pass">登陆口令</param>
public FTP(string server, int port, string user, string pass)
{
this.server = server;
this.user = user;
this.pass = pass;
this.port = port;
passive_mode = true;
main_sock = null;
main_ipEndPoint = null;
listening_sock = null;
data_sock = null;
data_ipEndPoint = null;
file = null;
bucket = "";
bytes_total = 0;
timeout = 10000; //无响应时间为10秒
messages = "";
errormessage = "";
}
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="server">服务器IP或名称</param>
/// <param name="port">端口号</param>
/// <param name="user">登陆帐号</param>
/// <param name="pass">登陆口令</param>
/**//// <summary>
/// FTP类
/// </summary>
public class FTP
{
变量声明#region 变量声明
/**//// <summary>
/// 服务器连接地址
/// </summary>
public string server;
/**//// <summary>
/// 登陆帐号
/// </summary>
public string user;
/**//// <summary>
/// 登陆口令
/// </summary>
public string pass;
/**//// <summary>
/// 端口号
/// </summary>
public int port;
/**//// <summary>
/// 无响应时间(FTP在指定时间内无响应)
/// </summary>
public int timeout;
/**//// <summary>
/// 服务器错误状态信息
/// </summary>
public string errormessage;
/**//// <summary>
/// 服务器状态返回信息
/// </summary>
private string messages;
/**//// <summary>
/// 服务器的响应信息
/// </summary>
private string responseStr;
/**//// <summary>
/// 链接模式(主动或被动,默认为被动)
/// </summary>
private bool passive_mode;
/**//// <summary>
/// 上传或下载信息字节数
/// </summary>
private long bytes_total;
/**//// <summary>
/// 上传或下载的文件大小
/// </summary>
private long file_size;
/**//// <summary>
/// 主套接字
/// </summary>
private Socket main_sock;
/**//// <summary>
/// 要链接的网络地址终结点
/// </summary>
private IPEndPoint main_ipEndPoint;
/**//// <summary>
/// 侦听套接字
/// </summary>
private Socket listening_sock;
/**//// <summary>
/// 数据套接字
/// </summary>
private Socket data_sock;
/**//// <summary>
/// 要链接的网络数据地址终结点
/// </summary>
private IPEndPoint data_ipEndPoint;
/**//// <summary>
/// 用于上传或下载的文件流对象
/// </summary>
private FileStream file;
/**//// <summary>
/// 与FTP服务器交互的状态值
/// </summary>
private int response;
/**//// <summary>
/// 读取并保存当前命令执行后从FTP服务器端返回的数据信息
/// </summary>
private string bucket;
#endregion
构造函数#region 构造函数
/**//// <summary>
/// 构造函数
/// </summary>
public FTP()
{
server = null;
user = null;
pass = null;
port = 21;
passive_mode = true;
main_sock = null;
main_ipEndPoint = null;
listening_sock = null;
data_sock = null;
data_ipEndPoint = null;
file = null;
bucket = "";
bytes_total = 0;
timeout = 10000; //无响应时间为10秒
messages = "";
errormessage = "";
}
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="server">服务器IP或名称</param>
/// <param name="user">登陆帐号</param>
/// <param name="pass">登陆口令</param>
public FTP(string server, string user, string pass)
{
this.server = server;
this.user = user;
this.pass = pass;
port = 21;
passive_mode = true;
main_sock = null;
main_ipEndPoint = null;
listening_sock = null;
data_sock = null;
data_ipEndPoint = null;
file = null;
bucket = "";
bytes_total = 0;
timeout = 10000; //无响应时间为10秒
messages = "";
errormessage = "";
}
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="server">服务器IP或名称</param>
/// <param name="port">端口号</param>
/// <param name="user">登陆帐号</param>
/// <param name="pass">登陆口令</param>
public FTP(string server, int port, string user, string pass)
{
this.server = server;
this.user = user;
this.pass = pass;
this.port = port;
passive_mode = true;
main_sock = null;
main_ipEndPoint = null;
listening_sock = null;
data_sock = null;
data_ipEndPoint = null;
file = null;
bucket = "";
bytes_total = 0;
timeout = 10000; //无响应时间为10秒
messages = "";
errormessage = "";
}
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="server">服务器IP或名称</param>
/// <param name="port">端口号</param>
/// <param name="user">登陆帐号</param>
/// <param name="pass">登陆口令</param>