Android Netty客户端Demo

1、用到的netty库


implementation 'io.netty:netty-all:4.1.23.Final'



2、核心连接部分,代码就不全部贴出来了,需要的话在下方我会分享码云上的demo源码


public void connect() {

        if (isConnecting) {

            return;

        }

        //起个线程

        Thread clientThread = new Thread("client-Netty") {

            @Override

            public void run() {

                super.run();

                isNeedReconnect = true;

                reconnectNum = Integer.MAX_VALUE;

                connectServer();

            }

        };

        clientThread.start();

    }



    //连接时的具体参数设置

    private void connectServer() {

        synchronized (NettyClient.this) {

            ChannelFuture channelFuture = null;//连接管理对象

            if (!isConnect) {

                isConnecting = true;

                group = new NioEventLoopGroup();//设置的连接group

                Bootstrap bootstrap = new Bootstrap();

                bootstrap.group(group)//设置的一系列连接参数操作等

                        .channel(NioSocketChannel.class)

                        .handler(new NettyClientHandler(listener));

                try {

                    //连接监听

                    channelFuture = bootstrap.connect(Constans.HOST, Constans.TCP_PORT).addListener(new ChannelFutureListener() {

                        @Override

                        public void operationComplete(ChannelFuture channelFuture) throws Exception {

                            if (channelFuture.isSuccess()) {

                                isConnect = true;

                                channel = channelFuture.channel();

                            } else {

                                EventBus.getDefault().post(new MainMsg("连接失败"));

                                Log.e(TAG, "连接失败");

                                isConnect = false;

                            }

                            isConnecting = false;

                        }

                    }).sync();

                    // 等待连接关闭

                    channelFuture.channel().closeFuture().sync();

                    Log.e(TAG, " 断开连接");

                } catch (Exception e) {

                    Log.e(TAG, "e:" + e.toString());

                    e.printStackTrace();

                } finally {

                    isConnect = false;

                    listener.onServiceStatusConnectChanged(NettyListener.STATUS_CONNECT_CLOSED);//STATUS_CONNECT_CLOSED 这我自己定义的 接口标识

                    if (null != channelFuture) {

                        if (channelFuture.channel() != null && channelFuture.channel().isOpen()) {

                            channelFuture.channel().close();

                        }

                    }

                    group.shutdownGracefully();

                    reconnect();//重新连接

                }

            }

        }

    }




public class NettyClientHandler extends ChannelInboundHandlerAdapter {



    private static final String TAG = NettyClientHandler.class.getSimpleName();

    private NettyListener listener;



    public NettyClientHandler(NettyListener listener) {

        this.listener = listener;

    }



    //每次给服务器发送的东西, 让服务器知道我们在连接中哎

    @Override

    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {

        if (evt instanceof IdleStateEvent) {

            IdleStateEvent event = (IdleStateEvent) evt;

            if (event.state() == IdleState.WRITER_IDLE) {

                ctx.channel().writeAndFlush("Heartbeat");

            }

        }

    }



    /**

     * 连接成功

     */

    @Override

    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        super.channelActive(ctx);

        listener.onServiceStatusConnectChanged(NettyListener.STATUS_CONNECT_SUCCESS);

    }



    @Override

    public void channelInactive(ChannelHandlerContext ctx) throws Exception {

        super.channelInactive(ctx);

        Log.e(TAG, "channelInactive");

    }



    //接收消息的地方, 接口调用返回到activity了

    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        listener.onMessageResponse(msg);

    }



    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

        // 当引发异常时关闭连接。

        EventBus.getDefault().post(new MainMsg("引发异常,关闭连接:" + cause.toString()));

        Log.e(TAG, "引发异常,关闭连接:" + cause.toString());

        listener.onServiceStatusConnectChanged(NettyListener.STATUS_CONNECT_ERROR);

        cause.printStackTrace();

        ctx.close();

    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值