【问题标题】:queue and flow control with delphi using indy使用 indy 使用 delphi 进行队列和流控制
【发布时间】:2015-11-18 05:16:30
【问题描述】:

我有一个使用 indy delphi 设计的客户端服务器应用程序 (TCP)。 我想在我的服务器端应用程序中有一个队列和流控制。 当服务器流量已满时,我的服务器不应丢失任何客户端数据。 例如,在我的服务器端应用程序中,我想确定服务器的最大带宽为 10Mbps,然后如果服务器带宽(这 10Mbps)已满,其他客户端将排队等待带宽空闲。 所以我想知道如何用delphi设计这个? 谢谢 最好的尊重

【问题讨论】:

    标签: delphi queue indy priority-queue


    【解决方案1】:

    客户端不应将消息直接发送到服务器。将消息放入本地存储(f.i. sqlite-db),然后在线程中读取本地存储的第一条消息并尝试将其发送到服务器。

    如果消息已传递到服务器(未引发异常),则从本地存储中删除该消息并在本地存储中处理下一条“第一条”消息。

    【讨论】:

    • 嗨先生 rufo,感谢您的回复,好吧 1 - 我在客户端的应用程序使用(流)Tmemorystream 或 Tstringstream 和 tcpClient.IOHandler.Write 命令将数据发送到服务器。有没有另一种方式这样的套接字命令或 indy 而不是使用本地存储或数据库? 2 - 我如何确定服务器的最大输入带宽?你在delphi中有你的方法的例子吗?谢谢
    • 如果您不想丢失任何客户端数据,那么您必须将它们存储在某个地方。 本地存储在任何情况下都应该可用,远程存储或连接可能不可用。
    • 不需要关心服务器带宽。客户端可以传递或不传递消息。如果没有,客户端将超时或不可用或任何异常。这样您就会知道,如果消息已送达,是否从本地存储中删除此消息。
    • 另一个选项是msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx,其中包括本地商店和运输。基本思路是一样的:持久化到本地存储,从本地存储发送到服务器。
    【解决方案2】:

    在接收客户端数据的 TIdTCPServer.OnExecute 方法中,可以使用简单的睡眠命令“延迟”对传入请求的处理。客户端数据将保留在 TCP 套接字中,直到睡眠命令完成。

    如果您的服务器跟踪所有客户端的当前“全局”带宽使用情况,则可以动态设置休眠时间。您甚至可以为不同的客户设置不同的优先级。

    因此,您需要一个简单但线程安全的带宽使用监视器、一种计算合理睡眠时间值的算法,以及一种将此睡眠时间分配给各个客户端连接上下文的方法。

    另见:

    【讨论】:

    • 嗨,亲爱的 mjn,感谢您的回复。我的网络在 mpls 网络中有大约 7000 个用户,这 7000 个客户端每天早上一起发送数据......在你的方法中是的,在 Tidtcpserver 中使用延迟之前我应该​​有一个使用前的索引或不使用延迟,否则此延迟会在服务器端花费大量时间计算。所以这个索引可以是(剩余多少带宽),如果带宽已满,然后尝试使用 sleep 命令,看起来不错,但告诉我有没有办法(使用 indy 或其他)来确定服务器的最大带宽和计算发送数据时使用了多少客户端?谢谢
    • 最大带宽取决于硬件(网络适配器等),对于 Delphi 方式,这应该在 SO 上作为不同的问题发布
    猜你喜欢
    • 2021-01-28
    • 2010-12-06
    • 2012-07-12
    • 2012-05-04
    • 2012-02-23
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多