wangchuanjin 7 years ago
parent
commit
4fc08cd618
3 changed files with 76 additions and 24 deletions
  1. 10 0
      src/jfw/front/websocket.go
  2. 66 19
      src/web/staticres/js/login.js
  3. 0 5
      src/web/templates/common/pnc.html

+ 10 - 0
src/jfw/front/websocket.go

@@ -98,6 +98,7 @@ func GetWsByCode(param []string) bool {
 	ms.Lock.Unlock()
 	if wss != nil && wss.Conn != nil {
 		infoData := LoginInfo(src, openid, wss.Conn.Sess)
+		log.Println(infoData)
 		sendmessage, _ := json.Marshal(infoData)
 		if err := wss.Conn.WriteMessage(websocket.TextMessage, sendmessage); err != nil {
 			log.Println("socket send fail..", err)
@@ -153,17 +154,26 @@ func ServeWss(w http.ResponseWriter, r *http.Request) {
 	if err == nil {
 		for {
 			_, shareData, err := conn.ReadMessage()
+			log.Println("========wait", string(shareData))
 			if err != nil {
 				//log.Println("前台socket关闭,后台socket断开并退出循环。。。。")
 				break
 			} else {
+				//心跳监测
+				if string(shareData) == "HeartBeat" {
+					log.Println("send...", string(shareData))
+					conn.WriteMessage(websocket.TextMessage, []byte("\"HeartBeat\""))
+					continue
+				}
 				shareIds = string(shareData)
 				shareidlist := strings.Split(shareIds, "___")
 				if shareIds != "" && len(shareidlist) > 1 {
 					shareidnum := shareidlist[0]
 					shareidkop := shareidlist[1]
+					log.Println(se.DecodeString(shareidnum), se.DecodeString(shareidkop))
 					PutWsByCode(se.DecodeString(shareidnum), conn)
 					PutWsByCode(se.DecodeString(shareidkop), conn)
+					conn.WriteMessage(websocket.TextMessage, []byte("\"ok\""))
 				}
 			}
 		}

+ 66 - 19
src/web/staticres/js/login.js

@@ -1,5 +1,4 @@
 /**统一登录js文件**/
-
 var loginfg='';//websocket请求标识
 var bIE9=false;
 if(navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.match(/[6789]./i)) { 
@@ -24,43 +23,89 @@ var encryptId = null;
 var qr_type = "s";
 var unseatflag = false;//未登录情况下,用户点击超级搜索等开启按钮或者功能,根据此状态看是否弹出二维码
 var unseatzbqyflag = false;//未登录情况下,用户点击中标企业等开启按钮或者功能,根据此状态看是否弹出二维码
-var errnum = 0;
+var sendMsgIntervalObj = null;
+//心跳检测
+var WebSocketHeartCheck = function(){
+	this.lockReconnect = false;//避免重复连接
+    this.timeout = 5000;//60秒
+    this.timeoutObj = null;
+    this.serverTimeoutObj = null;
+    this.reset = function(){
+		console.info("reset。。。");
+        clearTimeout(this.timeoutObj);
+        clearTimeout(this.serverTimeoutObj);
+        return this;
+    }
+    this.start = function(){
+        var self = this;
+        this.timeoutObj = setTimeout(function(){
+            //这里发送一个心跳,后端收到后,返回一个心跳消息,
+            //onmessage拿到返回的心跳就说明连接正常
+			console.info("send HeartBeat");
+            ws.send("HeartBeat");
+            self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
+                ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
+            }, self.timeout);
+        }, this.timeout);
+    }
+}
+var webSocketHeartCheck = new WebSocketHeartCheck();
 //创建websocket连接
 var createWebSocket = function(wsUrl){
 	try{
 		ws = new WebSocket(wsUrl);//实例化websocket对象
 		initEventHandle();
 	}catch(e){
-		//reconnect(wsUrl)
+		reconnect(wsUrl)
 		console.log(e)
 	}
 }
 //
 var initEventHandle = function(){
 	ws.onmessage = function(e){
-		if(e.data!=""){
-			//用户登录
-			logic(e.data,mynum);
+		console.info(e.data);
+		console.info("recive。。。");
+		if(e.data==""){
+			return
+		}else if(e.data=="\"ok\""){//重新发送shareid
+			clearInterval(sendMsgIntervalObj);
+			console.info(sendMsgIntervalObj)
+			return
+		}else if(e.data=="\"HeartBeat\""){//心跳检测
+			//如果获取到消息,心跳检测重置
+	        //拿到任何消息都说明当前连接是正常的
+	        webSocketHeartCheck.reset().start();
 		}
+		//用户登录
+		logic(e.data,mynum);
 	}
 	ws.onerror = function(e){
-		errnum++
-		if(errnum<5){
-			clearInterval(loginfg);
-			createWebSocket(wsUrl);
-			JYLogin(mynum);
-		}
+		console.info("onerror");
+		reconnect(wsUrl);
+	}
+	ws.onclose = function () {
+		console.info("onclose");
+        reconnect(wsUrl);
+    }
+	ws.onopen = function(e) {
+		//心跳检测重置
+        webSocketHeartCheck.reset().start();
 	}
-//	ws.onopen = function(e) {
-//		if(ws.readyState==1){
-//			ws.send(pageshareid+"___"+kopshareid);
-//		}
-//	}
 }
 //
 function reconnect(url) {
+	if(webSocketHeartCheck.lockReconnect) return;
+    webSocketHeartCheck.lockReconnect = true;
+    //没连接上会一直重连,设置延迟避免请求过多
     setTimeout(function () {
+		console.info("reconnect。。。");
         createWebSocket(url);
+		webSocketHeartCheck.lockReconnect = false;
+		if(sendMsgIntervalObj == null){
+			sendMsgIntervalObj = setInterval(function(){
+				SendMsg();
+			},2000);
+		}
     }, 2000);
 }
 //websocket查看用户是否登录
@@ -78,14 +123,16 @@ var JYLogin = function(num){
 }
 var SendMsg = function(){
 	//向后台发送websocket数据
+	console.info("-------------000000000");
 	if (window["WebSocket"]){
+		console.info("-------------11111111");
+		console.info(ws.readyState);
 		if(ws.readyState==1){
-			//console.log("发送:"+pageshareid+"___"+kopshareid)
+			console.log("发送:"+pageshareid+"___"+kopshareid)
 			ws.send(pageshareid+"___"+kopshareid);
 		}
 	}
 }
-
 //生成页面二维码,不同页面处理逻辑
 var getNewShareId = function(num){
 	mynum = num;

+ 0 - 5
src/web/templates/common/pnc.html

@@ -18,9 +18,4 @@
 <script src="/js/jy.js?v={{Msg "seo" "version"}}"></script>
 <script src="/js/login.js?v={{Msg "seo" "version"}}"></script>
 <script src="/js/common.js?v={{Msg "seo" "version"}}"></script>
-<script type="text/javascript" src="/js/swfobject.js"></script>
-<script type="text/javascript" src="/js/web_socket.js"></script>
-<script type="text/javascript">
-    WEB_SOCKET_SWF_LOCATION = "/js/WebSocketMain.swf";
-</script>
 {{Html `<!--[if lt IE 9]><script src="/js/html5shiv.min.js"></script><script src="/js/respond.min.js"></script><![endif]-->`}}