>  기사  >  웹 프론트엔드  >  ie6도 플래시 Packaging_javascript 기술을 사용하여 웹소켓을 지원하도록 합니다.

ie6도 플래시 Packaging_javascript 기술을 사용하여 웹소켓을 지원하도록 합니다.

WBOY
WBOY원래의
2016-05-16 17:41:511121검색

ie6은 물론이고 ie9도 웹소켓을 지원하지 않는데, 웹소켓이 이렇게 멋진 기능을 개발할 수 있는데, 우리를 어떻게 막을 수 있을까요?
그런데
플래시 패키징을 사용해야 할까요?

구체적인 플래시 코드는 다음과 같습니다 :

코드 복사 코드는 다음과 같습니다

패키지 {
import flash.display.Stage;
flash.display.Sprite 가져오기;
flash.events.* 가져오기;
flash.external.ExternalInterface 가져오기;
flash.system.Security 가져오기;
flash.utils.Timer 가져오기;
flash.net.Socket 가져오기;
flash.utils.ByteArray 가져오기;
flash.utils.Endian 가져오기;
public class websocket4ie는 Sprite를 확장합니다 {
public static function main():void
{
var websocket4ie:websocket4ie = new websocket4ie();
}
private var debugEnabled:Boolean;
비공개 var movieName:String;
개인 var 처리기:문자열;
개인 var 서버:문자열;
비공개 var 포트:번호;
private var isDebug:Number;
비공개 var 소켓:소켓;
비공개 var 소켓버퍼:ByteArray = new ByteArray();
공용 함수 websocket4ie() {
Security.allowDomain("*");
var 카운터:숫자 = 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);
시도해 보세요 {
this.debugEnabled = root.loaderInfo.parameters.debugEnabled == "true" ? 사실 : 거짓;
} catch(예:Object) {
this.debugEnabled = false;
}
this.connectServer();
ExternalInterface.addCallback("sendData", this.sendData);
}
공용 함수 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 = 소켓;
}
public function onConnect(e:Event):void {
//握手
var headers:Array = new Array();
headers.push("GET /chat HTTP/1.1rn");
headers.push("업그레이드: websocketrn");
headers.push("연결: 업그레이드");
headers.push("호스트: " this.server ":" this.port "rn");
headers.push("원본: nullrn");
headers.push("Sec-WebSocket-키: 6z4ezNfATjW5/FEMYpqRuw==rn");
headers.push("Sec-WebSocket-버전: 13rnrnrn");
this.socket.writeUTFBytes(headers.join(''));
this.socket.flush();
}
공용 함수 onTrueConnect():void {
ExternalInterface.call(this.handlers ".onConnect",this.movieName);
}
공용 함수 onClose(e:Event):void {
ExternalInterface.call(this.handlers ".onClose",this.movieName,'1');
}
공용 함수 onIOError(e:IOErrorEvent):void {
ExternalInterface.call(this.handlers ".onClose",this.movieName,'2');
}
공용 함수 onSecurityError(e:SecurityErrorEvent):void {
ExternalInterface.call(this.handlers ".onClose",this.movieName,'3');
}
공용 var step:String = "head";
공개 변수 위치:숫자 = 0;
공용 함수 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;
반환;
}
} 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;
반환;
}
}
} else {
this.position = tmpPos;
반환;
}
} else {
this.position = tmpPos;
반환;
}
}
public function onText(text:String):void {
ExternalInterface.call(this.handlers ".onData",this.movieName,text);
}
공용 함수 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();
}
공용 var is_head:Boolean = true;
공개 var 헤더:ByteArray = new ByteArray();
공용 var 헤더:Array = new Array();
공용 함수 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);
휴식;
} 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();
}
계속;
}
}
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(바이트);
}
공용 함수 sendData(text:String):void {
var head:ByteArray = new ByteArray();
head.writeByte(0x81);
var body:ByteArray = new ByteArray();
body.writeUTFBytes(텍스트);
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(헤드);
this.socket.writeBytes(body);
this.socket.flush();
}
공용 함수 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 소켓4ie() {
this.debug = 0;
this.init = function() {
this.index = handlers.connects.length;
handlers.connects.push(this);
}
this.connect = function(도메인,포트) {
this.createFlash(도메인,포트);
}
this.createFlash = function(domain,port) {
var html = '





' ;
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();
}
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.