netty之NettyServer字符串编码器

news2024/11/17 23:49:06

前言


netty通信就向一个流水channel管道,我们可以在管道的中间插入一些‘挡板’为我们服务。比如字符串的编码解码,在前面我们使用new StringDecoder(Charset.forName(“GBK”))进行字符串解码,这样我们在收取数据就不需要手动处理字节码。那么本章节我们使用与之对应的new StringEncoder(Charset.forName(“GBK”))进行进行字符串编码,用以实现服务端在发送数据的时候只需要传输字符串内容即可。
在这里插入图片描述
MyChannelInitializer

public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel channel) {
        // 基于换行符号
        channel.pipeline().addLast(new LineBasedFrameDecoder(1024));
        // 解码转String,注意调整自己的编码格式GBK、UTF-8
        channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));
        // 解码转String,注意调整自己的编码格式GBK、UTF-8
        channel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));
        // 在管道中添加我们自己的接收数据实现方法
        channel.pipeline().addLast(new MyServerHandler());
    }
}

public class MyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当客户端主动链接服务端的链接后,这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        SocketChannel channel = (SocketChannel) ctx.channel();
        System.out.println("链接报告开始");
        System.out.println("链接报告信息:有一客户端链接到本服务端");
        System.out.println("链接报告IP:" + channel.localAddress().getHostString());
        System.out.println("链接报告Port:" + channel.localAddress().getPort());
        System.out.println("链接报告完毕");
        //通知客户端链接建立成功
        String str = "通知客户端链接建立成功" + " " + new Date() + " " + channel.localAddress().getHostString() + "\r\n";
        ctx.writeAndFlush(str);
    }

    /**
     * 当客户端主动断开服务端的链接后,这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端断开链接" + ctx.channel().localAddress().toString());
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //接收msg消息{与上一章节相比,此处已经不需要自己进行解码}
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 接收到消息:" + msg);
        //通知客户端链消息发送成功
        String str = "服务端收到:" + new Date() + " " + msg + "\r\n";
        ctx.writeAndFlush(str);
    }

    /**
     * 抓住异常,当发生异常的时候,可以做一些相应的处理,比如打印日志、关闭链接
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        System.out.println("异常信息:\r\n" + cause.getMessage());
    }
}

public class NettyServer {
    public static void main(String[] args) {
        new NettyServer().bing(7397);
    }

    private void bing(int port) {
        //配置服务端NIO线程组
        EventLoopGroup parentGroup = new NioEventLoopGroup(); //NioEventLoopGroup extends MultithreadEventLoopGroup Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
        EventLoopGroup childGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(parentGroup, childGroup)
                    .channel(NioServerSocketChannel.class)    //非阻塞模式
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childHandler(new MyChannelInitializer());
            ChannelFuture f = b.bind(port).sync();
            System.out.println("server start done. {关注明哥,获取源码}");
            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            childGroup.shutdownGracefully();
            parentGroup.shutdownGracefully();
        }
    }
}

启动nettyServer进行测试
在这里插入图片描述
在这里插入图片描述
好了到这里就结束了基础netty之NettyServer字符串编码器的学习,大家一定要跟着动手操作起来。需要的源码的 可si我获取;

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

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

相关文章

二叉树相关知识

目录 一.基础 1. 定义 2. 二叉树的特点 3. 二叉树的类型 (1) 满二叉树&#xff1a; (2) 完全二叉树&#xff1a; (3) 斜二叉树&#xff1a; (4) 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09; (5)平衡二叉搜索树&#xff08;Balanced Binary Se…

CSS | 面试题:你知道几种移动端适配方案?

目录 一、自适应和响应式 二、为什么要做移动端适配&#xff1f; 三、当前流行的几种适配方案 (1) 方案一&#xff1a;百分比设置&#xff08;不推荐&#xff09; (2) 方案二&#xff1a;rem 动态设置 font-size px 与 rem 的单位换算 手动换算 less/scss函数 webpac…

存储主动防御,为什么Gartner技术曲线尤为重视?

【科技明说 &#xff5c; 科技热点关注】 近来&#xff0c;从Gartner发布的2024年存储技术成熟曲线&#xff08;Hype Cycle for Storage Technologies ,2024&#xff09;的相关报告看出&#xff0c;到2028年&#xff0c;所有存储产品都将融入专注于数据主动防御的网络存储功能&…

PyCharm 社区版(2024.2.3)安装、配置、创建项目

PyCharm 社区版&#xff08;2024.2.3&#xff09;安装、配置、创建项目 本文目录&#xff1a; 零、时光宝盒 一、PyCharm简介 二、PyCharm特点和功能 三、PyCharm的安装 3.1、PyCharm的安装条件 3.2、下载PyCharm 3.3、安装PyCharm 四、配置PyCharm 4.1、PyCharm的汉化…

基础算法--递归算法【难点、重点】

今天我们即将要开始讲解算法中第一块儿难啃地骨头--递归了&#xff0c;相信有不少小伙伴都因递归而迷惑过&#xff0c;本文就来给大家详细的讲解一下递归到底是什么东西。让你也能瞬间将他打回原形。 递归的理解 在学习递归之前&#xff0c;我们先理解递归。什么是递归呢&…

【论文阅读】MRFS: Mutually Reinforcing Image Fusion and Segmentation(CVPR2024)

MRFS: Mutually Reinforcing Image Fusion and Segmentation&#xff08;CVPR2024&#xff09; 背景和动机 1.特征中和缺点和低光信息丢失。 红外和可见光图像通常在强度和梯度分布方面表现出显着差异。在这种情况下&#xff0c;传统的固定比例的无监督损失可能会削弱有价值…

NASA:ATLAS/ICESat-2 L3B 每日和每月网格极地海面高度异常 V003

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Daily and Monthly Gridded Polar Sea Surface Height Anomaly V003 ATLAS/ICESat-2 L3B 每日和每月网格极地海面高度异常 V003 简介 ATLAS/ICESat-2 L3B Daily and Monthly G…

Gamisodes在Sui上推出动画版《神探加杰特》

没错&#xff0c;大家喜爱的卡通角色《神探加杰特》将以全新可玩形式登陆Sui区块链&#xff0c;这要归功于Gamisodes。通过其独特技术&#xff0c;Gamisodes正将《神探加杰特》重新制作为互动式剧集&#xff0c;并在Sui上重现这一经典系列。 Gamisodes平台推出了真正互动的《神…

高精度四则运算专题

高精度X高精度加法、减法、乘法 高精度X普通精度 乘法 高精度X普通精度 除法 目录 高精度X高精度 加法 题目 要点 代码 高精度X高精度 减法 题目 要点 代码 高精度X普通精度 乘法 题目 要点 代码 高精度X高精度 乘法 要点 代码 高精度X普通精度 除法 题目 要点 代…

GESP C++四级样题卷

&#xff08;满分&#xff1a;100 分 考试时间&#xff1a;90 分钟&#xff09; PDF试卷及答案回复:GESPC20234 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 1.在 C中&#xff0c;指针变量的大小&#xff08;单位&#xff1a;字节&#xff09;是&#…

计算机网络-系分(5)

目录 计算机网络 DNS解析 DHCP动态主机配置协议 网络规划与设计 层次化网络设计 网络冗余设计 综合布线系统 1. 双栈技术 2. 隧道技术 3. 协议转换技术 其他网络技术 DAS&#xff08;Direct Attached Storage&#xff0c;直连存储&#xff09; NAS&#xff08;Net…

《Windows PE》3.2.4节表

节表由多个节表项&#xff08;IMAGE_SECTION_ HEADER&#xff09;组成&#xff0c;每个节表项&#xff08;40个字节&#xff09;记录了 PE中与某个特定的节有关的信息&#xff0c;如节的属性、节 的大小、在文件和内存中的起始位置等。节表中节的数量由字段IMAGE_FILE_HEADER. …

vulnhub-Matrix 1靶机

vulnhub&#xff1a;https://www.vulnhub.com/entry/matrix-1,259/ 导入靶机&#xff0c;扫描IP 靶机在192.168.81.6&#xff0c;扫描端口 存在三个端口&#xff0c;有两个都是http服务&#xff0c;访问 80端口的网页没什么信息&#xff0c;31337的网页元素里有注释 ZWNobyAi…

Raft 协议解读:简化分布式一致性

文章目录 1. 分布式系统与一致性问题1.1 什么是分布式系统1.2 一致性在分布式系统中的重要性1.3 分布式一致性挑战1.4 现有一致性协议1.5 Raft 的设计目标 2. Raft 协议的背景与介绍2.1 Raft 协议的诞生背景2.2 什么是 Raft2.3 Raft 解决的一致性问题2.4 Raft 的设计原则2.5 Pa…

Oracle 数据库安装及配置

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

PCL MLS上采样(基于法向量)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 可视化原始点云和上采样后的点云 2.1.2 MLS 上采样 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff0…

Redis-预热雪崩击穿穿透

预热雪崩穿透击穿 缓存预热 缓存雪崩 有这两种原因 redis key 永不过期or过期时间错开redis 缓存集群实现高可用 主从哨兵Redis Cluster开启redis持久化aof&#xff0c;rdb&#xff0c;尽快恢复集群 多缓存结合预防雪崩&#xff1a;本地缓存 ehcache redis 缓存服务降级&…

iPhone/iPad技巧:如何解锁锁定的 iPhone 或 iPad

“在我更新 iPhone 上的软件后&#xff0c;最近我遇到了iPhone 被锁定到所有者的消息&#xff0c;该如何解决&#xff1f;” 根据我们的研究&#xff0c;许多用户在 iOS 18 更新或恢复出厂设置后都会遇到同样的问题。只要出现问题&#xff0c;您就无法使用 iPhone 或 第 1 部分…

jenkins微服务

如果vim进去某个文件里&#xff0c;可以按键盘的向下键查阅其它部分 记得每天备份虚拟机的项目 一.在linux安装jenkins 1.上传文件 我们采用安装包的方式安装。 先用SShclient在/usr/local/下创建jenkins文件夹&#xff0c;然后向其中导入两个包 2.安装jenkins 再在控制…

「STL::queue」标准库适配器:priority_queue(优先队列)介绍|自定义比较运算(C++)

目录 概述 创建销毁 内部理解 构造析构 自定义比较 赋值重构 数据访问 内存管理 数据控制 Tips 概述 priority_queue 是一种C标准模板库STL中定义的一种序列容器&#xff0c;它允许你在运行时动态地进行堆操作。 priority_queue 可以自动管理内存&#xff0c;这意味…