就目前而言,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;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/>