2017-04-03 86 views
16

Safari 10.1中的WebSocket API似乎具有最大数量的二进制数据,它可以缓冲,然后发送的下一条消息会得到错误“WebSocket连接失败:无法发送WebSocket帧”。如何解决Safari 10.1错误“无法发送WebSocket帧”?

Safari然后关闭与代码1006(CLOSE_ABNORMAL)的连接。

的WebSockets是supposed to report the bufferedAmount - 但Safari浏览器始终报告0后,直到发生错误,连接被关闭。

我试着只是在每条消息之间做一个setTimeout 100ms,而且这似乎适用于小数据块的情况,但是当我发送我的关闭JSON消息时,它看起来很脆,大块仍然会出错,即使有更长的延迟。

您可以see the bug in action here - “Play Sample”按钮在Safari 10.03中运行,但10.1中出现错误。 (Code that handles the WebSocket connection.

有关如何解决此问题的任何想法?或甚至是什么限制?我知道Safari是开源的,但我不确定在哪里寻找。

更新:这里有一个简单的例子:

// this fails in Safari 10.1 but works in 10.03 (and other browsers) 
var ws = new WebSocket('wss://echo.websocket.org'); 

ws.onerror = function(evt) { 
    // Not sure why, but error events seem to have no useful information 
    // The console, however, will have the following error: 
    // WebSocket connection to 'wss://echo.websocket.org/' failed: Failed to send WebSocket frame. 
    console.log("WebSocket error - see console for message"); 
} 
ws.onclose = function(evt) { 
    console.log(`WebSocket closed with code: ${evt.code}, reason: ${evt.reason}`); 
} 

ws.onopen = function() { 
    console.log('sending first binary message'); 
    ws.send(new Uint8Array(23085)); 
    console.log('bufferedAmount is ' + ws.bufferedAmount); 

    // this gets the error 
    console.log('sending second binary message'); 
    ws.send(new Uint8Array(23085)); 
    console.log('bufferedAmount is ' + ws.bufferedAmount); 

    console.log('sending third binary message'); 
    ws.send(new Uint8Array(23085)); 
    console.log('bufferedAmount is ' + ws.bufferedAmount); 

    ws.close(); 
} 

https://jsfiddle.net/yta2mjuf/2/

第二条消息得到一个错误关闭连接,第三个消息后,bufferedAmount是23093.

+4

我在这里提交了一个关于WebKit的bug:https://bugs.webkit.org/show_bug.cgi?id=170463 –

+1

我们遇到了同样的问题。我们的门槛似乎是UInt8Array的缓冲区(23085);更大的东西,我们看到相同的错误。 (我们也看到bufferedAmount总是报告0)。对不起现在不能有更多的帮助 - 不知道这是一个Safari错误还是一些新的安全问题。 – MikeB

+0

同样在我们身边,等待修复... –

回答

0

我想你在Safari 10.1.2上的真实世界链接并没有看到问题。似乎它已被修复。

相关问题