ÈÃie6Ò²Ö§³Öwebsocket²ÉÓÃflash·âװʵÏÖ

¡¡¡¡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();

¡¡¡¡}