From 04ae1bf1c6b3f0498dfd180275a6d4255a8dce5e Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 26 五月 2023 15:14:24 +0800
Subject: [PATCH] 修改bug

---
 zuul/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java |   73 +++++++++++++++++++-----------------
 1 files changed, 39 insertions(+), 34 deletions(-)

diff --git a/zuul/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java b/zuul/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java
index b82f217..b173e90 100644
--- a/zuul/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java
+++ b/zuul/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java
@@ -7,6 +7,7 @@
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelId;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
@@ -86,11 +87,6 @@
 			}
 			JSONObject jsonCon = JSONObject.parseObject(jsonMsg.get("data").toString());
 
-			if(null != ctx && ctx.channel().isActive()){
-				jsonMsg.put("method", Method.pong);
-				sendMsgToClient(ctx, jsonMsg.toJSONString());
-			}
-
 			//心跳
 			if(method.equals(Method.ping)) {
 				Integer type = jsonCon.getInteger("type");
@@ -106,21 +102,24 @@
                         if(StringUtil.isNotEmpty(token)){
                             String token_ = redisUtil.getValue("USER_APP_"+ userId1);//获取缓存中最新的数据
                             if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向其他设备发送数据
-								ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(0, 23));
+								ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(token_.length() - 16));
 								JSONObject msg_ = new JSONObject();
                                 msg_.put("code", 200);
                                 msg_.put("msg", "SUCCESS");
                                 msg_.put("method", "OFFLINE");
                                 msg_.put("data", new Object());
-								this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息
-                                new Timer().schedule(new TimerTask() {
-                                    @Override
-                                    public void run() {
-                                        NettyChannelMap.remove_(data_);
-                                    }
-                                }, 5000);
+								boolean b = this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息
+								if(b){
+									NettyChannelMap.remove_(data_);
+								}
+//								new Timer().schedule(new TimerTask() {
+//                                    @Override
+//                                    public void run() {
+//                                        NettyChannelMap.remove_(data_);
+//                                    }
+//                                }, 5000);
                             }
-                            NettyChannelMap.update_(token.substring(0, 23), ctx);
+                            NettyChannelMap.update_(token.substring(token.length() - 16), ctx);
                             NettyChannelMap.update("USER" + userId1, ctx);
 							redisUtil.setStrValue("USER_APP_" + userId1, token);
                         }
@@ -132,33 +131,36 @@
                     }else{
                         //确保账号在单个设备上登录
 						if(StringUtil.isNotEmpty(token)){//APP端登录的操作
-                            String token_ = redisUtil.getValue("DRIVER_" + userId1);//缓存中拿最新数据
-                            if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向当前设备发送数据
-                                ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(0, 23));
-								JSONObject msg_ = new JSONObject();
-                                msg_.put("code", 200);
-                                msg_.put("msg", "SUCCESS");
-                                msg_.put("method", "OFFLINE");
-                                msg_.put("data", new Object());
-								this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息
-                                new Timer().schedule(new TimerTask() {
-                                    @Override
-                                    public void run() {
-                                        NettyChannelMap.remove_(data_);
-                                    }
-                                }, 5000);
-                            }
+//                            String token_ = redisUtil.getValue("DRIVER_" + userId1);//缓存中拿最新数据
+//                            if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向当前设备发送数据
+//                                ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(token_.length() - 16));
+//                                if(null != data_){
+//									JSONObject msg_ = new JSONObject();
+//									msg_.put("code", 200);
+//									msg_.put("msg", "SUCCESS");
+//									msg_.put("method", "OFFLINE");
+//									msg_.put("data", new Object());
+//									boolean b = this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息
+//									if(b){
+//										NettyChannelMap.remove_(data_);
+//									}
+//								}
+//                            }
                             NettyChannelMap.update("DRIVER" + userId1, ctx);
-                            NettyChannelMap.update_(token.substring(0, 23), ctx);
+                            NettyChannelMap.update_(token.substring(token.length() - 16), ctx);
 							redisUtil.setStrValue("DRIVER_" + userId1, token);
                         }
-
-                        //存储通讯通道
+						//存储通讯通道
                         if(null != ctx && ctx.channel().isActive()){
                             NettyChannelMap.update("DRIVER" + userId1, ctx);
                         }
                     }
                 }
+
+				if(null != ctx && ctx.channel().isActive()){
+					jsonMsg.put("method", Method.pong);
+					sendMsgToClient(ctx, jsonMsg.toJSONString());
+				}
 			}
 			//司机上传位置
 			if(method.equals(Method.location)){
@@ -212,7 +214,7 @@
 	 * @param msg
 	 * @author TaoNingBo
 	 */
-	public static void sendMsgToClient(ChannelHandlerContext ctx, String msg) {
+	public static boolean sendMsgToClient(ChannelHandlerContext ctx, String msg) {
 		if (ctx != null && ctx.channel().isActive()) {
 			ByteBuf buffer = Unpooled.copiedBuffer((msg).getBytes());
 			ChannelFuture sync;
@@ -232,7 +234,9 @@
 					if(b){
 						NettyChannelMap.remove(ctx);
 					}
+					return true;
 				}
+				return sync.isSuccess();
 			} catch (Exception e) {
 				System.err.println("推送发生异常,记录:"+msg);
 				NettyChannelMap.remove(ctx);
@@ -244,6 +248,7 @@
 			System.err.println("推送失败,长连接不存在");
 			NettyChannelMap.remove(ctx);
 		}
+		return false;
 	}
 
 //	**链接断开 将推送消息记录

--
Gitblit v1.7.1