让ie6也支持websocket采用flash封装实现


Posted in Javascript onFebruary 18, 2013

ie9都不支持websocket,何况ie6,但是websocket能开发那么酷的功能,怎么能让ie拦住我们的脚步?
但是怎么办?
用flash封装吧

具体的flash代码如下:

package { 
import flash.display.Stage; 
import flash.display.Sprite; 
import flash.events.*; 
import flash.external.ExternalInterface; 
import flash.system.Security; 
import flash.utils.Timer; 
import flash.net.Socket; 
import flash.utils.ByteArray; 
import flash.utils.Endian; 
public class websocket4ie extends Sprite { 
public static function main():void 
{ 
var websocket4ie:websocket4ie = new websocket4ie(); 
} 
private var debugEnabled:Boolean; 
private var movieName:String; 
private var handlers:String; 
private var server:String; 
private var port:Number; 
private var isDebug:Number; 
private var socket:Socket; 
private var socketBuffer:ByteArray = new ByteArray(); 
public function websocket4ie() { 
Security.allowDomain("*"); 
var counter:Number = 0; 
root.addEventListener(Event.ENTER_FRAME, function ():void { if (++counter > 100) counter = 0; }); 
this.movieName = root.loaderInfo.parameters.movieName; 
this.handlers = root.loaderInfo.parameters.handlers; 
this.server = root.loaderInfo.parameters.server; 
this.port = root.loaderInfo.parameters.port; 
this.isDebug = root.loaderInfo.parameters.debug; 
this.debug(this.port+''+this.server); 
try { 
this.debugEnabled = root.loaderInfo.parameters.debugEnabled == "true" ? true : false; 
} catch (ex:Object) { 
this.debugEnabled = false; 
} 
this.connectServer(); 
ExternalInterface.addCallback("sendData", this.sendData); 
} 
public function connectServer():void { 
socket = new Socket(); 
socket.endian = Endian.BIG_ENDIAN; 
socket.addEventListener(Event.CONNECT, onConnect); 
socket.addEventListener(Event.CLOSE, onClose); 
socket.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); 
socket.connect(this.server, this.port); 
this.socket = socket; 
} 
public function onConnect(e:Event):void { 
//握手 
var headers:Array = new Array(); 
headers.push("GET /chat HTTP/1.1\r\n"); 
headers.push("Upgrade: websocket\r\n"); 
headers.push("Connection: Upgrade\r\n"); 
headers.push("Host: "+this.server+":"+this.port+"\r\n"); 
headers.push("Origin: null\r\n"); 
headers.push("Sec-WebSocket-Key: 6z4ezNfATjW5/FEMYpqRuw==\r\n"); 
headers.push("Sec-WebSocket-Version: 13\r\n\r\n\r\n"); 
this.socket.writeUTFBytes(headers.join('')); 
this.socket.flush(); 
} 
public function onTrueConnect():void { 
ExternalInterface.call(this.handlers+".onConnect",this.movieName); 
} 
public function onClose(e:Event):void { 
ExternalInterface.call(this.handlers+".onClose",this.movieName,'1'); 
} 
public function onIOError(e:IOErrorEvent):void { 
ExternalInterface.call(this.handlers+".onClose",this.movieName,'2'); 
} 
public function onSecurityError(e:SecurityErrorEvent):void { 
ExternalInterface.call(this.handlers+".onClose",this.movieName,'3'); 
} 
public var step:String = "head"; 
public var position:Number = 0; 
public function readOnData():void { 
var tmpPos:Number = this.position; 
this.socketBuffer.position = this.position; 
//read 一个 0x81 
if(this.socketBuffer.bytesAvailable>=1) { 
var h:Number = this.socketBuffer.readUnsignedByte(); 
this.debug("头:"+h); 
this.position += 1; 
if(this.socketBuffer.bytesAvailable>=1) { 
var len:Number = this.socketBuffer.readUnsignedByte(); 
this.debug("长度:"+len); 
this.position += 1; 
if(len<=125) { 
if(this.socketBuffer.bytesAvailable>=len) { 
this.onText(this.socketBuffer.readUTFBytes(len)); 
this.position += len; 
this.readOnData(); 
} else { 
this.position = tmpPos; 
return; 
} 
} else if(len==126) { 
if(this.socketBuffer.bytesAvailable>=2) { 
var trueLen:Number = this.socketBuffer.readUnsignedShort(); 
if(this.socketBuffer.bytesAvailable>=trueLen) { 
this.onText(this.socketBuffer.readUTFBytes(trueLen)); 
this.position += trueLen; 
this.readOnData(); 
} 
} else { 
this.position = tmpPos; 
return; 
} 
} 
} else { 
this.position = tmpPos; 
return; 
} 
} else { 
this.position = tmpPos; 
return; 
} 
} 
public function onText(text:String):void { 
ExternalInterface.call(this.handlers+".onData",this.movieName,text); 
} 
public function writeBytes(bytes:ByteArray):void { 
this.socketBuffer.position = this.socketBuffer.length; 
this.socketBuffer.writeBytes(bytes,0,bytes.length); 
this.debug("buffer数据:"+this.socketBuffer.length); 
this.readOnData(); 
} 
public var is_head:Boolean = true; 
public var header:ByteArray = new ByteArray(); 
public var headers:Array = new Array(); 
public function onSocketData(e:Event):void { 
var bytes:ByteArray = new ByteArray(); 
if(this.is_head) { 
while(this.socket.bytesAvailable) { 
var x:Number = this.socket.readUnsignedByte(); 
if(x==0x81) { 
this.is_head = false; 
bytes.writeByte(0x81); 
this.debug(this.headers); 
break; 
} else { 
this.header.writeByte(x); 
if(x==10) { 
this.header.position = 0; 
this.headers.push(this.header.readUTFBytes(this.header.length)); 
if(this.header.length==2) { 
this.onTrueConnect(); 
} 
this.header = new ByteArray(); 
} 
continue; 
} 
} 
if(this.socket.bytesAvailable) { 
this.socket.readBytes(bytes,1,this.socket.bytesAvailable); 
} 
} else { 
this.socket.readBytes(bytes,0,this.socket.bytesAvailable); 
} 
bytes.position = 0; 
this.writeBytes(bytes); 
} 
public function sendData(text:String):void { 
var head:ByteArray = new ByteArray(); 
head.writeByte(0x81); 
var body:ByteArray = new ByteArray(); 
body.writeUTFBytes(text); 
var len:Number = body.length; 
if(len<=125) { 
head.writeByte(len); 
} else if(len<65536){ 
head.writeByte(126); 
head.writeShort(len); 
} else { 
head.writeByte(127); 
head.writeUnsignedInt(len); 
} 
body.position = 0; 
head.position = 0; 
this.socket.writeBytes(head); 
this.socket.writeBytes(body); 
this.socket.flush(); 
} 
public function debug(str:*):void { 
if(this.isDebug) { 
ExternalInterface.call(this.handlers+".debug",this.movieName,str); 
} 
} 
} 
}

