IE9中SSL上的Flash套接字似乎有数据限制



我正在使用socket.io在Internet Explorer 9中通过SSL启动跨域闪存套接字连接。当我启动连接时,在我发送客户端的整个HTML网页之前,一切似乎都很正常。如果我从不发送此HTML,则连接将持续存在,并且连接可以发送少量数据。当我发送整个HTML页面时,socket.io日志显示它正在缩短发送的HTML,然后是info - transport end (undefined)。我把这个错误追溯到

if (i === 0){
if (chr != 'u0000')
this.error('Bad framing. Expected null byte as first frame');
else
continue;
}

在服务器端的default.jssocket.io文件中。客户端似乎出于某种原因正在分解这些数据,这导致了格式错误的数据包。这不可能是TCP错误,因为发送这么多数据可以使用常规的websocket和JSONP。

我完全不知道如何调试它。看起来可能是Flash+SSL错误。如有任何帮助,我们将不胜感激。

TL;DR:尝试使用以下文件更新本地socket.io客户端中的SWF文件和web_socket.jshttps://github.com/NextThought/web-socket-js

长答案:

socket.io的分布式客户端版本中似乎存在一个错误(至少0.9.10):它分发的Flash SWF支持文件版本(最初从上述repo的同一github repo分叉)无法通过SSL发送大于16K-8字节的WebSocket帧(16K是SSL帧大小,8字节是WebSocket头大小),因为SSL实现中的一个错误。这是SSL代码的原始版本中发现的问题(位于http://code.google.com/p/as3crypto/issues/detail?id=14),尽管在撰写本文时,该修复程序尚未在那里或任何一个github转发中合并。

最初的github repo现在已经开始实现最终的WebSocket规范,而与socket.io一起分发的版本使用了一个旧得多的草案规范(这使得诊断这个问题更加困难,因为旧的规范不包括那么多的框架信息)。

开头引用的github repo包含包含最新github更改和SSL错误修复的更新SWF文件。它很容易集成到本地socket.io客户端构建中,对我们来说,它解决了这个问题(在带有Flash Player 11的IE9中进行测试)。只有当你连接的WebSocket服务器支持最终的WebSocketSpec时,它才会工作。在使用socket.io分发的fork的JavaScript部分中有一些socket.io特定的补丁,使其在node.js中运行(我认为);这个repo不包括这些补丁,所以它可能只在web浏览器中工作。

最新更新