Android 는 Netty 를 기반으로 socketClient Twing 을 제거합니다.

51108 단어
회사 프로젝트가 필요하기 때문에 고객 설비와 통신 방식이 같은 자기 설비를 실현해야 한다(예비 방안이 없어서 임시로 나를 끌어올려서 한 것이냐? 아무것도 모르겠다. 고객 설비와 연결된 사람들도 모두 어리둥절한 표정이다. 나는 나 자신에게 의지할 수밖에 없다.
인터넷에서 관련 데모와jar 패키지를 찾아 Netty로 구덩이를 메우는 길을 열었다.
Jar 패키지 다운로드 경로: 다운로드 주소는 물론 이 점수가 좀 높습니다. 이것은 제가 인터넷에서 찾은 것입니다.점수가 없으면 댓글이나 메일로 보내주세요([email protected])
사용 및 겪는 문제에 관하여: 1. 코딩 문제에 주의한다.코딩 문제에 주의하고 코딩 문제에 반드시 주의해야 한다.
데이터 전송 코딩 문제에 관해서는 반드시 서버에 따라 실현해야 한다는 것을 주의해야 한다.그렇지 않으면 서버의 데이터를 받을 수 있지만 보내는 데이터는 서버가 받지 못하거나 서버가 클라이언트가 보내는 데이터를 받을 수 있지만 클라이언트는 아무런 메시지도 받지 못한다.
2. 다음 코드는 인터넷에서 한 작은 형의 코드를 참고하여 만든 것이다.웹 주소를 저장하지 않았기 때문에 링크를 첨부할 수 없습니다. 대단히 죄송합니다.
실현 부분
NettyListener 는 가상 인터페이스의 상수를 정의하는 데 사용됩니다.
package com.example.lijinyi.*.*.api.socketApi;

/**
 * author : lijinyi
 * e-mail : [email protected]
 * date   : 2019/9/2516:11
 * desc   :
 * version: 1.0
 */
public interface NettyListener {
    byte STATUS_CONNECT_SUCCESS = 1;//    

    byte STATUS_CONNECT_CLOSED = 0;//    

    byte STATUS_CONNECT_ERROR = 0;//    

    int STATUS_SUCCESS = 0;

    int STATUS_ERROR = 1;

    //     
    int ADD_LIB = 1;
    int CHG_LIB = 2;
    int DEL_LIB = 3;

    //    
    int ADD_FACE = 4;
    int CHG_FACE = 5;
    int DEL_FACE = 6;

    /**
     *         
     */
    void onMessageResponse(int statusCode,Object msg);

    /**
     *             
     */
    void onServiceStatusConnectChanged(int statusCode);

}

NettyClient 코드는 인터럽트 재연결과 심장 박동을 실현했다
package com.example.lijinyi.*.*.manager;
import com.example.lijinyi.*.*.api.socketApi.NettyListener;



/**
 * author : lijinyi
 * e-mail : [email protected]
 * date   : 2019/9/2516:12
 * desc   :
 * version: 1.0
 */
public class NettyClient {

    private static final String TAG = "NettyClient";

    private EventLoopGroup group;//Bootstrap  

    private NettyListener listener;//               

    private Channel channel;//            

    private boolean isConnect = false;//       

    private static int reconnectNum = Integer.MAX_VALUE;//         
    private boolean isNeedReconnect = true;//      
    private boolean isConnecting = false;//      
    private long reconnectIntervalTime = 5000;//     

    public String host;//ip
    public int tcp_port;//  

    /*
         ip   
    */
    public NettyClient(String host, int tcp_port) {
        this.host = host;
        this.tcp_port = tcp_port;
    }

    /*
       
    */
    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().group(group)//             
                        .option(ChannelOption.TCP_NODELAY, true)//  Nagle    
                        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
                        .channel(NioSocketChannel.class)
                        .handler(new ChannelInitializer<SocketChannel>() { // 5
                            @Override
                            public void initChannel(SocketChannel ch) throws Exception {
									
								//                 。
			
                                ch.pipeline().addLast(new StringDecoder());//           
                                ch.pipeline().addLast(new StringEncoder());
                                ch.pipeline().addLast(new ReadTimeoutHandler(60));//      
                                ch.pipeline().addLast(new HttpRequestEncoder());//        httpRequest    
                                ch.pipeline().addLast(new HttpResponseDecoder());//             httpresopnse  
                                ch.pipeline().addLast(new HttpRequestDecoder());
                                ch.pipeline().addLast(new HttpResponseEncoder());

                                ch.pipeline().addLast(new NettyClientHandler(listener));//   handlerAdapter
                            }
                        });

                try {
                    //    
                    channelFuture = bootstrap.connect(host, tcp_port).addListener(new ChannelFutureListener() {
                        @Override
                        public void operationComplete(ChannelFuture channelFuture) throws Exception {
                            if (channelFuture.isSuccess()) {
                                Log.e(TAG, "    ");
                                isConnect = true;
                                channel = channelFuture.channel();
                            } else {
                                Log.e(TAG, "    ");
                                isConnect = false;
                            }
                            isConnecting = false;
                        }
                    }).sync();

                    //       
                    channelFuture.channel().closeFuture().sync();
                    Log.e(TAG, "     ");
                } catch (Exception e) {
                    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 void disconnect() {
        Log.e(TAG, "disconnect");
        isNeedReconnect = false;
        group.shutdownGracefully();
    }

    //    
    public void reconnect() {
        Log.e(TAG, "reconnect");
        if (isNeedReconnect && reconnectNum > 0 && !isConnect) {
            reconnectNum--;
            SystemClock.sleep(reconnectIntervalTime);
            if (isNeedReconnect && reconnectNum > 0 && !isConnect) {
                Log.e(TAG, "    ");
                connectServer();
            }
        }
    }

    //        。
    public boolean sendMsgHeartToServer(String data, String sUri, ChannelFutureListener listener) {
        boolean flag = channel != null && isConnect;
        try {
            if (flag) {

                URI uri = new URI(sUri);
                ByteBuf byteBuf = Unpooled.wrappedBuffer(data.getBytes(StandardCharsets.UTF_8));

                FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri.toASCIIString(), byteBuf);
                request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
                request.headers().set(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes());
                request.headers().set(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON);

                channel.writeAndFlush(request).addListener(listener).sync();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return flag;
    }

  

    //    
    public void setReconnectNum(int reconnectNum) {
        NettyClient.reconnectNum = reconnectNum;
    }

    public void setReconnectIntervalTime(long reconnectIntervalTime) {
        this.reconnectIntervalTime = reconnectIntervalTime;
    }

    //       
    public boolean getConnectStatus() {
        return isConnect;
    }

    public boolean isConnecting() {
        return isConnecting;
    }

    public void setConnectStatus(boolean status) {
        this.isConnect = status;
    }

    public void setListener(NettyListener listener) {
        this.listener = listener;
    }

}

이 부분의 코드는 실제적으로 하나의 라인을 시작해서 socket 운행을 실현하고 심장 박동을 통해 발송의 성공 여부를 판단하여 표지 위치를 설정하여 끊어진 라인의 재연결 효과를 실현한다.
NettyClientHandler 관련 코드
package com.example.lijinyi.*.*.manager;

/**
 * author : lijinyi
 * e-mail : [email protected]
 * date   : 2019/9/2516:23
 * desc   :
 * version: 1.0
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
    private static final String TAG = "NettyClientHandler";
    private NettyListener listener;

    //     
    private LibInfoDao libManagerDao = null;
    private FaceInfoDao faceManagerDao = null;
    private FaceEnvironment environment = null;
    private JSONObject object;
    private int statuCode = -1;
    private String strStatu = "";

    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" + System.getProperty("line.separator"));
            }
        }
    }

    /**
     *     
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        Log.e(TAG, "channelActive");
        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 {
        //                。
        System.out.println("               " + " " + msg.toString());
        
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        //           。
        Log.e(TAG, "exceptionCaught");
        listener.onServiceStatusConnectChanged(NettyListener.STATUS_CONNECT_ERROR);
        cause.printStackTrace();
        ctx.close();
    }

}


전체 Netty 구현 클라이언트의 주요 주의점은 코딩 문제입니다. channel Read () 는 데이터를 수신하고 write AndFlush () 는 데이터를 발송합니다.다른 것도 신경 쓸 게 없어요.
그럼 이렇게 됐어, 파이팅~
ヾ(◍°∇°◍)ノ゙

좋은 웹페이지 즐겨찾기