weizhengliang 4 лет назад
Родитель
Сommit
f36287b213

+ 5 - 3
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -1,5 +1,7 @@
 package com.wdkl.ncs.android.middleware.tcp;
 
+import com.wdkl.ncs.android.middleware.common.Constant;
+
 import java.util.Scanner;
 import java.util.concurrent.TimeUnit;
 
@@ -61,7 +63,7 @@ public class TcpClient {
                         // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
                         socketChannel.pipeline().addLast(new LengthFieldPrepender(2));
                         //心跳包应当小于服务器间隔
-                        socketChannel.pipeline().addLast(new IdleStateHandler(0, hbSeconds,0, TimeUnit.SECONDS));
+                        socketChannel.pipeline().addLast(new IdleStateHandler(hbSeconds+1, hbSeconds,0, TimeUnit.SECONDS));
                         socketChannel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(tcpClientHandler);
@@ -98,8 +100,8 @@ public class TcpClient {
                             if (retryTimes>30){
                                 System.out.println("重试"+(retryTimes-1)+"次,结束");
                                 workGroup.shutdownGracefully();
-                                //todo: 从API获取新的serverIP和serverPort,全新连接
-                                //TcpClient.getInstance().init();
+                                //从API获取新的serverIP和serverPort,全新连接
+                                TcpClient.getInstance().init(Constant.TCP_SERVER_URL, Constant.TCP_PORT, Constant.TCP_HEART_BEAT);
                                 return;
                             }
                             doConnect();

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

@@ -1,5 +1,7 @@
 package com.wdkl.ncs.android.middleware.tcp;
 
+import android.util.Log;
+
 import com.wdkl.ncs.android.middleware.common.Constant;
 import com.wdkl.ncs.android.middleware.common.MessageEvent;
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel;
@@ -21,6 +23,7 @@ import io.netty.util.ReferenceCountUtil;
 
 @ChannelHandler.Sharable
 public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
+    private static final String TAG = TcpClientHandler.class.getSimpleName();
     ChannelHandlerContext ctx;
     //重连间隔
     private static Integer retrySeconds = 5;
@@ -35,7 +38,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
         super.channelActive(ctx);
-        System.out.println("连接成功");
+        Log.i(TAG, "连接成功");
         this.ctx = ctx;
         connected = true;
         retryTimes = 0;
@@ -52,7 +55,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         EventBus.getDefault().post(new MessageEvent(0, Constant.EVENT_TCP_STATE));
         connected = false;
         Constant.TCP_CONNECTED = false;
-        System.out.println("失去连接");
+        Log.i(TAG, "失去连接");
         TcpClient.getInstance().doConnect();
         //reConnect(ctx);
     }
@@ -61,16 +64,17 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, String source) throws Exception {
         //System.out.println("channelRead0: read callback from server ===> " + source);
-        TcpModel tcpModel = TcpModel.getModelByJson(source);
+        if(source.equals("1")){
+            Log.i(TAG,"收到服务器返回的心跳 "+source);
+        }else {
+            TcpModel tcpModel = TcpModel.getModelByJson(source);
 
-        TcpModel responseTcpModel = null;
-        if (tcpModel != null) {
-            responseTcpModel = DeviceChannel.handleTcpReceived(tcpModel);
-        }
-        if (responseTcpModel != null) {
-            ctx.writeAndFlush(responseTcpModel.toJson());
-        } else {
-            ReferenceCountUtil.release(source);
+            TcpModel responseTcpModel = DeviceChannel.handleTcpReceived(tcpModel);
+            if (responseTcpModel!=null){
+                ctx.writeAndFlush(responseTcpModel.toJson());
+            } else {
+                ReferenceCountUtil.release(source);
+            }
         }
 
     }
@@ -83,6 +87,11 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
             if (event.state()== IdleState.WRITER_IDLE){
                 ctx.writeAndFlush("0");
             }
+            //读心跳包超时执行,关闭连接
+            else if (event.state() == IdleState.READER_IDLE){
+                Log.i(TAG,"TcpClientHandler ===> pong from server failed");
+                ctx.close();
+            }
         }
     }