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