gopush集群推送兼容ie方案

作者:简简单单 2014-11-03

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加入

 代码如下 复制代码
func CrossDomain(w http.ResponseWriter, r *http.Request) {
    hp := `
          
           
           
           
            request-headers-from domain="*.pztai.cn" headers="*"/>
           
`
    io.WriteString(w, hp)
}

然后在gopush下边建立新的文件夹flash,建立main.go

监视843端口,如果有请求,就返回crossdomain.xml内容,断开连接即可

最后用as3写普通的socket代码连接即可,核心代码如下

 代码如下 复制代码

private function sendHead():void{
            //发送协议
            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";
            socket.writeUTFBytes(protocol);
            socket.flush();

        }
private function socketGetData(data:ProgressEvent):void{
            if(socket.bytesAvailable){
                var msg:String = socket.readUTFBytes(socket.bytesAvailable);
                if(msg.charAt(0) == '+'){
                    if(!heatbeatTimer.running){
                        socketok = true;
                        heatbeatTimer.start();
                    }
                    if(reconnectTimer.running){
                        reconnectTimer.stop();
                    }
                }else if(msg.charAt(0) == '$'){
                    var msgArr:Array = msg.split("\r\n");
                    var msgString:String = msgArr[1];
                    ExternalInterface.call("asCallBack"," " + encodeURI(msgString));
                }
            }
        }

相关文章

精彩推荐