首页 > 系统 > Linux > 正文

gopush集群推送兼容ie方案

2024-08-27 23:59:27
字体:
来源:转载
供稿:网友

gopush 是金山开源的一个集群推送方案,支持1000k级别的推送,使用golang编写,性能是杠杠的,下面一小编来看看gopush集群推送兼容ie方案吧.

gopush支持tcp 和 websocket 两种协议,在移动端和新浏览器中,可以用tcp与websocket来解决实时推送,但是ie9以下版本IE浏览器是不支持websocket的,一般都是用长轮训来替换websocket,作者发话说短期内不考虑long-polling方式,这里就用flash的方案解决.

首先需要对gopush进行代码调整,以便适应flash 的安全策略,在web/http.go里面加入如下代码:

httpServeMux.HandleFunc("/crossdomain.xml", CrossDomain)

然后在web/handle.go加入如下代码:

  1. func CrossDomain(w http.ResponseWriter, r *http.Request) { 
  2.     hp := `<?xml version="1.0" ?> 
  3.            <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"
  4.             <cross-domain-policy> 
  5.             <site-control permitted-cross-domain-policies="all"/> 
  6.             <allow-access-from domain="*.pztai.cn"/> 
  7.             <allow-http-request-headers-from domain="*.pztai.cn" headers="*"/>  //Vevb.com 
  8.             </cross-domain-policy>` 
  9.     io.WriteString(w, hp) 

然后在gopush下边建立新的文件夹flash,建立main.go,监视843端口,如果有请求,就返回crossdomain.xml内容,断开连接即可,最后用as3写普通的socket代码连接即可,核心代码如下:

  1. private function sendHead():void{ 
  2.             //发送协议 
  3.             var protocol:String = "*3\r\n$3\r\nsub\r\n$" + key.length+"\r\n"+key+ "\r\n$"+ hearbeattime.toString().length+ "\r\n" + hearbeattime.toString() + "\r\n"
  4.             socket.writeUTFBytes(protocol); 
  5.             socket.flush(); 
  6.         } 
  7. private function socketGetData(data:ProgressEvent):void{ 
  8.             if(socket.bytesAvailable){ 
  9.                 var msg:String = socket.readUTFBytes(socket.bytesAvailable); 
  10.                 if(msg.charAt(0) == '+'){ 
  11.                     if(!heatbeatTimer.running){ 
  12.                         socketok = true; 
  13.                         heatbeatTimer.start(); 
  14.                     } 
  15.                     if(reconnectTimer.running){ 
  16.                         reconnectTimer.stop(); 
  17.                     } 
  18.                 }else if(msg.charAt(0) == '$'){ 
  19.                     var msgArr:Array = msg.split("\r\n"); 
  20.                     var msgString:String = msgArr[1]; 
  21.                     ExternalInterface.call("asCallBack"," " + encodeURI(msgString)); 
  22.                 } 
  23.             } 
  24. }

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表