Android使用mina传输数据以及发送心跳,有重连机制

在实验室写项目时,需要使用tcp的连接以及发送心跳给后台,还需接收后台给的数据,还可以给后台发送数据

1、先去写了很多的后台发送数据来我们去编解码

public class ByteArrayCodecFactory implements ProtocolCodecFactory {
    private ByteArrayDecoder decoder;
    private ByteArrayEncoder encoder;

    public ByteArrayCodecFactory() {
        encoder = new ByteArrayEncoder();
        decoder = new ByteArrayDecoder();
    }

    @Override
    public ProtocolDecoder getDecoder(IoSession session) throws Exception {
        return decoder;
    }

    @Override
    public ProtocolEncoder getEncoder(IoSession session) throws Exception {
        return encoder;
    }

    //编码
    public class ByteArrayEncoder extends ProtocolEncoderAdapter {

        @Override
        public void encode(IoSession session, Object message, ProtocolEncoderOutput out) {
            out.write(message);
            Log.d("check send", "encode: "+message.toString());
            out.flush();
        }
    }

    private final static Charset charset = Charset.forName("UTF-8");
    // 可变的IoBuffer数据缓冲区
    private IoBuffer buff = IoBuffer.allocate(100).setAutoExpand(true);

    //解码
    public class ByteArrayDecoder extends ProtocolDecoderAdapter {
            @Override
            public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
                    throws Exception {

                while (in.hasRemaining()) {
                    byte b = in.get();
                    switch (b){
                        case '\n':
                            buff.flip();
                            byte[] bytes = new byte[buff.limit()];
                            buff.get(bytes);
                            Log.e("+++++++解码器打印+++++++:" ,new String(bytes));
                            out.write(bytes);
                            buff.clear();
                            break;
                        default:
                            buff.put(b);
                    }
                }
            }
    }

}

2、写了去捕获后台给我们发送到的数据

@Override
public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception {

    System.out.println("捕获客户端发送信息异常....:" + arg0.getId() + ";Throwable:" + arg1.getMessage());
}

@Override
public void inputClosed(IoSession arg0) throws Exception {
    arg0.closeNow();    // 不发心跳时:加上该句。有心跳时可以不用加。
}

3、写了发送心跳包的方法

@Override
public boolean isRequest(IoSession session, Object message) {
    //如果是服务器发送过来的心跳包, return true后会在 getResponse() 方法中处理心跳包.

    if (message instanceof IoBuffer) {
        iobuffermessage = (IoBuffer) message;
        b = new byte[iobuffermessage.limit()];
        iobuffermessage.get(b);
        if (iobuffermessage.remaining() == iobuffermessage.limit()) {
            b = new byte[iobuffermessage.limit()];
            iobuffermessage.get(b);
        }
        if (new String(b) == minaConfig.getHeartone()) {
            return true;
        }
    }
    else if (message instanceof byte[] && new String((byte[]) message).equals(minaConfig.getHeartone())) {
        return true;
    }
    return false;
}

/**
 * 判断是否是心跳响应包,不管是对方的,还是自己的
 */
@Override
public boolean isResponse(IoSession session, Object message) {
    //如果是客户端主动向服务器发起的心跳包, return true, 该框架会发送 getRequest() 方法返回的心跳包内容.
    if (message instanceof IoBuffer) {
        iobuffermessage = (IoBuffer) message;
        if (iobuffermessage.remaining() == iobuffermessage.limit()) {
            b = new byte[iobuffermessage.limit()];
            iobuffermessage.get(b);
        }
        if (new String(b) == minaConfig.getHearttwo()) {

            return true;
        }
        return true;


    } else if (message instanceof byte[] && new String((byte[]) message).equals(minaConfig.getHearttwo())) {
        return true;
    }

    return false;


}

4、开始去创建连接

