【Java】Netty中closeFuture添加监听事件示例

news2025/1/17 14:31:53

1. 需求

  • 客户端向服务端发送信息,服务端将信息打印
  • 客户端接收键盘输入到信息循环向服务端发送信息
  • 客户端接收键盘输入‘q’时关闭

2.服务端代码

import io.netty.bootstrap.ServerBootstrap;`在这里插入代码片`
import io.netty.buffer.ByteBuf;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j;
import java.nio.charset.Charset;

@Slf4j
public class Server {
    public static void main(String[] args) {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workGroup = new NioEventLoopGroup(2);
        ServerBootstrap serverBootstrap = new ServerBootstrap()
                .group(bossGroup, workGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ch.pipeline().addLast("handler1", new ChannelInboundHandlerAdapter() {
                            @Override                                         // ByteBuf
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                ByteBuf buf = (ByteBuf) msg;
                                String s = buf.toString(Charset.defaultCharset());
                                log.debug(s);
                            }
                        });

                    }
                });
        ChannelFuture channelFuture = serverBootstrap.bind(8080);
    }
}

客户端代码

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import lombok.extern.slf4j.Slf4j;
import java.net.InetSocketAddress;
import java.util.Scanner;

@Slf4j
public class Client {
    public static void main(String[] args) throws InterruptedException {
        NioEventLoopGroup group = new NioEventLoopGroup();
        ChannelFuture channelFuture = new Bootstrap()
                .group(group)
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<NioSocketChannel>() {
                    @Override // 在连接建立后被调用
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new StringEncoder());
                    }
                })
                .connect(new InetSocketAddress("localhost", 8080));
        System.out.println(channelFuture.getClass());
        Channel channel = channelFuture.sync().channel();
        log.debug("{}", channel);
        new Thread(()->{
            Scanner scanner = new Scanner(System.in);
            while (true) {
                String line = scanner.nextLine();
                if ("q".equals(line)) {
                    channel.close(); // close 异步操作 1s 之后
                    break;
                }
                channel.writeAndFlush(line);
            }
        }, "input").start();

        // 获取 CloseFuture 对象, 1) 方法1 同步处理关闭, 2) 方法2 异步处理关闭
        ChannelFuture closeFuture = channel.closeFuture();

        /*
        方法一
        log.debug("waiting close...");
        closeFuture.sync();
        log.debug("处理关闭之后的操作");
        group.shutdownGracefully();
        */

        // 方法二
        closeFuture.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                log.debug("处理关闭之后的操作");
                group.shutdownGracefully();// 优雅关闭
            }
        });
        // 方法三:拉姆达表达式简化方法二
        //closeFuture.addListener((ChannelFutureListener) future -> {
        //    log.debug("处理关闭之后的操作");
        //    group.shutdownGracefully();
        //});

    }
}

重点关注方法二
channel.closeFuture()获取处理closeFuture对象,使用其.addListener()方法添加一个ChannelFutureListener监听器,在关闭操作完成后执行相应的操作,然后调用group.shutdownGracefully()优雅地关闭事件循环组。

运行

依次运行服务端和客户端,客户端输入:
在这里插入图片描述
服务端输出:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/731692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新开普智慧校园系统RCE漏洞复现(0day)

0x01 产品简介 新开普智慧校园体系基于业务、数据双中台理念&#xff0c;建立共享开放能力平台&#xff0c;实现能力开放和服务与数据的全生命周期治理&#xff1b;基于一云多端&#xff0c;混合云服务模式&#xff0c;覆盖管理、生活、教学、科研和社会化服务全场景&#xff0…

【网络】HTTPS协议原理

目录 “加密”相关概念 为什么要加密 常见加密方式 对称加密 非对称加密 HTTPS工作过程探究 方案1-只使用对称加密 方案2-只使用非对称加密 方案3-客户端和服务端双方都使用非对称加密 方案4-非对称加密 对称加密 上述方案问题分析 方案5-证书认证 非对称加密对…

代码随想录二刷day46 | 动态规划之139.单词拆分

day46 139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i] 139.单词拆分 题目链接 解题思路&#xff1a;单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满…

原来Linux里也能打《ACM》?

本文&#xff0c;我们来介绍一下Linux中的ACM时间&#xff0c;不过呢此ACM非彼acm&#xff0c;让我们一起来看看吧 前言 我们在写Makefile的时候&#xff0c;经常会遇到make: xxx is up to date.的问题&#xff0c;很多同学都不知道是什么原因&#xff0c;本文我们就从这一点说…

如何查看某个学者近些年发表的论文

Search more papy by the author 在谷歌学术上搜索&#xff0c;输入学者的名字&#xff0c;就会出来所有的期刊&#xff0c;文章题目、发表时间、相关作者等信息。 例如&#xff0c; 在下面的网址中&#xff0c;展示了学者发表的论文详情 https://scholar.google.com/citat…

C++常用库函数 6.进程控制函数

