1. 关于FTP服务器速度的问题
2MBps,如果学校网络速度理想的话,FTP服务器的网络理论下行速率是256KB/s,但是一般情况下也就220-240KB/s,按照这个速度计算,在网络正常的情况下:
300MB电影*1024=307200KB
307200/230(取平均数)=1335.7秒
1335.7/60=22.3分钟
所以,按照平均每秒钟230KB的速度,需要花费22.3分钟
当然这还不包括网络出现不稳定的情况。
____________________________
纠正一下楼下的错误
提问者说的是从学校传到家里,所以家里(2Mbps
ADSL)应该是看下行速率,学校看上行速率。
2. 远程视频监控对带宽的要求
远程视频监控通常指的是客户端安全监视和远程监控领域内用于特定应用的IP监视系统,该系统使用户能够通过IP网络实现视频监控及视频图像的录像、以及相关的报警管理。
首先要了解视频存储空间大小与传输带宽的之间的计算关系:
1.上行带宽就是本地上传信息到网络上的带宽。上行速率是指用户电脑向网络发送信息时的数据传输速率,比如用FTP上传文件到网上往,影响上传速度的就是“上行速率”。
2.下行带宽就是从网络上下载信息的带宽。下行速率是指用户电脑从网络下载信息时的数据传输速率,比如从FTP服务器上文件下载到用户电脑,影响下传速度的就是“下行速率”。
传输带宽计算: 比特率大小×网络监控摄像机的路数=网络带宽至少大小;
地方监控点:
CIF视频格式每路监控摄像头的比特率为512Kbps,即每路监控摄像头所需的数据传输带宽为512Kbps,10路网络监控摄像机所需的数据传输带宽为:512Kbps(视频格式的比特率)×10(摄像机的路数)≈5120Kbps=5Mbps(上行带宽)
D1视频格式每路监控摄像头的比特率为1.5Mbps,即每路无线摄像头所需的数据传输带宽为1.5Mbps,10路摄像机所需的数据传输带宽为:1.5Mbps(视频格式的比特率)×10(网络监控摄像机的路数)=15Mbps(上行带宽)
即:采用D1视频格式各地方监控所需的网络上行带宽至少为15Mbps,720P(100万像素)的视频格式每路无线摄像头的比特率为2Mbps,即每路无线摄像头所需的数据传输带宽为2Mbps,10路网络监控摄像机所需的数据传输带宽为:
1080P(200万像素)的视频格式每路监控摄像头的比特率为4Mbps,即每路无线摄像头所需的数据传输带宽为4Mbps,10路摄像机所需的数据传输带宽为:4Mbps(视频格式的比特率)×10(摄像机的路数)=40Mbps(上行带宽)
即:采用1080P的视频格式各地方监控所需的网络上行带宽至少为40Mbps;
CIF视频格式的所需带宽:
512Kbps(视频格式的比特率)×10(监控点的摄像机的总路数之和)=Kbps=5Mbps(下行带宽)
即:采用CIF视频格式监控中心所需的网络下行带宽至少5Mbps D1视频格式的所需带宽:
1.5Mbps(视频格式的比特率)×10(监控点的网络摄像机的总路数之和)=15Mbps(下行带宽)5
即:采用D1视频格式监控中心所需的网络下行带宽至少15Mbps
720P(100万像素)的视频格式的所需带宽:
2Mbps(视频格式的比特率)×10(监控点的网络摄像机的总路数之和)=20Mbps(下行带宽),
即:采用720P的视频格式监控中心所需的网络下行带宽至少20Mbps
3. 怎么使用FTP测试网速
下个FTP软件 flash fxp 然后连到ftp上去 有两个窗口 一个是ftp 一个是你本地的文件夹 互相拖文件 从ftp到本地是下载 从本地到ftp是上传 软件摸索一下就会用了
4. 关于如何实现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) { 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
5. 我的电脑从ftp上下载东西为什么很慢
FTP下载速度慢的原因比较多,但一般来说,就以下几点:
首当其冲的就是服务器的所谓的质量问题,即服务器的配置,配置好的空间自然就速度快,然后是所在的地理位置,带宽的地域自然速度也快,在这之后还有对服务器的维护程度,是否有病毒侵占,有时病毒会慢慢拉垮资源,越来越慢,最后致使系统崩溃。
接着就是上传文件所在地,即客户端的电脑速度快慢,还是所在局域网的速度,这些自然是重要因素,服务器速度再快,本地的速度慢,怎么也不会快起来。
然后是由于某个文件卡住了,或是FTP占用了服务器好久的资源,有时也会特慢,解决这种情况的办法就是将FTP关掉,重新打开一个,继续上传,但要记得是采用续传,不能采用覆盖,否则先前上传的成果与功劳都没了。
最后还有一种情况,尽管反复重启FTP,但就是不行,速度还是很慢,在这种情况下,当然也有可能是服务器出了问题或是被病毒侵占了,或是内存在这个特定时候消耗得厉害,解决这种情况,可以将路由重启一下,换成另外一个IP,然后再将FTP关掉重新打开。
6. 我们公司自己搭建了一个FTP服务器!当远程客户访问下载的时候,他的下载速度和我们的上传速率有关吗
当然有关系。虽然是固定IP但是不知公司是什么方式接入的,如果是ADSL接入按照原理和实际情况是达不到这个上传速度的。光纤的话就没问题,只有实际损耗一点,
单个客户最大下载速度也取决于他的带宽,如果他是6M或以上带宽,就能达到理论的你的上传速度。当然实际使用要出去损耗。
7. 如何让加快ftp上下载的速度
比如增加带宽或提高电脑配置方法我就不提了,比较容易做的:
1、提高你的网卡等级是可以的,比如以前老的是100M的,你可以换成现在主流的1000M的。
2、可以使用比较主流的ftp软件,比如flash ftp,cute ftp都是相当不错的主流软件,能成倍提你的上传下载的速度。
3、限制同时登陆ftp的人数,从一定程度上也可以加快上传下载的速度。
只能想到这些,希望对你有帮助。
8. 如何用FTP上传文件并记录上传或下载的速率
自己做