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

(0)

相关推荐

  • php使用websocket示例详解

    下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket 套接字做了封装处理,开发者使用的时候只需要考虑数据的交互而不用处理连接的建立.而 php 没有,从 socket 的连接.建立.绑定.监听等,这些都需要我们自己去操作,所以有必要拿出来再说一说. ① 和 ② 实际上就是一个 HTTP 的请求和响应,只不过我们在处理的过程中我们拿到的是没有经过解析的

  • Android中使用WebSocket实现群聊和消息推送功能(不使用WebView)

    WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考:如何理解 TCP/IP, SPDY, WebSocket 三者之间的关系? 今天的重点是讲如何在Android中脱离WebView使用WebSocket,而不是在Web浏览器

  • 基于node实现websocket协议

    一.协议 WebSocket是一种基于TCP之上的客户端与服务器全双工通讯的协议,它在HTML5中被定义,也是新一代webapp的基础规范之一. 它突破了早先的AJAX的限制,关键在于实时性,服务器可以主动推送内容 到客户端!可能的应用有:多人在线游戏,即时聊天,实时监控,远程桌面,新闻服务器等等. 对于我自己,当前最想尝试的是canvas+websocket组合起来能做什么. 二.实现 由于握手的过程是一个标准的HTTP请求,因此 websocket 的实现有两种选择:1)TCP上实现: 2)

  • php+html5基于websocket实现聊天室的方法

    本文实例讲述了php+html5基于websocket实现聊天室的方法.分享给大家供大家参考.具体如下: html5的websocket 实现了双向通信,折腾了几天弄了个聊天室,分享给大家 <?php error_reporting(E_ALL); ob_implicit_flush(); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $sockets; public $users; public $master;

  • Websocket协议详解及简单实例代码

    Websocket协议详解 关于websocket的协议是用来干嘛的,请参考其他文章. WebSocket关键词 HTML5协议,实时,全双工通信,长连接 WebSocket比传统Http的好处 客户端与服务端只建立一个TCP连接,可以使用更少的连接 WebSocket的服务端可以将数据推送到客户端,如实时将证券信息反馈到客户端(这个很关键),实时天气数据,比http请求响应模式更灵活 更轻量的协议头,减少数据传送量 数据帧格式 下图为手工打造的数据帧格式 /** * fin |masked |

  • Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器

    最近在做的一个项目中需要使用到HTML5中引入的WebSocket技术,本来以为应该很容易就能搞定,谁知道在真正上手开发了以后才发现有很多麻烦的地方,虽然我们是一个以前端开发和设计见长的团队,而且作为一个二手程序猿又长期不被待见,但是为了让有同样需求的朋友少走些弯路,我还是决定把实现方法贴在这个地方. 关于WebSocket的基本概念,维基百科上解释的很清楚,而且网上也能搜出来一大把,这里就略过不表,直接进入正题. 这次的问题首先有一个前提,就是得用Python来实现这个服务器,如果对具体语言没

  • 浅析nodejs实现Websocket的数据接收与发送

    WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.在WebSocket API中,浏览器和服务器只需要要做一个握手(handshaking)的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送. WebSocket是一个通信的协议,分为服务器和客户端.服务器放在后台,保持与客户端的长连接,完成双方通信的任务.客户端一般都是实现在支持HTML5浏览器核心中,通过提供JavascriptAPI使用网页可以建立websocket连接.

  • Python通过websocket与js客户端通信示例分析

    具体的 websocket 介绍可见 http://zh.wikipedia.org/wiki/WebSocket 这里,介绍如何使用 Python 与前端 js 进行通信. websocket 使用 HTTP 协议完成握手之后,不通过 HTTP 直接进行 websocket 通信. 于是,使用 websocket 大致两个步骤:使用 HTTP 握手,通信. js 处理 websocket 要使用 ws 模块: Python 处理则使用 socket 模块建立 TCP 连接即可,比一般的 soc

  • Spring和Websocket相结合实现消息的推送

    本文主要有三个步骤 1.用户登录后建立websocket连接,默认选择websocket连接,如果浏览器不支持,则使用sockjs进行模拟连接 2.建立连接后,服务端返回该用户的未读消息 3.服务端进行相关操作后,推送给某一个用户或者所有用户新消息 相关环境 Spring4.0.6(要选择4.0+),tomcat7.0.55 Websocet服务端实现 WebSocketConfig.java @Configuration @EnableWebMvc @EnableWebSocket publi

  • Nginx反向代理websocket配置实例

    最近有一个需求,就是需要使用 nginx 反向代理 websocket,经过查找一番资料,目前已经测试通过,本文只做一个记录 复制代码 代码如下: 注: 看官方文档说 Nginx 在 1.3 以后的版本才支持 websocket 反向代理,所以要想使用支持 websocket 的功能,必须升级到 1.3 以后的版本,因此我这边是下载的 Tengine 的最新版本测试的 1.下载 tengine 最近的源码 复制代码 代码如下: wget http://tengine.taobao.org/dow

  • 使用swoole扩展php websocket示例

    复制代码 代码如下: <?phpdefine('DEBUG', 'on');define("WEBPATH", str_replace("\\","/", __DIR__));require __DIR__ . '/../libs/lib_config.php'; class WebSocket extends Swoole\Network\Protocol\WebSocket{    /**     * 下线时,通知所有人     */ 

  • Javascript WebSocket使用实例介绍(简明入门教程)

    一旦你了解了网络套接字与WEB服务器的连接,你将可以从浏览器发送数据到服务器并且可以接收由服务器返回的响应数据. 以下是创建一个新的WebSocket对象的API: 复制代码 代码如下: var Socket = new WebSocket(url, [protocal] ); 这里第一个参数是指要连接的URL,第二个参数是可选的,如果需要的话,则是指定一个的服务器支持的协议. WEB Socket属性: 属性 说明 Socket.readyState readyState的代表的ReadOnl

随机推荐