函数名&#xff1a;exit 函数原型&#xff1a;void exit(int status)&#xff1b; 参数&#xff1a;status 退出状态。 所需头文件&#xff1a;<cstdlib> 功能&#xff1a;终止进程。函数名&#xff1a;system 函数原型&#xff1a;int system(const char*command) …

103、基于STM32单片机智能两轮双轮自平衡小车 蓝牙手机APP控制系统设计(程序+原理图+PCB源文件+硬件芯片资料等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

【网络安全带你练爬虫-100练】第10练:re的正则匹配、文件夹创建、图片下载

目录 一、目标1&#xff1a;正则匹配图片的URL 二、目标2&#xff1a;创建文件夹 三、目标3&#xff1a;保存图片到test文件夹中 四、网络安全小圈子 一、目标1&#xff1a;正则匹配图片的URL URL位置 我们可以找到img都在这个标签里面 请求方法GET 提取URL位置 需要掌握…

【算法 -- LeetCode】(12)整数转罗马数字

1、题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

【源码】vue2+element+laravel8开发不良事件上报系统源码

系统概述&#xff1a; 医院不良事件报告系统为医院内质量控制、患者安全关注、医疗安全不良事件方面的精细化的管理提供了平台&#xff0c;是等级医院评审的必备内容&#xff0c;评审要求医院直报系统要与卫生部“医疗安全(不良)事件报告系统”建立网络对接。 不良事件报告系统…

微信小程序WebView嵌入别人网页的解决办法

写在前面&#xff0c;小程序必须是热认证的企业小程序&#xff0c;个人小程序不支持WebView组建。 方法一&#xff1a; 在做微信小程序开始时&#xff0c;大家都能遇到&#xff0c;WebView组件使用的URL必须要在小程序的后台设置业务域名&#xff0c;并且在对应域名服务器根目…

hexo #01 安装

本篇主要步骤 1、前置环境2、安装 hexo3、初始化 hexo4、运行 hexo 1、前置环境 参考官网教程&#xff1a;hexo 博客系统安装前提 2、安装 hexo 这里采用官网推荐的第二种方式局部安装 hexo 包。 $ npm install hexo3、初始化 hexo 创建一个空文件夹&#xff0c;用来作为项…

mysql 数据库备份和还原

数据库备份 第一步&#xff1a;先在环境变量Path里面加上mysql bin目录的路径 第二部&#xff1a;执行对应的命令 备份数据库中的表&#xff1a; 命令&#xff1a; mysqldump -u root -p fenku_lianxi customer > d:\temp.sql root是 账号 username fenku_lianxi是数据…

科技资讯|苹果Vision Pro手部追踪和手势相关新专利曝光

近日&#xff0c;美国专利商标局正式授予苹果一项与 Apple Vision Pro 主要功能相关的专利&#xff1a;手部追踪和手指手势。 苹果专利指出&#xff0c;沉浸感的质量取决于几个重要因素。例如&#xff0c;显示器的特性&#xff0c;如图像质量、帧率、像素分辨率、高动态范围 …

MATLAB|考虑自动重合闸与分布式能源的配电网可靠性评估研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MacOS Sonoma 14.0 (23A5286g) Beta3 带 OC 0.9.3 and FirPE 双分区原版黑苹果镜像

苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta3 更新&#xff08;内部版本号&#xff1a;23A5286g&#xff09;&#xff0c;本次更新距离上次发布隔了 14 天。 一、镜像下载&#xff1a; 1.微信公众号&#xff1a;macOS Sonoma 14.0 (23A5286g) Beta3 带 OC 引导…

染色法判定二分图 — DFS深搜 +BFS宽搜

染色法判定二分图 — DFS深搜 题目描述 给定一个 n n n 个点 m m m 条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n n n 和 m m m。 接下来 m m m 行&#xff0c;每行包含两个整数 u u u 和 v v …

C++教程——继承、多态

继承 继承方式 继承中的对象模型 继承中构造和析构顺序 继承中同名成员处理方式 继承中同名静态成员处理方式 多继承语法 菱形继承 虚继承解决资源浪费的问题 底层原理 多态 多态的原理剖析 纯虚函数与抽象类 虚析构与纯虚析构 虚析构

【Linux系统编程】20.程序、进程、CPU和MMU、PCB

目录 程序 进程 CPU和MMU PCB 程序 编译好的二进制文件&#xff0c;存在磁盘上&#xff0c;只占用磁盘资源。 进程 进程是活跃的程序&#xff0c;占用系统资源&#xff0c;在内存中执行。程序运行起来&#xff0c;产生一个进程。 程序类似于剧本&#xff0c;进程类似于一场…

为何OpenAI能领先大厂开发出如ChatGPT的模型

为何OpenAI能领先大厂开发出ChatGPT的大模型&#xff1f; 信仰和环境缺一不可&#xff0c;不是因为OpenAI从0到1创造性的搞出来大模型&#xff0c;而是信仰和环境造就了ChatGPT大模型 在谈论为何中国乃至其他国家的大厂未能开发出如ChatGPT的模型时&#xff0c;我们需要强调&am…