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通信可以完全不相干,不在同一個域和端口下。