Browse Source

TCP重新连接优化

allen 4 years ago
parent
commit
03ac1db921

BIN
.gradle/4.10.1/fileHashes/fileHashes.bin


BIN
.gradle/4.10.1/fileHashes/fileHashes.lock


BIN
.gradle/4.10.1/fileHashes/resourceHashesCache.bin


BIN
.gradle/4.10.1/javaCompile/classAnalysis.bin


BIN
.gradle/4.10.1/javaCompile/javaCompile.lock


BIN
.gradle/4.10.1/javaCompile/taskHistory.bin


BIN
.gradle/4.10.1/taskHistory/taskHistory.bin


BIN
.gradle/4.10.1/taskHistory/taskHistory.lock


BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock


BIN
.gradle/buildOutputCleanup/outputFiles.bin


+ 2 - 2
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt

@@ -54,10 +54,10 @@ interface UrlManager {
 private class DevUrlManager : UrlManager{
 private class DevUrlManager : UrlManager{
 
 
     override val base: String
     override val base: String
-        get() = "http://192.168.1.188"
+        get() = "http://dev.base.wdklian.com"
 
 
     override val device_url: String
     override val device_url: String
-        get() = "${base}:8006/"
+        get() = "${base}:6005/"
 
 
     override val basic: String
     override val basic: String
         get() = "${base}:7002/"
         get() = "${base}:7002/"

File diff suppressed because it is too large
+ 16 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/hello/HelloListActivityPresenter.kt


+ 203 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/EventDO.java

@@ -0,0 +1,203 @@
+package com.wdkl.ncs.android.middleware.model.dos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdkl.ncs.android.middleware.model.annotation.Column;
+import com.wdkl.ncs.android.middleware.model.annotation.Id;
+import com.wdkl.ncs.android.middleware.model.annotation.PrimaryKeyField;
+import com.wdkl.ncs.android.middleware.model.annotation.Table;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+@Table(name = "ncs_event")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class EventDO implements Serializable {
+
+    /**
+     * 事件id
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "事件id", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 按键唯一标识码
+     */
+    @Column(name = "key_code")
+    @ApiModelProperty(value = "按键唯一标识码", required = false)
+    private String keyCode;
+    /**
+     * null
+     */
+    @Column(name = "name")
+    @ApiModelProperty(value = "null", required = false)
+    private String name;
+    /**
+     * 描述
+     */
+    @Column(name = "desc")
+    @ApiModelProperty(value = "描述", required = false)
+    private String desc;
+    /**
+     * 最新x坐标
+     */
+    @Column(name = "min_x")
+    @ApiModelProperty(value = "最新x坐标", required = false)
+    private Integer minX;
+    /**
+     * 最大x坐标
+     */
+    @Column(name = "max_x")
+    @ApiModelProperty(value = "最大x坐标", required = false)
+    private Integer maxX;
+    /**
+     * 最小y坐标
+     */
+    @Column(name = "min_y")
+    @ApiModelProperty(value = "最小y坐标", required = false)
+    private Integer minY;
+    /**
+     * 最大y坐标
+     */
+    @Column(name = "max_y")
+    @ApiModelProperty(value = "最大y坐标", required = false)
+    private Integer maxY;
+    /**
+     * 类型;如遥控器
+     */
+    @Column(name = "type")
+    @ApiModelProperty(value = "类型;如遥控器", required = false)
+    private String type;
+    /**
+     * null
+     */
+    @Column(name = "union_id")
+    @ApiModelProperty(value = "null", required = false)
+    private String unionId;
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_time")
+    @ApiModelProperty(value = "创建时间", required = false)
+    private Long createTime;
+    /**
+     * 图片地址
+     */
+    @Column(name = "icon_src")
+    @ApiModelProperty(value = "图片地址", required = false)
+    private String iconSrc;
+
+
+    @PrimaryKeyField
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    public String getKeyCode() {
+        return keyCode;
+    }
+
+    public void setKeyCode(String keyCode) {
+        this.keyCode = keyCode;
+    }
+
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+
+    public Integer getMinX() {
+        return minX;
+    }
+
+    public void setMinX(Integer minX) {
+        this.minX = minX;
+    }
+
+
+    public Integer getMaxX() {
+        return maxX;
+    }
+
+    public void setMaxX(Integer maxX) {
+        this.maxX = maxX;
+    }
+
+
+    public Integer getMinY() {
+        return minY;
+    }
+
+    public void setMinY(Integer minY) {
+        this.minY = minY;
+    }
+
+
+    public Integer getMaxY() {
+        return maxY;
+    }
+
+    public void setMaxY(Integer maxY) {
+        this.maxY = maxY;
+    }
+
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+
+    public String getUnionId() {
+        return unionId;
+    }
+
+    public void setUnionId(String unionId) {
+        this.unionId = unionId;
+    }
+
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+
+    public String getIconSrc() {
+        return iconSrc;
+    }
+
+    public void setIconSrc(String iconSrc) {
+        this.iconSrc = iconSrc;
+    }
+
+}

+ 16 - 11
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -16,14 +16,13 @@ import java.util.concurrent.TimeUnit;
 //单例
 //单例
 public class TcpClient {
 public class TcpClient {
     private NioEventLoopGroup workGroup = new NioEventLoopGroup();
     private NioEventLoopGroup workGroup = new NioEventLoopGroup();
+    public Channel channel;
     private Bootstrap bootstrap;
     private Bootstrap bootstrap;
 
 
     //数据处理
     //数据处理
     TcpClientHandler tcpClientHandler = new TcpClientHandler();
     TcpClientHandler tcpClientHandler = new TcpClientHandler();
-    //是否运行中
-    public boolean isRunning = false;
     //重试间隔
     //重试间隔
-    private Integer retrySeconds = 5;
+    private Integer retrySeconds = 2;
     //重试计数
     //重试计数
     private Integer retryTimes = 1;
     private Integer retryTimes = 1;
 
 
@@ -43,6 +42,7 @@ public class TcpClient {
         bootstrap = new Bootstrap();
         bootstrap = new Bootstrap();
         bootstrap.group(workGroup)
         bootstrap.group(workGroup)
                 .channel(NioSocketChannel.class)
                 .channel(NioSocketChannel.class)
+                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 15*1000)
                 .option(ChannelOption.SO_KEEPALIVE,true)
                 .option(ChannelOption.SO_KEEPALIVE,true)
                 .handler(new ChannelInitializer<SocketChannel>() {
                 .handler(new ChannelInitializer<SocketChannel>() {
                     @Override
                     @Override
@@ -59,23 +59,28 @@ public class TcpClient {
 
 
     //独立连接方法,用于重新连接
     //独立连接方法,用于重新连接
     public synchronized void doConnect(){
     public synchronized void doConnect(){
-        System.out.println("connect start");
+        if (channel != null && channel.isActive()){
+            System.out.println("TcpClient connecting");
+            return;
+        }
+
+        System.out.println("TcpClient connect start");
         ChannelFuture future = bootstrap.connect().addListener(new ChannelFutureListener() {
         ChannelFuture future = bootstrap.connect().addListener(new ChannelFutureListener() {
             @Override
             @Override
             public void operationComplete(ChannelFuture channelFuture) throws Exception {
             public void operationComplete(ChannelFuture channelFuture) throws Exception {
                 if (channelFuture.isSuccess()){
                 if (channelFuture.isSuccess()){
-                    isRunning = true;
-                    System.out.println("connect success");
+                    channel = channelFuture.channel();
+                    retryTimes = 0;
+                    System.out.println("TcpClient connect success");
                 } else {
                 } else {
                     //连接失败时的处理
                     //连接失败时的处理
-                    isRunning = false;
-                    System.out.println("connect retry : " + retryTimes);
+                    System.out.println("TcpClient connect retry : " + retryTimes);
                     channelFuture.channel().eventLoop().schedule(new Runnable() {
                     channelFuture.channel().eventLoop().schedule(new Runnable() {
                         @Override
                         @Override
                         public void run() {
                         public void run() {
                             retryTimes++;
                             retryTimes++;
-                            if (retryTimes>3){
-                                System.out.println("重试"+(retryTimes-1)+"次,结束");
+                            if (retryTimes>30){
+                                System.out.println("TcpClient 重试"+(retryTimes-1)+"次,结束");
                                 workGroup.shutdownGracefully();
                                 workGroup.shutdownGracefully();
                                 //todo: 从API获取新的serverIP和serverPort,全新连接
                                 //todo: 从API获取新的serverIP和serverPort,全新连接
                                 //TcpClient.getInstance().init();
                                 //TcpClient.getInstance().init();
@@ -113,7 +118,7 @@ public class TcpClient {
         new Thread(new Runnable() {
         new Thread(new Runnable() {
             @Override
             @Override
             public void run() {
             public void run() {
-                TcpClient.getInstance().init("192.168.1.100",5080, 9);
+                TcpClient.getInstance().init("192.168.1.188",5080, 9);
             }
             }
         }).start();
         }).start();
 
 

+ 17 - 17
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java

@@ -40,22 +40,22 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
         super.channelInactive(ctx);
         super.channelInactive(ctx);
         connected = false;
         connected = false;
-        System.out.println("失去连接");
+        System.out.println("TcpClientHandler 失去连接");
         reConnect(ctx);
         reConnect(ctx);
     }
     }
 
 
     //读取String消息
     //读取String消息
     @Override
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, String source) throws Exception {
     protected void channelRead0(ChannelHandlerContext ctx, String source) throws Exception {
-        //System.out.println("channelRead0: read callback from server ===> " + source);
-        TcpModel tcpModel = TcpModel.getModelByJson(source);
-
-        TcpModel responseTcpModel = DeviceChannel.handleTcpReceived(tcpModel);
-        if (responseTcpModel!=null){
-            ctx.writeAndFlush(responseTcpModel.toJson());
-        } else {
-            ReferenceCountUtil.release(source);
-        }
+        System.out.println("TcpClientHandler from server ===> " + source);
+//        TcpModel tcpModel = TcpModel.getModelByJson(source);
+//
+//        TcpModel responseTcpModel = DeviceChannel.handleTcpReceived(tcpModel);
+//        if (responseTcpModel!=null){
+//            ctx.writeAndFlush(responseTcpModel.toJson());
+//        } else {
+//            ReferenceCountUtil.release(source);
+//        }
     }
     }
 
 
     //写心跳包。没有消息发送时,每间隔一定时间会由此方法向服务端发送心跳
     //写心跳包。没有消息发送时,每间隔一定时间会由此方法向服务端发送心跳
@@ -74,7 +74,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         cause.printStackTrace();
         cause.printStackTrace();
         ctx.close();
         ctx.close();
         connected = false;
         connected = false;
-        System.out.println("失去连接,错误引起");
+        System.out.println("TcpClientHandler 失去连接,错误引起");
     }
     }
 
 
     //发送消息,不直接调用些方法,调用TcpClient中的发送消息
     //发送消息,不直接调用些方法,调用TcpClient中的发送消息
@@ -94,18 +94,18 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
 
 
     //已经连接上,中途失去连接时的处理
     //已经连接上,中途失去连接时的处理
     private void reConnect(final ChannelHandlerContext ctx){
     private void reConnect(final ChannelHandlerContext ctx){
-        totalRetryTimes++;
-        System.out.println("总计连接次数:"+totalRetryTimes);
         if (totalRetryTimes>100){
         if (totalRetryTimes>100){
             //todo: 存储数据库,并告警
             //todo: 存储数据库,并告警
         }
         }
-        if (connected){
+        if (connected && (TcpClient.getInstance().channel != null && TcpClient.getInstance().channel.isActive())){
             return;
             return;
         }
         }
+        totalRetryTimes++;
+        System.out.println("TcpClientHandler 总计连接次数:"+totalRetryTimes);
         retryTimes++;
         retryTimes++;
-        if (retryTimes>3){
+        if (retryTimes>30){
             //超时3次,其它处理
             //超时3次,其它处理
-            System.out.println("重新连接"+(retryTimes-1)+"次,结束");
+            System.out.println("TcpClientHandler 重新连接"+(retryTimes-1)+"次,结束");
             retryTimes = 0;
             retryTimes = 0;
             //todo: 从API获取新的serverIP和serverPort,全新连接
             //todo: 从API获取新的serverIP和serverPort,全新连接
             //TcpClient.getInstance().init();
             //TcpClient.getInstance().init();
@@ -115,7 +115,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         ctx.channel().eventLoop().schedule(new Runnable() {
         ctx.channel().eventLoop().schedule(new Runnable() {
             @Override
             @Override
             public void run() {
             public void run() {
-                System.out.println("重新连接,第"+retryTimes+"次");
+                System.out.println("TcpClientHandler 重新连接,第"+retryTimes+"次");
                 TcpClient.getInstance().doConnect();
                 TcpClient.getInstance().doConnect();
                 reConnect(ctx);
                 reConnect(ctx);
             }
             }