Newer
Older
casic-mobile-shelter-ocean / casic-shelter / src / main / java / com / casic / missiles / socket / ChannelHandlerAdapter.java
package com.casic.missiles.socket;

import com.casic.missiles.socket.service.ISocketService;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

import java.net.InetSocketAddress;

/**
 * @author a203
 */
@Slf4j
public class ChannelHandlerAdapter extends ChannelInboundHandlerAdapter {

    private final ISocketService socketService;

    public ChannelHandlerAdapter(ISocketService socketService) {
        this.socketService = socketService;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        socketService.communicate(ctx, msg);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();//抛出异常,断开与客户端的连接
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        ctx.channel().read();
        InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
        String ip = socketAddress.getAddress().getHostAddress();
        socketService.onSocketConnected(ctx);
        log.info("channelActive ===> " + ip);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
        InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
        String ip = socketAddress.getAddress().getHostAddress();
        socketService.onSocketDisconnect();
        log.info("channelInactive ===> " + ip);
        ctx.close(); //断开连接时,必须关闭,否则造成资源浪费,并发量很大情况下可能造成宕机
    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        super.userEventTriggered(ctx, evt);
        InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
        String ip = socketAddress.getAddress().getHostAddress();
        log.info("userEventTriggered ===> " + ip);
        ctx.close();//超时时断开连接
    }
}