rivate boolean createConnect() {
        if (nioSocketConnector == null) {
            nioSocketConnector = new NioSocketConnector();
        } else {
            nioSocketConnector.dispose();// 关闭原有的连接器
            nioSocketConnector = new NioSocketConnector();

        }
        if (keepAliveFilter == null) {
            keepAliveFilter = new KeepAliveFilter(new MinaKeepAliveFilter(minaConfig), IdleStatus.BOTH_IDLE, KeepAliveRequestTimeoutHandler.DEAF_SPEAKER);
            /*
             * IdleStatus参数为 READER_IDLE
             * ,及表明如果当前连接的读通道空闲的时候在指定的时间间隔getRequestInterval后发送出心跳请求,以及发出Idle事件。
             * KeepAliveRequestTimeoutHandler设置为CLOS表明, 当发出的心跳请求在规定时间内没有接受到反馈的时候则调用CLOSE方式关闭连接
             * KeepAliveRequestTimeoutHandler设置为DEAF_SPEAKER表明,不需要发心跳
             */
//            keepAliveFilter.setForwardEvent(true);// 继续调用 IoHandlerAdapter 中的 sessionIdle时间
//            keepAliveFilter.setRequestInterval(minaConfig.getHeartsendTime());// 设置心跳发送时间间隔/s
//            keepAliveFilter.setRequestTimeout(minaConfig.getHeartTimeout());// 设置心跳判断的超时时间/s
//            keepAliveFilter.setRequestTimeoutHandler(new MinaKeepAliveRequestTimeoutHandler());// 设置超时的逻辑处理类
        }
        try {
            isconnect = false;
            nioSocketConnector = new NioSocketConnector();
            nioSocketConnector.setConnectTimeoutMillis(minaConfig.getConnectTimeout());// 设置连接超时时间/ms
            nioSocketConnector.getSessionConfig().setReadBufferSize(minaConfig.getReadbufferSize());// 设置接收缓冲区大小/b
            loggingFilter = new LoggingFilter();
            loggingFilter.setExceptionCaughtLogLevel(LogLevel.DEBUG);
            loggingFilter.setMessageReceivedLogLevel(LogLevel.DEBUG);
            loggingFilter.setMessageSentLogLevel(LogLevel.DEBUG);
            loggingFilter.setSessionClosedLogLevel(LogLevel.DEBUG);
            loggingFilter.setSessionCreatedLogLevel(LogLevel.DEBUG);
            loggingFilter .setSessionIdleLogLevel(LogLevel.DEBUG);
            loggingFilter. setSessionOpenedLogLevel(LogLevel.DEBUG);
            nioSocketConnector.getFilterChain().addFirst("logger", loggingFilter);
            nioSocketConnector.getFilterChain().addFirst("codec", new ProtocolCodecFilter(new ByteArrayCodecFactory()));//添加字符过滤器
            nioSocketConnector.getFilterChain().addLast("keepalive", keepAliveFilter);
            nioSocketConnector.setHandler(new MinaClientHandler(minaConfig.getiReceived(), this));// 消息处理
//            nioSocketConnector.addListener(new MinaServiceListener());//服务监听
            connectFuture = nioSocketConnector.connect(new InetSocketAddress(minaConfig.getHost(), minaConfig.getPort()));// 创建连接
            connectFuture.awaitUninterruptibly();// 等待连接
            ioSession = connectFuture.getSession();
            isconnect = true;
            System.out.println("连接成功!");
        } catch (Exception e) {
            e.printStackTrace();
            isconnect = false;
        }
        return isconnect;
    }

    /**
     * 连接
     */
    public void connect() {
        new Thread() {
            @Override
            public void run() {
                super.run();
                int i = 1;
                System.out.println("Thread:" + Thread.currentThread().getName());
                while (!createConnect()) {
                    System.out.println("正在尝试第" + i + "次连接...");
                    try {
                        Thread.sleep(2000);
                        i++;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                checkQueue();
            }
        }.start();
    }

在这里就是连接没有建立上,一直陷入死循环,直到连接成功

5、开始进行连接

 IReceived iReceived = new IReceived() {
                        @Override
                        public void received(String str) {
                            Log.e("接收的数据", str);
                            try {
                                JSONObject jsonObject = JSONObject.parseObject(str);
                                String getResponse = jsonObject.getString("response");

                                if (jsonObject.getString("cmd").equals("imgRequest")) {
                                        Thread.sleep(1000);
                                        minaManager.send1(sendManager());

                                } else {

                                }
                            } catch (Exception e) {
                                Log.e("HomeActivity", "主界面接收数据,类型转换错误");
                            }
                        }
                    };
//                    Log.e("接收的数据", "2222222222222");
                    MinaConfig minaConfig = new MinaConfig.Builder()
                       //     .heartone_heartwo(JSON.toJSONString(map2), JSON.toJSONString(map))    去掉心跳
                            .host(RetrofitHelper.getIP(), RetrofitHelper.getMinaPort())
                            .iReceived(iReceived)
                            .create();
                    minaManager = MinaManager.getInstence(minaConfig);
                    minaManager.connect();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值