WebSocket兼容到低版本浏览器
就目前而言,WebSocket是最好的Web通信解决方案了。但是IE从10才开始兼容它,对于目前大量IE8存在的市场,原生的WebSocket显然不太实用,我们需要低版本兼容的解决方案。于是我模拟WebSocket在浏览器上的行为,用AS3写了个兼容的版本。
内容有点多,这篇只把演示给搞定,至于AS的源码就丢到下一篇了。下面是效果图:
演示下载地址: WebSocket兼容到低版本浏览器(演示实例)
页面代码比较简单,用法和正常的WebSocket基本一样,只是引用了WebSocket.js这个文件来兼容低版本浏览器。当然还有个WebSocket.swf需要放在与页面相同的目录下。 <script src="WebSocket.js"></script>
服务器程序使用NodeJS代码,随手写的聊天室功能,仅仅为了实现功能而已,作为演示代码不要吐槽考虑的不够周全。里面的 decodeDataFrame 和 encodeDataFrame 在之前的文章中有出现过,这里就不贴出来了。由于需要兼容AS版,所以服务器程序需要比普通的WebSocket多一个AS的域安全验证的步骤。这是关键所在,如果使用现成的WebSocket库之类的东西可能得稍微修改源码才能兼容AS版。
<script>
onload=function(){
var ws=new WebSocket("ws://127.0.0.1:8000");
ws.onopen=function(){
//握手成功
send.removeAttribute("disabled");
send.value="发送";
};
ws.onmessage=function(e){
//收到消息,放到页面上
var dl,dt,dd,o=eval("("+e.data+")");
dl=document.createElement("dl");
dt=document.createElement("dt");
dd=document.createElement("dd");
dt.innerHTML=o.client;
dd.appendChild(document.createTextNode(o.content));
dl.appendChild(dt);
dl.appendChild(dd);
wall.appendChild(dl);
wall.scrollTop=1E8; //滚动条移到底部
};
send.onclick=function(){
//发送消息
if(!message.value)return alert("请输入内容");
ws.send(message.value);
message.value="";
};
};
</script>
<style>
dl {margin:3px 10px;font:14px/20px Consolas,微软雅黑;}
dt {color:blue;}
#wall {
border:1px solid #CCC;width:200px;height:200px;
overflow-y:auto;margin-bottom:10px;
}
</style>
<div id="wall"></div>
<input id="message" />
<input type="button" value="连接中···" id="send" disabled />var crypto=require('crypto');
var fs=require('fs');
var WS='258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
var pool=[]; //连接池
require('net').createServer(function(o){
var key;
o.on('data',function(e){
if(!key){
var data=e.toString();
//Flash握手
if(data=='<policy-file-request/>\0')
return fs.readFile('policy.txt',function(err,data){
o.write(data+'\0');
});
//WebSocket握手
if(key=data.match(/Sec-WebSocket-Key: (.+)|$/)[1])
key=crypto.createHash('sha1').update(key+WS).digest('base64'),
o.write([
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
'Sec-WebSocket-Accept: '+key
].join('\r\n')+'\r\n\r\n');
}else{
//解析数据
var frame=decodeDataFrame(e);
//文本帧
if(frame.Opcode==1){
//转义数据
var content=frame.PayloadData.replace(/\W/g,function(e){
e=e.charCodeAt(0).toString(16);
if(e.length==3)e='0'+e;
return '\\'+(e.length>2?'u':'x')+e;
}),client=o.remoteAddress+":"+o.remotePort,buffer;
//包装成JSON格式,并做成一个数据帧
buffer=encodeDataFrame({
FIN:1,Opcode:1,
PayloadData:'{"client":"'+client+'","content":"'+content+'"}'
});
//对所有连接广播数据
for(i=0;i<pool.length;i++)pool[i].write(buffer);
};
};
});
//断开时从连接池中移除
o.on("close",function(){
for(i=0;i<pool.length;i++)if(pool[i]==o)pool.splice(i,1);
});
//放入连接池中
pool.push(o);
}).listen(8000); Flash握手就是AS的域安全验证,这个在之前的文章“ 使用AS直接与服务器TCP通信 ”中有详细的说过,其实就是加载一个策略文件给它。把这个过程嵌入到WebSocket的握手之前就行。
WebSocket.js的代码就不贴出来说明了。它负责构造一个类似原生WebSocket的接口的功能,里面会对不兼容WebSocket的浏览器加载WebSocket.swf来使之兼容。
这个程序也是最近刚写的,存在漏洞在所难免,如果实用的话以后将慢慢完善它。
WebSocket兼容到低版本浏览器的更多相关文章
- AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器
AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的 ...
- 轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器
项目源代码下载地址:轮播图 以下为项目实现效果:(由于gif太大,所以只上传一张图片,但效果完全能实现,经测试,在ie各版本浏览器及chrome,firefox等浏览器中均能实现效果,可以实现点击切换 ...
- 从 ie10浏览器下Symbol 未定义的问题 探索vue项目如何兼容ie低版本浏览器(ie9, ie10, ie 11 )
问题: vue项目在ie11下一片空白并报Symbol 未定义的错 原因: ie10浏览器解析不了es6的语法,需要我们使用babel(Babel是一种工具链,主要用于将ECMAScr ...
- Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案
Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案 解决方式:安装 "babel-polyfill" 即可. 命令:npm install --save-dev ...
- React+Webpack+ES6 兼容低版本浏览器(IE9)解决方案
虽然过了兼容IE6的噩梦时代,IE依旧阴魂不散,因为你可能还要兼容IE9.在ES6已经普及的今天,用ES6写react已经成了标配.但是babel编译的js语法,由于某些不规范的写法,可能在IE9下不 ...
- 使用html5兼容低版本浏览器
因为html5 新出的一些语义化的标签,在低版本浏览器下不能识别,举个例子,比如你写了一个 header 标签中,写了一段文本,在低版本浏览器下,肯定是能看到的,但是,那是他是不认识 header标签 ...
- webpack 兼容低版本浏览器,转换ES6 ES7语法
ES6,ES7真的太棒了,async +await+Promise,让我阅读代码的时候不用再从左拉到右了(异步太多,一层套一层真的太头痛) 但是有个问题,打包后低版本浏览器运行不了,还有我用了一些混淆 ...
- 使用socket.io client 开发时兼容IE低版本的办法
使用socket.io client 开发时兼容IE低版本的办法 socket.io提供了针对各个版本浏览器的‘socket’功能的封转:websocket,长连接,流,flash什么的.给你格式化下 ...
- 低版本浏览器支持HTML5标签的方法
最近刷了一道面试题,是关于低版本浏览器支持HTM5标签的写法,在网上找了一些,都行之有效,但是缺少整体总结,所以在这里总结一下,方便其他人过来阅读. IE低版本需要支持HTML5标签: 方法1.传统引 ...
随机推荐
- ipad无法连接到app store怎么办
之前入手的air2提示无法连接到app store:你需要首先更新系统到最新的ios版本,去通用设置里面,有个update software, 点击即可,然后才能用apple id 联入,否选择提示连 ...
- OPENCV(5) —— 图像直方图
新版本对直方图不再使用之前的histogram的形式,而是用统一的Mat或者MatND的格式来存储直方图,可见新版本Mat数据结构的优势. C++: void calcHist(const Mat* ...
- 学习《R数据科学》高清中文PDF+高清英文PDF+源代码
学习R有不会的就查工具书<R数据科学>, 工具不是重点,创造价值才是目的.具体到数据科学,表现形式往往是提供解决方案或者做出某种决策.至于使用什么语言,采用什么工具,不本质.用 R 还是 ...
- 注解:@SuppressWarning()的用法
@SuppressWarning() 作用:J2SE 提供的一个批注或者注解.该批注的作用是给编译器一条指令,忽略这些警告信息. 常用:unchecked,serial. 1.如果传入多种情况,这几种 ...
- Linux下yum安装ffmpeg和使用
本文属于转载文章:转载地址是http://www.cnblogs.com/dennisit/archive/2012/12/27/2835089.html 使用Yum安装ffmpeg 打开 vi /e ...
- TXT小说朗读正式版
作者:www.gudianxiaoshuo.com 干净清洁的小说朗读软件,支持 TXT阅读.语音朗诵.点评标注.数据挖掘
- [51Nod]NOIP2018提高组省一冲奖班模测训练(三) 题解
链接 A.Anan的派对 题意:Anan想举办一个派对.Anan的朋友总共有 n 人.第i个人如果参加派对会得到 \(c_i\) 的快乐值,除他自己外每多一个人参加他会减少 \(d_i\) 的快乐值. ...
- C# 使用 X.509 v.3 证书的方法。
C# 使用 X.509 v.3 证书的方法. public static void Main() { // The path to the certificate. string ...
- 分享一下事件监听addEventListener----attachEvent的用法
来自:http://www.cnblogs.com/wkylin/archive/2011/10/09/2203161.html 事件监听addEventListener----attachEvent ...
- 获取session中存储的所有值的方法
记录一个获取系统中session存储的对象都有哪些的方法 HttpSession session = request.getSession(); for ( Enumeration e = sessi ...