websocket怎么兼容低版本的浏览器

2025-05-11 10:50:47
推荐回答(1个)
回答1:

演示下载地址: WebSocket兼容到低版本浏览器(演示实例) 页面代码比较简单,用法和正常的WebSocket基本一样,只是引用了WebSocket.js这个文件来兼容低版本浏览器。当然还有个WebSocket.swf需要放在与页面相同的目录下。

服务器程序使用NodeJS代码,随手写的聊天室功能,仅仅为了实现功能而已,作为演示代码不要吐槽考虑的不够周全。里面的 decodeDataFrame 和 encodeDataFrame 在之前的文章中有出现过,这里就不贴出来了。由于需要兼容AS版,所以服务器程序需要比普通的WebSocket多一个AS的域安全验证的步骤。这是关键所在,如果使用现成的WebSocket库之类的东西可能得稍微修改源码才能兼容AS版。 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=='\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