首页 > 其他分享 >Netty-TCP 02.客户端

Netty-TCP 02.客户端

时间:2023-06-30 20:14:16浏览次数:37  
标签:02 Netty TCP public new port channel 客户端

本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【2】部分,主要介绍客户端的实现。

模块划分

TCP简单TCP通讯(聊天)应用程序客户端主要分为三个部分:

  1. 心跳保活处理
  2. 消息消费处理
  3. TCP连接实现

心跳保活

心跳保活是目的是告诉服务端客户端是在线的,当客户端空闲时,定时给服务端发一个ping数据包(客户端-服务端双方协定)。

通过注册Netty的IdleStateHandler监听IdleState事件来实现:

/**
 * @author michong
 */
public class PingHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleState state = ((IdleStateEvent) evt).state();
            if (state == IdleState.WRITER_IDLE) {
                Packet packet = new Packet(Pkt.PING, new byte[] {0});
                ctx.channel().writeAndFlush(packet);
            }
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }
}

消息消费

消息消费是整个客户端业务处理的重心,可以根据小心的类型进行不用的业务处理,这里的实现是简单地将收到的消息打印处理:

/**
 * @author michong
 */
public class PacketHandler extends SimpleChannelInboundHandler<Packet> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Packet msg) {
        System.out.printf("收到消息:类型=%d,内容=%s\n", msg.getType(), new String(msg.getContent()));
    }
}

TCP连接

TCP连接,是客户端连接服务端的重要步骤,这里除了上面的IdleStateHandler和PingHandler、PacketHandler之外加入编解码处理器:

/**
 * @author michong
 */
public class TCPClientBootstrap {

    private final String host;
    private final int port;

    private EventLoopGroup workGroup;
    private Channel channel;

    public TCPClientBootstrap(String host, int port) {
        this.host = host;
        this.port = port;
    }

    public Channel start() throws InterruptedException {
        if (Objects.nonNull(channel)) {
            return channel;
        }

        workGroup = new NioEventLoopGroup();
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(workGroup).channel(NioSocketChannel.class).handler(new ChannelInitializer<Channel>() {
            @Override
            protected void initChannel(Channel channel) {
                ChannelPipeline pipe = channel.pipeline();
                pipe.addLast(new IdleStateHandler(0, TCPConst.IDLE_TIME_OUT_MILLISECONDS, 0, TimeUnit.MILLISECONDS));
                pipe.addLast(new PingHandler());
                pipe.addLast(new PacketDecoder());
                pipe.addLast(new PacketEncoder());
                pipe.addLast(new PacketHandler());
            }
        });
        ChannelFuture future = bootstrap.connect(host, port);
        future.sync();
        System.out.printf("客户端启动成功 => host=%s, port=%d\n", host, port);
        channel = future.channel();
        return channel;
    }

    public void stop() throws InterruptedException {
        if (Objects.nonNull(workGroup)) {
            workGroup.shutdownGracefully().sync();
        }
    }
}

标签:02,Netty,TCP,public,new,port,channel,客户端
From: https://www.cnblogs.com/michong2022/p/17517720.html

相关文章

  • Netty-TCP 03.服务端
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【3】部分,主要介绍服务端的实现。模块划分跟客户端类似,服务端也是主要分为三个部分:心跳检测处理消息消费处理TCP服务实现心跳检测服务端需要定时检测客户端是否在线(即是否发送心跳),如果没有,那么将客户端连接断开,同样......
  • Netty-TCP 04.发消息
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【4】部分,主要测试客户端和服务端的通讯。服务端下面是服务端测试代码:/***@authormichong*/publicclassTCPServer{publicstaticvoidmain(String[]args){TCPServerBootstrapbootstrap=ne......
  • 行业追踪,2023-06-30,汽车零部件依旧强势不调整
    自动复盘2023-06-30成交额超过100亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个上级的归类,这样更能体现主流方向rps有时候比较滞后,但不少是欲杨先抑,应该持续跟踪,等macd反转时参与一线红:第一次买点出现后往往是顶峰,等回调,macd反转,rps50还一直红......
  • 2023-06-30《计算方法》- 陈丽娟 - 线性方程组的迭代解法.md
    2023-06-30《计算方法》-陈丽娟-线性方程组的迭代解法Matlab计算方法JacobiGauss-SeidelSORSSOR定常迭代法所谓迭代法实际上是求解一个关于映射的不动点问题:然后利用构造一个迭代格式这里表示T的一个复合函数,其可能随迭代次数而改变,最终目标即是得到.下面我们给出收敛......
  • 2023.6.30//关于java链接SQLserver数据库报错:驱动程序无法通过使用安全套接字层(SSL)
    详情如下:驱动程序无法通过使用安全套接字层(SSL)加密与SQLServer建立安全连接。错误:“PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtorequestedtarget”。ClientConnectionId:32d1......
  • 一探究竟!天翼云2023MWC展区“亮”了!
    6月28日,2023MWC上海世界移动通信大会(简称“MWC上海”)在上海新国际博览中心启幕。中国电信开设“数智万融畅享未来”主题展区,从科技创新、安全筑防及服务赋能三大核心板块56项科数成就入手,全方位展示中国电信新技术、新产品以及新一代信息智能数字化解决方案。其中,中国电信天翼云......
  • 金域医学2023“域见杯”医检人工智能开发者大赛正式启动
    摘要:6月27日,2023“域见杯”医检人工智能开发者大赛正式启动。本文分享自华为云社区《金域医学2023“域见杯”医检人工智能开发者大赛正式启动》,作者:HWCloudAI。人工智能与大模型开发迎来“新风口”,AIGC(生成式AI)技术正在重构各行各业。为培养交叉复合型人才,构建智慧医检新范式,......
  • 都 2023 年了,你还在用 Kafka?快试试这个全新平台吧
    最近这个ApachePulsar消息中间件非常的火,号称云原生时代的下一代消息中件,今天,就一起来看看它到底有多牛逼?ApachePulsar简介ApachePulsar是一个企业级的分布式消息系统,最初由Yahoo开发并在2016年开源,目前正在Apache基金会下孵化。Plusar已经在Yahoo的生产环境使用了三年多,主要......
  • 2023年第四届机械工程与材料国际会议(ICMEM 2023)
    2023年第四届机械工程与材料国际会议(ICMEM2023)将于2023年11月2-4日在中国武汉召开。ICMEM2023由湖北省众科地质与环境技术服务中心主办,拟邀请国内外知名科学家、专家、学者和研究人员进行学术报告。★重要信息大会时间:2023年11月2-4日大会地点:中国-湖北-武汉截稿日期:2023年......
  • 会声会影2023最新六大新功能,会声会影2023序列号能用多少次
    会声会影2023版是一款非常实用的视频剪辑软件,该软件能够为广大用户带来丰富的集成化工具,并且优化了工作流程,无论你是新手还是老手都可以快速上手这款软件。会声会影2022永久激活版支持自定义码率设置,用户可以根据自己的需求设定视频画质,并且优化了分屏剪辑功能,简化多时间轴编辑的工......