ie 6にもwebsocketをサポートさせます.


ie 9は全部websocketを支持しないで、ましてie 6、しかしwebsocketはそんなにクールな機能を開発することができて、ieに私達の足どりを妨げることができますか?
でも、どうすればいいですか
フラッシュで包装しましょう
具体的なフラッシュコードは以下の通りです.
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
"); headers.push("Upgrade: websocket\r
"); headers.push("Connection: Upgrade\r
"); headers.push("Host: "+this.server+":"+this.port+"\r
"); headers.push("Origin: null\r
"); headers.push("Sec-WebSocket-Key: 6z4ezNfATjW5/FEMYpqRuw==\r
"); headers.push("Sec-WebSocket-Version: 13\r
\r
\r
"); 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 = '\
            \
            \
            \
            \
            \
            ';    
        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();
}



注意:
flash接続socketはサーバーが843のポートを開く必要があります.xmlの内容を返します.下にpythonが書いた例があります.
import socket
import time
from threading import Thread
import os
import sys



class returnCrossDomain(Thread):
    def __init__(self,connection):
        Thread.__init__(self)
        self.con = connection
    def run(self):
        xmlData  = ''''''
        xmlData += ''''''
        xmlData += ''''''
        xmlData += '''''' #      
        xmlData += '''''' #      
	xmlData += '''\0'''
        try:
            self.con.send(xmlData)
        except Excepiton,e:
            pass
        self.con.close()


def main():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind(('',843))
    sock.listen(100)
    while True:
        try:
            connection,address = sock.accept()
            returnCrossDomain(connection).start()
        except:
            time.sleep(1)

if __name__=="__main__":
    main()
具体的なコードは私のgithubにダウンロードしてください.
https://github.com/suxianbaozi/websocket4ie