H5新功能websocket不用说了,现代浏览器都支持,拿起来就可以用。接下来主要分享下socket通信兼容ie:
方案:flash socket;
前段代码:https://github.com/gimite/web-socket-js;
主要用到里面的3个文件:swfobject.js;web_socket.js;WebSocketMain.swf/WebSocketMainInsecure.swf;
这个方案兼容了websocket和flash socket;
如果您的html与*.swf不在同一个域,*.swf文件就要改用WebSocketMainInsecure.swf
假如现在在ie8上运行:那么这个flash socket会做两件事情:
1:请求 策略文件也就是crossdomain.xml。
2:根据请求策略文件的结果决定是否发起socket链接请求。
flash 有3中方法完成第一件事情:(1) 请求 加载******.swf的域的843端口(843是flash默认的),与843端口建立连接,发送字符串"<policy-file-request/>"到843端口,如果返回crossdomain.xml或者是xml的内容字符串,flash会检测你要发起的socket请求的域和端口是否在xml文件允许范围内,如果在。就断开当前与843端口的链接。发起你socket连接地址的请求(example.com:10081)。
(2) 在****.swf内部写入加载策略文件的方法 Security.loadPolicyFile(“xmlsocket://www.xxx.com:1234”),flash就会按照这个路径加载策略文件,
(3)flash到你要建立的socket链接的域和端口下加载策略文件,
上面的3种方法,flash会依次尝试去做,如果哪一个成功加载了策略文件,后面的方法就不会使用了。接下来做第二件事情:
根据返回的策略文件内容 和 接下来要发起的socket连接对比。
检测域:example.com和端口:10081,是否在允许请求,如果允许flash会发起socket连接请求。不允许的话会报错。
如果报错说,html的域要与***.swf的与一样的话就在 new socket(\'.....\')之前加上这一句:WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR = true;
flash做的两件事情就是建立两个tcp连接,第一个加载策略文件的tcp,加载成功与否最后都会断开,第二个实现socket通信,两个tcp通信可以完全不相干,不在同一个域和端口下。