gopush 是金山開源的一個集群推送方案,支持1000k級別的推送,使用golang編寫,性能是杠杠的,下面一小編來看看gopush集群推送兼容ie方案吧.
gopush支持tcp 和 websocket 兩種協(xié)議,在移動端和新瀏覽器中,可以用tcp與websocket來解決實時推送,但是ie9以下版本IE瀏覽器是不支持websocket的,一般都是用長輪訓(xùn)來替換websocket,作者發(fā)話說短期內(nèi)不考慮long-polling方式,這里就用flash的方案解決.
首先需要對gopush進行代碼調(diào)整,以便適應(yīng)flash 的安全策略,在web/http.go里面加入如下代碼:
httpServeMux.HandleFunc("/crossdomain.xml", CrossDomain)
然后在web/handle.go加入如下代碼:
- func CrossDomain(w http.ResponseWriter, r *http.Request) {
- hp := `<?xml version="1.0" ?>
- <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- <cross-domain-policy>
- <site-control permitted-cross-domain-policies="all"/>
- <allow-access-from domain="*.pztai.cn"/>
- <allow-http-request-headers-from domain="*.pztai.cn" headers="*"/> //Vevb.com
- </cross-domain-policy>`
- io.WriteString(w, hp)
- }
然后在gopush下邊建立新的文件夾flash,建立main.go,監(jiān)視843端口,如果有請求,就返回crossdomain.xml內(nèi)容,斷開連接即可,最后用as3寫普通的socket代碼連接即可,核心代碼如下:
- private function sendHead():void{
- //發(fā)送協(xié)議
- 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));
- }
- }
- }
新聞熱點
疑難解答
圖片精選