套接字,消息速率限制器Java

时间:2017-07-31 21:17:17

标签: java sockets server client

想象一下,我有一台能够以每秒10,000条消息的速度生成消息的服务器。但我的客户端每秒最多只能接收1000条消息。

系统1 如果我的系统在第一个毫秒内发送1000条消息,那么剩余的999毫秒就不会发生任何事情。

系统2 我的系统每毫秒发送1条消息,因此在1000毫秒(1秒)内它将发送1000条消息。

Q1 )鉴于客户端每秒最多可处理500条消息,哪种系统更好?

Q2 )系统1对客户端的影响是什么?它会压倒客户吗?

由于

2 个答案:

答案 0 :(得分:0)

Wil它压倒了客户端:它取决于消息的大小和套接字缓冲区大小。发送方发送的消息被缓冲。如果客户端因为缓冲区已满而无法使用,则发送方正在使用的输出流将阻塞。当客户端使用了一些消息时,发送者可以继续写入,因为他的OutputStream被解除阻塞。

Windows系统上的典型缓冲区大小曾经是8192字节,但是操作系统中的操作系统和设置可能会有所不同。

因此系统1不会压倒客户端,它会在某个时刻阻止。

最佳方法是什么,仅取决于您的应用程序的设计。

例如:我在通过USB写入Arduino时遇到了类似的问题(不是套接字客户端,但其他问题相同)。在我的问题,缓冲消息,因为它是面部跟踪相机的位置问题。当Arduino读取它们时,缓冲的位置不再相关,但它必须处理它们,因为这样的缓冲区是一个队列,如果你读出旧的缓冲区,你只能获得最新的位置。 Arduino永远无法跟上正在生成的消息,因为当新的位置到达Arduino代码时,它已经过时了。所以那是“压倒性的”。

我通过使用双向通信解决了这个问题。 Arduino会向制作人发送一条消息说:READY(接收消息)。然后制作人将发送一个(最新的)面部跟踪位置。然后Arduino重新定位了相机并请求了一条新消息。这样,有一种流控制,阻止了生产者溢出Arduino。

答案 1 :(得分:0)

  1. 两者都不是更好。无论你自己做什么,TCP都会改变实际的流量。
  2. 两者都不会压倒客户。如果客户端没有跟上,它的套接字接收缓冲区将会填满,所以你的套接字发送缓冲区就会被填满,最终你会阻止发送,或者如果你处于非阻塞状态,你将获得EAGAIN / EWOULDBLOCK模式。
相关问题