‘壹’ 关于如何实现FTP上传或者下载带进度和速率的实现方法
在这里需要说明的是,该方式是通过其他代码进行改进的。 首先我们需要定义一个委托,用来实现传输过程中传递文件的总数,已完成的字节数和速度,方便客户端界面上调用。 public delegate void TransferProcess(long total,long finished,double speed); 调用代码就不举例了 接下来我们建立一个FTPClient类,该类基于socket和FTP协议实现了连接FTP服务,建立目录,上传文件,下载文件等主要方法。结构如下: 需要注意的是,我们需要定一个事件event TransferProcess OnTransferProcess;该事件在实例化FTPClient之后需要调用,这个事件对实现进度条和速率是非常重要的。为了实现速率我们还需要定义个公开的成员startTime(开始时间)。我们现在主要是看一下如何上传的。 /// /// 上传一个文件 /// /// 本地文件名 public void Put(string strFileName) { //连接服务器 if (!bConnected) { Connect(); } UpdateStatus = true; //建立socket连接 Socket socketData = CreateDataSocket(); //向FTP服务器发生存储命令 SendCommand("STOR " + Path.GetFileName(strFileName)); //如何服务器返回的信息不是我们所需要的,就抛出异常 if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } //建立本地文件的数据流 FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length;//该成员主要记录文件的总字节数,注意这里使用长整型,是为了突破只能传输2G左右的文件的限制 long finished = 0;//该成员主要记录已经传输完成的字节数,注意这里使用长整型,是为了突破只能传输2G左右的文件的限制 double speed = 0;//记录传输的速率 while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)//循环从本地数据流中读取数据到缓冲区 { //Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0);//将缓冲区的数据发送到FTP服务器 DateTime endTime = DateTime.Now;//每次发送数据的结束时间 TimeSpan ts = endTime - startTime;//计算每次发送数据的时间间隔 finished += iBytes;//计算完成的字节数. Console.WriteLine(ts.Milliseconds); //计算速率,注意finished是字节,所以需要换算冲K字节 if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } //这里是必不可少的,否则你无法实现进度条 //如果传输进度事件被实例化,而且从本地数据流中读取数据不是空的并完成的字节数也不为空的话,则实现委托. if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close();//当传输完成之后需要关闭数据流,以便下次访问. if (socketData.Connected) { socketData.Close();//关闭当前的socket } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } 上面代码中注释写得比较详细,这里就不再一一讲解了,关于下载中实现进度条和速率的问题可以参考以上代码进行修改. 完整的代码如下: using System; using System.net; using System.IO; using System.Text; using System.net.Sockets; namespace MMSEncoder { public delegate void TransferProcess(long total,long finished,double speed); /// /// FTP Client /// public class FTPClient { public event TransferProcess OnTransferProcess; public bool UpdateStatus = true; public DateTime startTime; private bool IsAbortConnect = false; #region 构造函数 /// /// 缺省构造函数 /// public FTPClient() { strRemoteHost = ""; strRemotePath = ""; strRemoteUser = ""; strRemotePass = ""; strRemotePort = 21; bConnected = false; } /// /// 构造函数 /// /// FTP服务器IP地址 /// 当前服务器目录 /// 登录用户账号 /// 登录用户密码 /// FTP服务器端口 public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort) { strRemoteHost = remoteHost; strRemotePath = remotePath; strRemoteUser = remoteUser; strRemotePass = remotePass; strRemotePort = remotePort; Connect(); } #endregion #region 登陆字段、属性 /// /// FTP服务器IP地址 /// private string strRemoteHost; public string RemoteHost { get { return strRemoteHost; } set { strRemoteHost = value; } } /// /// FTP服务器端口 /// private int strRemotePort; public int RemotePort { get { return strRemotePort; } set { strRemotePort = value; } } /// /// 当前服务器目录 /// private string strRemotePath; public string RemotePath { get { return strRemotePath; } set { strRemotePath = value; } } /// /// 登录用户账号 /// private string strRemoteUser; public string RemoteUser { set { strRemoteUser = value; } } /// /// 用户登录密码 /// private string strRemotePass; public string RemotePass { set { strRemotePass = value; } } /// /// 是否登录 /// private Boolean bConnected; public bool Connected { get { return bConnected; } } #endregion #region 链接 /// /// 建立连接 /// public void Connect() { //if (IsAbortConnect) throw new IOException("用户强制终止了FTP"); socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort); // 链接 try { socketControl.Connect(ep); } catch (Exception) { throw new IOException("无法连接到远程服务器!"); } // 获取应答码 ReadReply(); if (iReplyCode != 220) { DisConnect(); throw new IOException(strReply.Substring(4)); } // 登陆 SendCommand("USER " + strRemoteUser); if (!(iReplyCode == 331 || iReplyCode == 230)) { CloseSocketConnect();//关闭连接 throw new IOException(strReply.Substring(4)); } if (iReplyCode != 230) { SendCommand("PASS " + strRemotePass); if (!(iReplyCode == 230 || iReplyCode == 202)) { CloseSocketConnect();//关闭连接 throw new IOException(strReply.Substring(4)); } } bConnected = true; // 切换到初始目录 if (!string.IsNullOrEmpty(strRemotePath)) { ChDir(strRemotePath); } } /// /// 关闭连接 /// public void DisConnect() { if (socketControl != null) { SendCommand("QUIT"); } CloseSocketConnect(); } public void AbortConnect() { if (socketControl != null) { SendCommand("ABOR"); } IsAbortConnect = true; //CloseSocketConnect(); } #endregion #region 传输模式 /// /// 传输模式:二进制类型、ASCII类型 /// public enum TransferType { Binary, ASCII }; /// /// 设置传输模式 /// /// 传输模式 public void SetTransferType(TransferType ttType) { if (ttType == TransferType.Binary) { SendCommand("TYPE I");//binary类型传输 } else { SendCommand("TYPE A");//ASCII类型传输 } if (iReplyCode != 200) { throw new IOException(strReply.Substring(4)); } else { trType = ttType; } } /// /// 获得传输模式 /// /// 传输模式 public TransferType GetTransferType() { return trType; } #endregion #region 文件操作 /// /// 获得文件列表 /// /// 文件名的匹配字符串 /// public string[] Dir(string strMask) { // 建立链接 if (!bConnected) { Connect(); } //建立进行数据连接的socket Socket socketData = CreateDataSocket(); //传送命令 SendCommand("NLST " + strMask); //分析应答代码 if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)) { throw new IOException(strReply.Substring(4)); } //获得结果 strMsg = ""; while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '\n' }; string[] strsFileList = strMsg.Split(seperator); socketData.Close();//数据socket关闭时也会有返回码 if (iReplyCode != 226) { ReadReply(); if (iReplyCode != 226) { throw new IOException(strReply.Substring(4)); } } return strsFileList; } /// /// 获取文件大小 /// /// 文件名 /// 文件大小 public long GetFileSize(string strFileName) { if (!bConnected) { Connect(); } SendCommand("SIZE " + Path.GetFileName(strFileName)); long lSize = 0; if (iReplyCode == 213) { lSize = Int64.Parse(strReply.Substring(4)); } else { throw new IOException(strReply.Substring(4)); } return lSize; } /// /// 删除 /// /// 待删除文件名 public void Delete(string strFileName) { if (!bConnected) { Connect(); } SendCommand("DELE " + strFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 重命名(如果新文件名与已有文件重名,将覆盖已有文件) /// /// 旧文件名 /// 新文件名 public void Rename(string strOldFileName, string strNewFileName) { if (!bConnected) { Connect(); } SendCommand("RNFR " + strOldFileName); if (iReplyCode != 350) { throw new IOException(strReply.Substring(4)); } // 如果新文件名与原有文件重名,将覆盖原有文件 SendCommand("RNTO " + strNewFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } #endregion #region 上传和下载 /// /// 下载一批文件 /// /// 文件名的匹配字符串 /// 本地目录(不得以\结束) public void Get(string strFileNameMask, string strFolder) { if (!bConnected) { Connect(); } string[] strFiles = Dir(strFileNameMask); foreach (string strFile in strFiles) { if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串 { if (strFile.LastIndexOf(".") > -1) { Get(strFile.Replace("\r", ""), strFolder, strFile.Replace("\r", "")); } } } } /// /// 下载一个文件 /// /// 要下载的文件名 /// 本地目录(不得以\结束) /// 保存在本地时的文件名 public void Get(string strRemoteFileName, string strFolder, string strLocalFileName) { if (!bConnected) { Connect(); } SetTransferType(TransferType.Binary); if (strLocalFileName.Equals("")) { strLocalFileName = strRemoteFileName; } if (!File.Exists(strLocalFileName)) { Stream st = File.Create(strLocalFileName); st.Close(); } FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create); Socket socketData = CreateDataSocket(); SendCommand("RETR " + strRemoteFileName); if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); output.Write(buffer, 0, iBytes); if (iBytes <= 0) { break; } } output.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } } } /// /// 上传一批文件 /// /// 本地目录(不得以\结束) /// 文件名匹配字符(可以包含*和?) public void Put(string strFolder, string strFileNameMask) { string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask); foreach (string strFile in strFiles) { //strFile是完整的文件名(包含路径) Put(strFile); } } /// /// 上传一个文件 /// /// 本地文件名 public void Put(string strFileName) { if (!bConnected) { Connect(); } UpdateStatus = true; Socket socketData = CreateDataSocket(); SendCommand("STOR " + Path.GetFileName(strFileName)); if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length; long finished = 0; //DateTime startTime = DateTime.Now; double speed = 0; while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0) { Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0); DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; finished += iBytes; Console.WriteLine(ts.Milliseconds); if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } #endregion #region 目录操作 /// /// 创建目录 /// /// 目录名 public void MkDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("MKD " + strDirName); if (iReplyCode != 257) { throw new IOException(strReply.Substring(4)); } } /// /// 删除目录 /// /// 目录名 public void RmDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("RMD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 改变目录 /// /// 新的工作目录名 public void ChDir(string strDirName) { if (strDirName.Equals(".") || strDirName.Equals("")) { return; } if (!bConnected) { Connect(); } SendCommand("CWD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } this.strRemotePath = strDirName; } #endregion #region 内部变量 /// /// 服务器返回的应答信息(包含应答码) /// private string strMsg; /// /// 服务器返回的应答信息(包含应答码) /// private string strReply; /// /// 服务器返回的应答码 /// private int iReplyCode; /// /// 进行控制连接的socket /// private Socket socketControl; /// /// 传输模式 /// private TransferType trType; /// /// 接收和发送数据的缓冲区 /// private static int BLOCK_SIZE = Int16.MaxValue; Byte[] buffer = new Byte[BLOCK_SIZE]; /// /// 编码方式(为防止出现中文乱码采用 GB2312编码方式) /// Encoding GB2312 = Encoding.Default ;//Encoding.GetEncoding("gb2312"); #endregion #region 内部函数 /// /// 将一行应答字符串记录在strReply和strMsg /// 应答码记录在iReplyCode /// private void ReadReply() { strMsg = ""; strReply = ReadLine(); iReplyCode = Int32.Parse(strReply.Substring(0, 3)); } /// /// 建立进行数据连接的socket /// /// 数据连接socket private Socket CreateDataSocket() { SendCommand("PASV"); if (iReplyCode != 227) { throw new IOException(strReply.Substring(4)); } int index1 = strReply.IndexOf('('); int index2 = strReply.IndexOf(')'); string ipData = strReply.Substring(index1 + 1, index2 - index1 - 1); int[] parts = new int[6]; int len = ipData.Length; int partCount = 0; string buf = ""; for (int i = 0; i < len && partCount <= 6; i++) { char ch = Char.Parse(ipData.Substring(i, 1)); if (Char.IsDigit(ch)) buf += ch; else if (ch != ',') { throw new IOException("Malformed PASV strReply: " + strReply); } if (ch == ',' || i + 1 == len) { try { parts[partCount++] = Int32.Parse(buf); buf = ""; } catch (Exception) { throw new IOException("Malformed PASV strReply: " + strReply); } } } string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3]; int port = (parts[4] << 8) + parts[5]; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port); try { s.Connect(ep); } catch (Exception) { throw new IOException("无法连接服务器"); } return s; } /// /// 关闭socket连接(用于登录以前) /// private void CloseSocketConnect() { if (socketControl != null) { socketControl.Close(); socketControl = null; } bConnected = false; } /// /// 读取Socket返回的所有字符串 /// /// 包含应答码的字符串行 private string ReadLine() { while (true) { int iBytes = socketControl.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '\n' }; string[] mess = strMsg.Split(seperator); if (strMsg.Length > 2) { strMsg = mess[mess.Length - 2]; //seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串, //但也会分配为空字符串给后面(也是最后一个)字符串数组, //所以最后一个mess是没用的空字符串 //但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格 } else { strMsg = mess[0]; } if (!strMsg.Substring(3, 1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串) { return ReadLine(); } return strMsg; } /// /// 发送命令并获取应答码和最后一行应答字符串 /// /// 命令 private void SendCommand(String strCommand) { Byte[] cmdBytes = GB2312.GetBytes((strCommand + "\r\n").ToCharArray()); socketControl.Send(cmdBytes, cmdBytes.Length, 0); ReadReply(); } #endregion } }
‘贰’ 在远程电脑上安装一个FTP服务器,把上面的”5G“文件下载到我的电脑需要多长时间谢谢
局域网的话 应该可以达到 10M/S左右的速度, 5G 也要10分钟左右。 还得考虑交换机等等。
‘叁’ 什么是FTP怎么使用如何建立自己的FTP
3月29日 02:07 建立个人FTP服务器教程 以及 内网、局域网设置IP,建立FTP
【怎样建立个人FTP】
Serv-U FTP Server 5.0.0.11 final 特别破解版汉化版
点击下载
《FTP Serv-U 教程》+《FTP的建立和维护手册》
点击下载
在网上做过软件下载的人都知道,建立一个FTP下载服务器相对比较简单,一般用WIN2000下自带的IIS就可以,但IIS在功能上好多都不尽人如意,下面我就介绍一款功能非常强大,但使用简单的FTP服务器构建软件-Serv-U FTP Server,让我们也来体验一下自己DIY FTP服务器的快乐! 在说明使用之前,让我先大致介绍一下Serv-U(本文中提到Serv-U版本为3.0.0.17), Serv-U 是一个可以运行于Windows 95/98/2000/ME 和 Windows NT 4.0下的FTP服务器程序如图所示,
有了它,你的个人电脑就可以模拟为一个FTP服务器,也就是说,你所连接的网络中的计算机用户可以访问你的个人电脑,通过FTP协议(文件传输协议)复制、移动、删除你的电脑中的文件或文件夹,可以做一切权限所允许的事情。FTP协议规定了计算机之间的标准通讯方式,使所有不同类型,不同操作系统,不同格式的电脑之间得以互换文件。它可以用最简单的方式创建用户帐号,并且在硬盘空间上划分一定的区域用以存放文件,让用户以各种FTP客户端软件(如CuteFTP、WS_FTP等)上传或下载所需要的文件。
有许多FTP服务器和客户端软件可用于不同的系统中,Serv-U是用于运行MS-Windows 并且已安装了WinSock 版本 1.1 兼容 TCP/IP协议的个人电脑中的,这几乎包括了所有的Windows操作系统。
Serv-U由两大部分组成,引擎和用户界面。Serv-U引擎(ServUDaemon.exe)其实是一个常驻后台的程序,也是Serv-U整个软件的心脏部分,它负责处理来自各种FTP客户端软件的FTP命令,也是负责执行各种文件传送的软件。在运行Serv-U引擎也就ServUDaemon.exe
文件后,我们看不到任何的用户界面,它只是在后台运行,通常我们无法影响它,但在ServUAdmin.exe中我们可以停止和开始它。Serv-U引擎可以在任何Windows平台下作为一个本地系统服务来运行,系统服务随操作系统的启动而开始运行,而后我们就可以运行用户界面程序了。在Win NT/2000系统中,Serv-U会自动安装为一个系统服务,但在Win 9x/Me中,你需要在“服务器”面板中选择“自动开始”,才能让它转为系统服务。Serv-U用户界面(ServUAdmin.exe)也就是Serv-U管理员,它负责与Serv-U引擎之间的交互。它可以让用户配置 Serv-U,包括创建域、定义用户、并告诉服务器是否可以访问。启动Serv-U管理员最简单的办法就是直接点接系统栏的“U”形图标,当然,你也可以从开始菜单中运行它。
在此有必要把Serv-U中的一些重要的概念给大家讲清楚:每个正在运行的Serv-U引擎可以被用来运行多个“虚拟”的FTP服务器,在管理员程序中,每个“虚拟”的FTP服务器都称为“域”,因此,对于服务器来说,不得不建立多个域时是非常有用的。每个域都有各自
的“用户”、“组”和设置。一般说来,“设置向导”会在你第一次运行应用程序时设置好一个最初的域和用户帐号。服务器、域和用户之间的关系大家可以参考下表:
*Serv-U 服务器
*域 1
*用户帐号 1
*用户帐号 2
*用户帐号 3
*域 2
*用户帐号 1
*用户帐号 2
*域 3
*用户帐号 1
*用户帐号 1
这个表有点类似与Serv-U管理员中服务器、域和用户的排列。
Serv-U FTP Server 是试用软件,安装后三十天内,你可以作为“专业版本”使它,但试用期过后,你就只能作为免费的“个人版
本”使用了,只有基本功能了。
好了,说了这么多,还没到关键部分-如何自己来建立FTP服务器。下面我就一步一步来说明。
一、 安装原版软件和汉化补丁,这个过程就不多说了,想必没人不会的。
二、 建立第一个本地FTP服务器
安装完成后程序会自动运行,你也可以在菜单中选择运行。
1、 第一次运行程序,它会弹出设置向导窗口如图,
将会带你完成最初的设置,
2、 单击“下一步”,出现“显示菜单图像”的窗口,问你是否在菜单中显示小图像,看各人喜欢了;
3、 单击“下一步”,这个窗口是让你在本地第一次运行FTP服务器,只要“下一步”就行了。
4、 接下来要你输入你的IP地址如图,
如果你自己有服务器,有固定的IP,那就请输入IP地址,如果你只是在自己电脑上建立FTP,而且又是拨号用户,有的只是动态IP,没有固定IP,那这一步就省了,什么也不要填,Serv-U 会自动确定你的IP地址,“下一步”;
5、 在这儿要你输入你的域名,如图
如果你有的话,如:ftp.abc.com,没有的话,就随便填一个;
6、 “下一步”,询问你是否允许匿名访问如图
一般说来,匿名访问是以Anonymous为用户名称登录的,无需密码,当然如果你想成立一个会员区什么的,就应该选择“否”,不让随便什么人都可以登录,只有许可用户才行,在此我们填“是”;
7、 “下一步”,问你匿名用户登录到你的电脑时的目录,如图,
你可以自己指定一个硬盘上已存在的目录,如F:\temp\xyz;
8、 “下一步”,询问你是否要锁定该目录,锁定后,匿名登录的用户将只能认为你所指定的目录(F:\temp\xyz)是根目录,也就是说他只能访问这个目录下的文件和文件夹,这个目录之外就不能访问,对于匿名用户一般填“是”;
9、 “下一步”,询问你是否创建命名的帐号,也就是说可以指定用户以特定的帐号访问你的FTP,这对于办会员区可很有用哦,你可以对于每个人都创建一个帐号,每个帐号的权限不同,就可以不同程序地限制每个人的权利,方法将在后面讲到,这里选择“是”;
10、 “下一步”,请你填入所要建立的帐号的名称,如图,如:ldr,
11、 “下一步”,请输入密码,如:123,
12、 “下一步”,询问登录目录是什么,这一步与第7步一样,如:F:\temp
13、 “下一步”,询问你是否要锁定该目录,同第8步,这里选择“否”;
14、 接下来询问你这次创建的用户的管理员权限,如图,
有几项选择:无权限,组管理员,域管理员,只读管理员和系统管理员,每项的权限各不相同;这里选择“系统管理员”;
15、 最后一步,点击“完成”就OK了,你有什么需要修改的,可以点“上一步”,或者进入Serv-U管理员直接修改。至此,我们建立
了一个域ftp.abc.com,两个用户,一个Anonymous,一个ldr。
三、 既然我们已经建立好FTP服务器,那么我们就应该可以用FTP客户端软件来尝试登录。
怎么办呢?其实很简单,我们不用上网,就可以测试。我们知道,不上网时,本地机的IP地址默认就为127.0.0.1,FTP端口号为21。打开FTP客户端软件,我就用FlashFXP来说明,打开快速连接,填入相应内容,如图
然后连接,如图
可以看到,我左边窗格以Anonymous登录,右边窗格以ldr登录,由于是本地机,所以速度奇快,上网后,假如我要让你登录到我的电脑上,我只要把我的上网时的IP地址给你,你就可以匿名访问我的电脑了(注意不要开防火墙),是不是很方便?
四、Serv-U管理员中的各项设置
在设置完成后,将会进入Serv-U管理员的主界面,如图
左边窗格中显示各个栏目,右边窗格中显示各个栏目的具体选项,下面就大概讲一讲设置内容。
1、 在图中,我们可以人为地控制Serv-U引擎的运行或停止,记住,在Win 9x/Me 中,我们就要在此选择“系统服务”,才会运行
Serv-U引擎。
2、 “许可”,如果你花美元买了注册号,就可以在此输入。
3、 “设置”,这个设置是对于“本地服务器”来说的。“常规”设置中,如图
可以限制服务器的最大速度,可以拦截FXP(站点到站点传送),也可以限制用户的数量,这样不至于你的服务器被拖跨。“目录缓存”设置中,如图
允许你自己确定目录列表的个数以及超时时间,在Windows 95 和 NT下,目录列表默认设置为25,当缓存满了之后,新的请求将替换老的请求。“高级”设置中,如图
可以让你自己定义服务器、Socket、文件的上传和下载的各项设置。
4、 “活动”,在这里记录了用户的活动日志,已封锁的IP的活动日志,以及任务日志;任务日志中显示的就是你开始停止的各项操作记录,你可以点击右击,选择一此过滤文本,使其只显示你所想见的内容,如图
5、 “域”,这里包含了你一开始根据向导所建立的用户、设置、域等。“域--设置”中所设置的内容其实与第3步差不多,只是它更
加具体,可以对于每一个不同域定制。“域--活动”中记载了这个域下所有用户的活动情况。
6、 “域--组”,我们可以自己建立一些便于管理的组,然后把一类的用户归到一个组中。
7、 “域--用户”中,大家可以看到一开始我们建立的两个帐号,一个Anonymous,一个ldr。现在就帐号ldr来对其中的细节设置说明一下。
A、“帐号”栏,如图
对于一些不守规则的人,我们可以选择“禁用帐号”,虽然有帐号,但可以使用户一时间无法登录;你也可以设置让程序到达某个日期后自动删除某个帐号;下面几栏是这个帐号的基本信息,我们都可以在此更改,其中密码改过后并不显示,而是统一显示<>,特别要注意选项“锁定用户于主目录”,什么意思呢?大家应该碰到,每次我们登录到FTP服务器上后,在根目录下只显示“/”,选择这项选项后,就是这样,如果不选,会出现什么情况呢?你可以做一下试验,在根目录下将显示“/f:/temp/”,也就是说显示了你硬盘中的绝对
地址,这在某些情况下是很危险的,有不怀好意的高手,你就麻烦了!
你可以隐藏属性为隐藏的文件,可以限制同一IP的登录个数,是否允许用户更改密码(这需要客户端软件的支持),最大上传下载的速
度,超时时间以及空闲时间,你也可以限制最大用户数量,如20,说明同时只能有20个用户登录。
C、“目录访问”栏,如图
在此你可以控制用户对于文件目录的权限,对文件有读取、写入、删除、追加、执行等操作,对于文件夹有列表、创建、删除,以及是否继承子目录;如果觉得目录不够,你也可以添加可访问的目录。
D、“IP访问”栏,如图
在这里你可以规定某个IP是否可以访问你的FTP服务器,你可以拒绝它的访问,只要填上相应的IP地址,以后由这个IP的访问通通被拦下。
E、“上传/下载率”栏,如图
在这里你可以设置上传和下载之间的比值,控制好上传和下载之间的数据流量关系。
F、“配额”栏,如图
这里你可以为每个FTP用户设置磁盘空间,点击“计算当前”,可以知道当前目前下的所有空间大小,在“最大”一栏中填入你想要限制的容量。
最后有一点,改过设置后一定要点击右键,选择“应用”使设置生效才行,否则一切都白做了!!
希望大家学会后,能为更多的人提供下载,享受宽带带来的快乐!
==========================================================================================================
SERV-U FTP的欢迎词设置
让你的SERV-U FTP看起来更专业一点
现在很多的朋友都用SERV-U做个人FTP的服务器,有关如何使用SERV-U架设服务器的文章很多了,这儿我就不多说了。不过大家不知道注意到了没有,当你登陆很多FTP的时候,会显示一些欢迎信息,比如说显示你的IP,告诉你目前有多少人在使用FTP,带宽是多少等等。。。看起来就比较的专业样子。其实你自己也是可以做的,SERV-U这个软件本身就有这个功能。下面我就说明以下如何在自己的FTP里面加上这些信息。
第一、先建立一个文本文件,随便取一个名字。我们这儿就取message.txt吧。
第二、这个这个文本文件里面加上这些文字
-----------------------------------
欢迎来到XXX的个人FTP服务器
你的IP地址是:%IP
目前服务器所在的时间是 %time
已经有 %u24h 个用户在最近24小时访问过本FTP
本FTP服务器已经运行了 %ServerDays 天,%ServerHours 小时 和 %ServerMins 分。
服务器的运行情况:
所有登陆用户数量: %loggedInAll total
当前登陆用户数量: %Unow
已经下载字节数: %ServerKbDown Kb
已经上传字节数: %ServerKbUp Kb
已经下载文件数: %ServerFilesDown
已经上传文件数: %ServerFilesUp
服务器平均带宽: %ServerAvg Kb/sec
服务器当前带宽: %ServerKBps Kb/sec
------------------------------------
其中XXX可以改成你的名字
你也可以加上一些你自己认为喜欢的文字,不过要注意的是每行最好不要超过80个字符
其中以%开头的都是一些变量,下面是SERV-U能支持的变量
时间和日期
%Time - 显示你的计算机当前时间
%Date - 显示你的计算机当前日期
服务器的统计信息
%ServerDays - 显示服务器已经运行的天数
%ServerHours - 显示服务器已经运行的小时数
%ServerMins - 显示服务器已经运行的分钟数
%ServerSecs - 显示服务器已经运行的秒数
%ServerKbUp - 显示自从服务器运行以来已经上传的字节数
%ServerKbDown - 显示自从服务器运行以来已经下载的字节数
%ServerFilesUp - 显示自从服务器运行以来已经上传的文件数
%ServerFilesDown - 显示自从服务器运行以来已经下载的文件数
%LoggedInAll - 显示自从服务器运行以来已经登陆的用户数
%ServerAvg - 显示服务器的平均带宽
%ServerKBps - 显示服务器的当前带宽
服务器的设定信息
%MaxUsers - 显示服务器能同时登陆的最大用户数量
%MaxAnonymous - 显示服务器能同时登陆的最大匿名用户数量
用户信息
%Name - 显示登陆的用户名
%IP - 显示登陆的用户IP地址
%Dir - 显示登陆的用户的当前目录
%Disk - 显示登陆的用户的当前磁盘
%DFree - 显示登陆的用户的当前磁盘空间,单位是MB
%FUp - 显示登陆的用户上传的文件数量
%FDown - 显示登陆的用户下载的文件数量
%FTot - 显示登陆的用户上传和下载的总的文件数量
%BUp - 显示登陆的用户上传的字节数,单位是KB
%Bdown - 显示登陆的用户下载的字节数,单位是KB
%BTot - 显示登陆的用户上传和下载的总字节数,单位是KB
%TconM - 显示登陆用户连接时间,单位是分钟
%TconS - 显示登陆用户连接时间,单位是秒,要和%TconM一起使用
%RatioUp - 显示登陆用户的上传流量限制
%RatioDown - 显示登陆用户的下载流量限制
%RatioCredit - 显示登陆用户还有多少credit可以上传和下载,这个是针对有些FTP是要上传多少文件,才能下载多少文件而设置的
%QuotaUsed - 显示登陆用户的已经使用了多少空间,单位是KB
%QuotaLeft - 显示登陆用户的还有多少空间可以使用,单位是KB
%QuotaMax - 显示登陆用户的的最大空间,单位是KB
后面3个是针对有磁盘限制的用户设置的
用户数量
%UNow - 显示当前有多少用户连接
%UAll - 显示从服务器运行以来一共有多少用户连接过
%U24h - 显示最近24小时有多少用户
%UAnonAll - 显示当前总的匿名用户数量
%UAnonThisIP - 显示所有匿名登陆的用户数
%UNonAnonAll - 显示所有当前非匿名登陆用户数
%UNonAnonThisIP - 显示所有非匿名登陆用户数
%UThisName - 显示所有使用这个名字登陆的用户数
自己在先建立一个.txt文件,输入你想要显示的文字,具体参数看上面的内容,然后在Serv_u内的server设置里面,加入这个.txt文件就可以了
==========================================================================================================
——常见FTP登陆Log信息——
常见FTP登陆Log信息
1.
Connected. Waiting for response.
220 Serv-U FTP Server v4.0 for WinSock ready...
USER anonymous
530 Sorry, no ANONYMOUS access allowed.
QUIT
这个就是不许匿名登录啦
2.
Connected. Waiting for response.
220 Serv-U FTP Server v4.0 for WinSock ready...
USER test
331 User name okay, need password.
PASS xxxxxx
530 Not logged in.
QUIT
一般是密码输入错误时出现的信息,但对于Serv-U来说,如果没有这个帐号(test)存在,也会产生同样的出错信息。
3.
Connecting to xxx.xxx.xxx.xxx, Port 21 (#1)
ERROR: Connection timed out
这个表明对方未开机,也可能是对方不在你能访问的范围内
4.
Connecting to xxx.xxx.xxx.xxx Port 21 (#1)
ERROR: Connection refused
这个一般表明对方已开机,但未开启FTP服务(没有开Serv-U)
也可能为对方不提供在这个端口上的服务
5.
Connecting to xxx.xxx.xxx.xxx, Port 21 (#1)
Connected. Waiting for response.
Disconnected from server.
Connection attempt failed. Waiting for retry...
出现这个信息实在是很倒霉,你极有可能被对方Ban了。
如果只是Ban几分钟or几小时or一天还好,不然只有和站长说说好话,让他给你解封吧。
6.
Connecting to xxx.xxx.xxx.xxx, Port 21 (#1)
Connected. Waiting for response.
USER XXX
331 User name okay, need password
PASS xxxxxx
530 Not logged in, unauthorized IP address.
QUIT
这个有点麻烦,你的IP不在站长允许访问的IP范围内,只有和站长联系,让他把你的IP网段加入Allow Access列表里吧
7.
Connected. Waiting for response.
220 Serv-U FTP Server v4.0 for WinSock ready...
USER user
421 Too many users - please try again later.
哈哈,这个很常见吧,用户太多
8.
Connected. Waiting for response.
220 Serv-U FTP Server v4.0 for WinSock ready...
USER test
530 Not logged in, only one session from same IP allowed at a time.
QUIT
每个IP只能开一个下载,就不要用多线程啦,小心Ban了你。
----------------------------------------------------------------------------------------------
内网、局域网如何设置IP,建立FTP
首先,我们知道动态IP机器出去的最大问题是IP,因为动态IP机器的IP外网是无法识别的,我们讨论的是最普通的局域网内工作站出去做FTP和WEB站点的问题!
动态域名解析正好能够解决此类问题,它的原理是将本机的动态IP自动映射到预先申请好的虚拟域名上,这样外面就可以通过访问固定的虚拟域名来访问到动态IP机器了。
<花生壳>该软件使用方便,几乎不用动什么脑筋,唯一要做的事情就是去注册,然后申请一个以vicp.net为后缀虚拟域名。
1.进入http://www.oray.net/,下载<花生壳>,并“注册网域护照”!
2.注册完成后,登陆“我的控制台”
3.进入“我的控制台”,点击左下角的‘我要.激活花生壳服务’
4.点击“开始”进入
在‘免费域名’填入不重复的你想要得名字就是你将来的域名,例如:AGHU
5.以后就是“服务条款”和“填写站点信息”,这些地球人都知道怎么填!
填完结束,恭喜你,你的域名已经有了!例如:你以后的域名就是AGHU.VICP.NET
申请完免费域名以后,就安装你已经下载的<花生壳>,然后打开运行
输入你的注册名和密码,等一下就会激活你的域名,兴奋吧!
然后你的ftp和web就可以启动咯!
架设ftp服务器的事情,另外有帖子详细介绍了!!
======================================
局域网内公开的ip只有一个,除非你是在主机上建私服,否则你无法公开你的私服,只能在局域网内,解决的办法如下。
由于公网ip地址有限,不少isp都采用多个内网用户通过代理和网关路由共用一个公网ip上internet的方法,这样就限制了这些用户在自己计算机上架设个人网站。要实现对我们来说是比较困难的,首先得得到系统管理员的支持才能够实现。因为这一切的设置必须在代理服务器上做的。要实现这一点,可以用windows 2000 服务者 的端口映射功能,除此之外winroute pro也具
揪错 ┆
‘肆’ 如何获得FTP服务器ZONE,我用CUTEFTP写程序时,下载文件和FTP服务器文件时间点相差8小时。
这很正常!不过和服务器时间没有关系!假如说你服务器有一个文件最后修改时间是2010年1月1日,等你下载到本地,最后修改时间就会变成今天的日期!
如果实在想知道服务器用的time zone,你完全可以直接问技术支持或自己写一个脚本去获取!
FTP客户端显示的最后修改时间是假象,也就是根据你本地的时间已经做了时间的相对变动,其实文件在服务器上显示的最后修改时间还是根据服务器的time zone显示的!
‘伍’ ftp上传的文件日期和时间问题
ftp上传的文件日期和时间是服务器端时间和日期,如果ftp上传时间和日期和本地不一样,可以修改ftp服务器端时间和事情就可以了。
修改时间日期方法:
1、双击计算机时间,打开日期和时间修改页面。
‘陆’ 怎么获取FTP服务器上文件的时间信息(要到分钟)
对不起,这位先生或女士,虽然我很想帮你解决,但我学了这么久的计算机,可能没有你这样的要求。
很难从FTP服务器上获取文件的时间信息,你只能用 VC 或 JS 等编辑语言达到用 FTP传送的时候使的文件的时间与当前的服务器时间吻合,而您要求的分钟实在很难计算!
‘柒’ FTP使用详解
1.什么是FTP(文件传输协议)
FILE TRANSFERPROTOCOL(FTP)意为文件传输协议,用于管理计算机之间的文件传送。FTP通常指文件传输服务。
FTP是Internet上使用非常广泛的一种通讯协议。它是由支持Internet文件传输的各种规则所组成的集合,这些规则使 Internet用户可以把文件从一个主机拷贝到另一个主机上,因而为用户提供了极大的方便和收益。FTP通常也表示用户执行这个协议所使用的应用程序(例如:凯屋“上当“),从而获取所需的信息资料。
FTP和其它 Internet服务一样,也是采用客户机/服务器方式。使用方法很简单,启动FTP客户端程序先与远程主机建立连接,然后向远程主机发出传输命令,远程主机在收到命令后就给予响应,并执行正确的命令。FTP有一个根本的限制,那就是,如果用户未被某一FTP主机授权,就不能访问该主机,实际上是用户不能远程登录(Remote Login)进入该主机。也就是说,如果用户在某个主机上没有注册获得授权,没有用户名和口令,就不能与该主机进行文件的传输。而AnonymousFTP(匿名FTP)则取消了这种限制。
2.什么是Anonymous FTP(匿名文件传输)
Anonymous(匿名文件传输)能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“Anonymous”和“guest”就可有限制地访问远程主机上公开的文件。现在许多系统要求用户将Emai1地址作为口令,以便更好地对访问进行跟综。出于安全的目的,大部分匿名FTP主机一般只允许远程用户下载(download)文件,而不允许上传 (upload)文件。也就是说,用户只能从匿名FTP主机拷贝需要的文件而不能把文件拷贝到匿名FTP主机。另外,匿名FTP主机还采用了其他一些保护措施以保护自己的文件不至于被用户修改和删除,并防止计算机病毒的侵入。在具有图形用户界面的WorldWide Web环境于1995年开始普及以前,匿名FTP一直是Internet上获取信息资源的最主要方式,在Internet成千上万的匿名PTP主机中存储着无以计数的文件,这些文件包含了各种各样的信息,数据和软件。人们只要知道特定信息资源的主机地址,就可以用匿名FTP登但是匿名FTP仍是 Internet上传输分发软件的一种基本方法。
3.什么是Remote Login(远程登录)
Remote Login(远程登录)指用户通过Internet登录到远程主机上。在这种连接建立之后,用户所在的计算就可以作为远程主机的终端一样使用。 Internet上远程登录的主要方式是Telnet,匿名FTP也需要首先经过远程登录才能进行文件传输。
4.什么是Upload(上传)
Upload(上传)指把数据从本地计算机传到远程主机上,因此受到严格的管理和控制,但Upload是提交用户信息和要求以实现远程交互应用的基础。
5.何为FTP连接
进行FTP连接首先要给出目的FTP服务器的名称或地址,当连接到FTP服务器后,一般要进行登录,在检验用户ID号和口令后,连接才得以建立,某些系统也允许用户进行匿名登录。与在所有的多用户系统中一样,对于同一目录或文件,不同的用户拥有不同的权限,所以在使用过程中,如果发现不能下载或上载某些文件时,一般是因为用户权限不够。
6.FTP文件传输方式
FTP可用多种格式传输文件,通常由系统决定,大多数系统(包括UNIX系统)只有两种模式:文本模式(ASCII)和二进制模式(BIN/IMAGE)。
文本传输器使用ASCII字符,并由回车键和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。应注意在用FIP传输文件前,必须确保使用正确的传输模式,按文本模式传二进制文件必将导致错误。
7.FTP的可靠性问题
FTP建立在传输层TCP协议之上,TCP是面向连接的协议,负责保证数据从源计算机到目的计算机的传输。TCP采用校验、确认接收和超时重传等一系列措施提供可靠的传输,所以在传输过程中FTP程序如果没有提示错误,就无需担心传输问题。