WebSocket.send() 是否复制传递的数组缓冲区,以便以后可以安全地修改它?说:
var a = new Uint8Array([1, 2, 3]);
websocket.send(a);
a[2] = 4;
即使套接字已满并且缓冲区未立即发送,这是否安全?
是的,在WebSocket.send()
之后修改缓冲区是安全的。
WebSocket 规范的工作草案引用了套接字的单独缓冲区,因此数据要么立即发送,要么复制到单独的缓冲区中。
请注意,如果套接字send(data) 方法使用连接传输数据。如果 readyState 属性正在连接,它必须引发INVALID_STATE_ERR 例外。如果数据参数有任何未配对的代理项,则它 必须提高SYNTAX_ERR。如果已建立连接,并且 字符串没有未配对的代理项,则用户代理必须发送数据 使用 Web 套接字。如果数据无法发送,例如因为它 需要缓冲,但缓冲区已满,用户代理必须 关闭 Web 套接字连接。然后,该方法必须返回 true,如果 连接仍已建立(并且数据已排队或发送 成功),或者如果连接已关闭,则为 false(例如,因为 用户代理刚刚出现缓冲区溢出,无法发送数据)。
缓冲区已满,则会触发错误条件并关闭套接字。
此外,从实现的角度来看,这是有道理的。 字节实际通过网络发送的确切时间是套接字实现的一个细节,因此,他们必须将字节复制到自己的缓冲区中,以便在发送数据之前保持对数据的控制(对于这样的设计来说,这是一种安全的编程实践)。 否则,调用代码重新处理缓冲区可能会出现可怕的计时问题。