2

我是 websocket 的新手,我在 web 应用程序上实现了 websocket,服务器端是用 java 编写的,客户端是 javascript。服务器通过 websocket 向客户端发送通知。我想知道如果客户端的速度不足以像服务器发送它们一样快地处理传入的消息会发生什么。例如,服务器可能每秒发送大约 200 条短信,客户端很慢并且每秒处理 100 条消息。我相信浏览器会在处理传入消息之前对其进行排队,但不确定。我还知道如何检查此缓冲区大小及其限制,以及如果达到缓冲区限制会发生什么。关于如何模拟这种情况的任何想法,我都尝试过:

webSocket.onmessage = function (message) {
    var bool = true;
    var datenexexec = Date.now() + 1000;
    while(bool) {
        if(Date.now() > datenexexec){
            bool = false;
        }      
    }
}

但这会导致浏览器仅挂起并随后崩溃。感谢帮助。

4

1 回答 1

12

对于发送数据的速度超过客户端可以读取的速度,这就是最终会发生的情况。

  1. 客户端接收缓冲区将填满
  2. TCP 流控制将启动,服务器将被告知停止在此套接字上发送更多数据包。
  3. 然后服务器将缓冲传出的数据包,直到流量控制限制被移除
  4. 最终将达到服务器端缓冲区限制,并且底层 TCP 将拒绝套接字写入
  5. 这将从 TCP 发送返回错误。
  6. 根据您为 webSocket 使用的服务器端库,您应该在某些时候从发送操作中收到错误。

TCP 是一种可靠的协议,因此它只会缓冲并稍后传输,直到缓冲区已满。它本身不应该丢失数据包(除非连接断开),但是当缓冲区已满时,它会给您一个错误,因为缓冲区已满,它无法再发送。


至于您尝试的客户端代码,您不能在 Javascript 中忙/等待很长时间。这会杀死事件循环并最终关闭脚本引擎。

您模拟这一点的唯一方法是尝试实际发送比客户端可以处理的更多的数据包。您可以编写一个“慢速”客户端,它可能需要 250 毫秒来处理一个短暂的繁忙/等待循环中的每个数据包,以及一个发送大量数据包的“快速”服务器,您应该能够模拟它。

于 2015-02-25T16:34:42.467 回答