洪水WebSocket

boj*_*jek 2 javascript flooding websocket

我是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;
        }      
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致浏览器仅挂起并在以后崩溃.感谢帮助.

jfr*_*d00 8

为了比客户端读取数据更快地发送数据,这将是最终会发生的事情.

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

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


至于你试过的客户端代码,你不能在Javascript中忙碌/等待很长时间.这会杀死事件循环并最终导致脚本引擎崩溃.

您模拟此操作的唯一方法是尝试实际发送比客户端可以处理的更多数据包.您可以编写一个"慢"客户端,在短忙/等待循环中处理每个数据包可能需要250毫秒,而发送大量数据包的"快速"服务器应该能够模拟它.