65.9K
CodeProject 正在变化。 阅读更多。
Home

带宽限制

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (55投票s)

2007年4月2日

CPOL

2分钟阅读

viewsIcon

288940

downloadIcon

8215

使用带宽限制来节省带宽并获得服务质量 (QoS)。

Screenshot - screen.jpg

引言

托管网站可能很有趣。 但是,当您提供大型下载或流媒体时,您不希望访问者占用全部带宽。 或者,也许您想提供一个高级帐户,用户可以无限制地下载,以及一个免费帐户,用户下载速度不能超过 50 kb/s。 这就是带宽限制的用武之地。

带宽限制通过限制网络拥塞和服务器崩溃来帮助提供服务质量 (QoS)。 例如,您可以确保连接每秒获得的字节数不超过 X。

本文的目的是展示如何使用带宽限制,并提供一个小助手类。

使用代码

在源代码中,您会找到一个名为 ThrottledStream 的类。 此类派生自 System.IO 命名空间中的抽象 Stream。 在构造函数中,它接受要限制的基本流。 下面是一小段代码,展示了如何实例化 ThrottledStream

Stream throttledStream = new ThrottledStream(Response.OutputStream, 1024);

现在,您对 throttledStream 所做的一切都将限制为每秒 1024 字节,并将发送到或读取自 OutputStream,它是 ASP.NET 页面中 Response 属性的成员。

由于 ThrottledStream 派生自抽象 Stream 类,因此很容易将限制添加到现有应用程序或网站。 例如,当您有一个通过 Stream 发送文件内容的过程,并且您想要启用带宽限制时,您只需更改目标流的初始化即可。

旧代码可能如下所示

Stream sourceStream;
Stream destinationStream;

try
{
    sourceStream = new FileStream(@"c:\myfile.bin", 
                       FileMode.Open, FileAccess.Read, FileShare.Read);
    destinationStream = new NetworkStream(mySocket, false);

    byte[] buffer = new byte[1024];
    int readCount = sourceStream.Read(buffer, 0, BufferSize);

    while (readCount > 0)
    {
        destinationStream.Write(buffer, 0, readCount);
        readCount = sourceStream.Read(buffer, 0, BufferSize);
    }
}
finally
{
    if (destinationStream != null)
    {
        destinationStream.Close();
    }
 
    if (sourceStream != null)
    {
        sourceStream.Close();
    }
}

现在,我们可以轻松地将限制支持添加到此过程。 我们只需要更改初始化

...

Stream originalDestinationStream = new NetworkStream(mySocket, false);
destinationStream = new ThrottledStream(originalDestinationStream, 51200);

...

只需添加一行代码,此完整过程就会限制为 50 kb/s (51200 b/s)。 现在,我们更进一步,添加基于成员资格的限制

...

long bps;

switch( user.Membership )
{
    case MembershipLevel.Bronze:
        bps = 51200;
        break;

    case MembershipLevel.Silver:
        bps = 102400;
        break;

    case MembershipLevel.Gold:
        bps = 153600;
        break;

    case MembershipLevel.Platina:
        bps = ThrottledStream.Infinite;
        break;
}

Stream originalDestinationStream = new NetworkStream(mySocket, false);
destinationStream = new ThrottledStream(originalDestinationStream, bps);

...

在这里,我们遇到这样一种情况:青铜会员资格可让您获得 50 kb/s,白银会员资格可让您获得 100 kb/s,黄金会员资格可让您获得 150 kb/s,铂金会员资格是无限的 - 没有限制。

关注点

带宽限制可以提高服务器的服务质量,并允许您控制指定连接的带宽。 名为 ThrottledStream 的辅助类非常易于使用,并且可以在现有场景中使用。

© . All rights reserved.