js代码如下
var handlers = { 
'connects':[], 
'onClose':function(index,flag) { 
this.connects[index.replace("socket_","")].onClose(); 
}, 
'onConnect':function(index) { 
this.connects[index.replace("socket_","")].onConnect(); 
}, 
'onData':function(index,text) { 
this.connects[index.replace("socket_","")].onData(text); 
}, 
'debug':function(index,str) { 
console.log(str); 
} 
}; 
function socket4ie() { 
this.debug = 0; 
this.init = function() { 
this.index = handlers.connects.length; 
handlers.connects.push(this); 
} 
this.connect = function(domain,port) { 
this.createFlash(domain,port); 
} 
this.createFlash = function(domain,port) { 
var html = '<object id="socket_'+this.index+'" type="application/x-shockwave-flash" data="websocket4ie.swf" width=0 height=0 class="swfupload">\ 
<param name="wmode" value="window">\ 
<param name="movie" value="websocket4ie.swf">\ 
<param name="quality" value="high">\ 
<param name="menu" value="false">\ 
<param name="allowScriptAccess" value="always">\ 
<param name="flashvars" value="movieName=socket_'+this.index+'&handlers=handlers&server='+domain+'&port='+port+'&debug='+this.debug+'"></object>'; 
var div = document.createElement('div'); 
div.id = "flash_"+this.index; 
div.innerHTML = html; 
document.body.appendChild(div); 
} 
this.onClose = function() { 
} 
this.onConnect = function() { 
} 
this.onData = function(text) { 
} 
this.init(); 
}
Javascript 相关文章推荐
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
Feb 02 Javascript
JavaScript实现复制功能各浏览器支持情况实测
Jul 18 Javascript
JavaScript字符串插入、删除、替换函数使用示例
Jul 25 Javascript
最佳的JavaScript错误处理实践
Jul 16 Javascript
js H5 canvas投篮小游戏
Aug 18 Javascript
详解Vue生命周期的示例
Mar 10 Javascript
React Native 集成jpush-react-native的示例代码
Aug 16 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
Jquery实现获取子元素的方法分析
Aug 24 jQuery
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
Sep 02 Javascript
小程序自定义轮播图圆点组件
Jun 25 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
Feb 18 #Javascript
jQuery筛选器children()案例详解(图文)
Feb 17 #Javascript
正则表达式搭配js轻松处理json文本方便而老古
Feb 17 #Javascript
jQuery图片播放8款精美插件分享
Feb 17 #Javascript
jQuery性能优化28条建议你值得借鉴
Feb 16 #Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
Feb 16 #Javascript
js nextSibling属性和previousSibling属性概述及使用注意
Feb 16 #Javascript
You might like
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
php strtotime 函数UNIX时间戳
2009/01/14 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
django 自定义用户user模型的三种方法
2014/11/18 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
用pycharm开发django项目示例代码
2019/06/13 Python
python打开使用的方法
2019/09/30 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
python如何求圆的面积
2020/07/01 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
高三自我鉴定
2013/10/23 职场文书
股东协议书
2014/04/14 职场文书
阳光体育活动总结
2014/04/30 职场文书
公司节能减排倡议书
2014/05/14 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL