Netty核心原理:一、基础入门-04:NettyServer字符串解码器

news2024/12/28 10:28:22

文章目录

  • 一、前言介绍
  • 二、代码实现
    • 2.1 工程结构
    • 2.2 Netty服务端字符串解码器实现
      • 2.2.1 服务端处理器
      • 2.2.2 通道初始化
      • 2.2.3 netty服务端
    • 2.3 单元测试

一、前言介绍

💡 服务端接收数据后我们希望是一个字符串或者是一个对象类型,而不是字节码。

  • netty 中是否可以自动的把接收的 Bytebuf 数据转为 String ,不需要手动处理?
    • 答:可以在管道中添加一个 StringDecoder
  • 在网络传输过程中有半包粘包的问题,netty 能解决吗?
    • 答:netty 提供了很丰富的解码器,在正确合理的使用下就能解决半包粘包问题。
  • 常用的 String 字符串下有什么样的解码器呢?
    • 答:不仅在 String 下有处理半包粘包的解码器在处理其他的数据格式也有,其中谷歌的 protobuf 数据格式就是其中一个。对于 String 的有以下常用的三种:
      • LineBasedFrameDecoder:基于换行。
      • DelimiterBasedFrameDecoder:基于指定字符串。
      • FixedLengthFrameDecoder:基于字符串长度。

二、代码实现

2.1 工程结构

netty-1.0-04
|-src
    |-main
         |-java
             |-com.lino.netty.server
		            |-MyChannelInitializer.java
		            |-MyServerHandler.java
		            |-NettyServer.java

2.2 Netty服务端字符串解码器实现

2.2.1 服务端处理器

MyServerHandler.java

package com.lino.netty.server;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.SocketChannel;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @description: 服务端处理器
 */
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("链接报告完毕");
    }

    @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);
    }
}

2.2.2 通道初始化

MyChannelInitializer.java

package com.lino.netty.server;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import java.nio.charset.Charset;

/**
 * @description: 通道初始化
 */
public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel channel) {
        // 解码转String,注意调整自己的编码格式 GBK,UTF-8
        channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));
        // 在管道中添加接收数据实现方法
        channel.pipeline().addLast(new MyServerHandler());
    }
}
  • 添加接收数据实现方法。

2.2.3 netty服务端

NettyServer.java

package com.lino.netty.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @description: netty服务端
 */
public class NettyServer {

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

    /**
     * 开启链接
     *
     * @param port 端口
     */
    private void bind(int port) {
        // 配置服务端NIO线程组
        // NioEventLoopGroup extends MultithreadEventLoopGroup
        // Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        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 future = b.bind(port).sync();
            System.out.println("lino-learn-netty server start done.");
            future.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            childGroup.shutdownGracefully();
            parentGroup.shutdownGracefully();
        }

    }
}

2.3 单元测试

启动NettyServer

链接报告开始
链接报告信息:有一客户端链接到本服务端
链接报告IP127.0.0.1
链接报告Port7397
链接报告完毕
2023-02-17 19:36:39 接收到消息:你好,netty服务端!
2023-02-17 19:36:40 接收到消息:你好,netty服务端!
2023-02-17 19:36:40 接收到消息:你好,netty服务端!

网络调试助手

在这里插入图片描述

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

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

相关文章

数据结构与算法基础-学习-33-归并排序

目录 一、基本思想 二、算法思路 1、合并两个有序序列 2、分治法 三、算法源码 1、MergeSortTwoSortData 2、TwoWayMergeSortRecurtionSentryQueue 四、算法效率分析 五、Linux环境编译测试 六、小感慨 排序的其他相关知识点和源码分享可以参考之前的博客&#xff1a…

解决 Android 依赖冲突

解决办法 问题原因就是&#xff0c;各个模块所有的依赖&#xff08;递归&#xff09;的 jar 包最后都会加载到安卓的项目中&#xff0c;你可以选择 project 形式查看 External Libraries&#xff0c;都在这了。所以解决问题关键就是干掉冲突&#xff0c;剩下一个就行了&#xf…

将Apache服务与内网穿透结合,让您的网站可以公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…

2023年中国电影行业研究报告

第一章 行业概况 1.1 定义 电影行业是一门涉及电影制作、发行、放映和推广的综合艺术和商业活动。它结合了戏剧、音乐、舞蹈、绘画等多种艺术形式&#xff0c;通过视觉和听觉的方式向观众展示故事和情感。 电影不仅仅是一门艺术&#xff0c;更是一项复杂的商业运作。它涵盖了…

element el-input 二次封装

说明&#xff1a;为实现输入限制&#xff0c;不可输入空格&#xff0c;长度限制。 inputView.vue <template><!-- 输入框 --><el-input:type"type":placeholder"placeholder"v-model"input"input"inputChange":maxle…

短信轰炸漏洞绕过的多种方法技巧

前言&#xff1a; 在测试甲方业务或者挖 SRC 等业务的时候&#xff0c;经常碰到发送短信验证的地方&#xff0c;我们可以联想到的就是任意用户登陆、短信轰炸、任意用户修改密码等逻辑性的漏洞&#xff0c; 简单的漏洞也是需要清晰的思维分析&#xff0c;拿几个短信轰炸多个绕…

实战系列(三)| Mybatis和MybatisPlus区别,包含详细代码

目录 1. 底层框架&#xff1a;2. 代码差异&#xff1a;3. 使用差异&#xff1a;4. 案例代码分析&#xff1a;4.1 MyBatis4.2 MyBatisPlus MyBatis 和 MyBatisPlus 都是基于 MyBatis 的扩展库&#xff0c;用于简化 MyBatis 的开发。MyBatisPlus 是在 MyBatis 的基础上进行封装&a…

华为云云耀云服务器L实例评测 | 华为云云耀云服务器L实例使用教学

文章目录 前言一、登录华为云二、创建云服务器L实例三、登录云服务器L实例四、使用云服务器L实例后记 前言 华为云是中国领先的云计算服务提供商之一&#xff0c;旗下的云耀云服务器是一种高性能、高可靠性、灵活可扩展的云服务器。 下面&#xff0c;我将为大家介绍华为云云耀云…

STM32-固件打包部署

STM32-固件打包部署 Fang XS.1452512966qq.com STM32固件输出 工程上使用Keil开发STM32软件&#xff1b;在调试过程中&#xff0c;可直接编译下载&#xff1b;例如bootloader和APP&#xff0c;在调试时&#xff0c;可以直接下载2次&#xff1b;但是工程上&#xff0c;需要大…

第四章 Linux常用命令

第四章 Linux常用命令 1.Linux命令 ​ 要使用命令&#xff0c;必须先启动Shell程序。用户可以通过桌面右键打开终端&#xff0c;或使用CtrlAltT组合启动Shell&#xff0c;当然也可以从左侧dock面板上找到终端图标打开&#xff0c;打开后如下图&#xff1a; ​ Shell命令由命令…

真嘟假嘟?!这么清晰简单的字符函数和字符串函数!!!

目录​​​​​​​ 1. 字符分类函数 1.1 小练习 1.1.1 方法一 2. 字符转换函数 2.1 小练习的方法二 3. strlen的使⽤和模拟实现 3.1 注意事项 3.1.1 注意事项2的练习 3.2 strlen函数的模拟实现 3.2.1 方法一 3.2.2 方法二&#xff08;指针—指针&#xff09; 3.2.…

Unreal Engine Loop 流程

引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中&#xff0c;做了一个图。记录一下&#xff01;&#xff01; ![在这里插入图片描述](https://img-blog.csdnimg.cn/f11f7762f5dd42f9b4dd9b7455fa7a74.png#pic_center 只是记录&#xff0c;以备后用…

C++ 中 API 兼容与 ABI 兼容万字详解

文章目录 API 的生命周期兼容性级别向后兼容性向前兼容性功能兼容性源代码兼容性二进制兼容性 究竟是什么导致了二进制不兼容二进制不兼容可能导致的现象怎样维护源代码兼容添加功能修改功能弃用声明&#xff08;向后兼容&#xff09;移除功能&#xff08;向后兼容&#xff09;…

【大数据之Kafka】十、Kafka消费者工作流程

1 Kafka消费方式 &#xff08;1&#xff09;pull&#xff08;拉&#xff09;模式&#xff1a;消费者从broker中主动拉取数据。&#xff08;Kafka中使用&#xff09; 不足&#xff1a;如果Kafka中没有数据&#xff0c;消费者可能会陷入循环&#xff0c;一直返回空数据。 &#…

【性能测试】数据库优化

数据库优化 1. Oracle 1&#xff09;查询和修改数据库最大连接数 查看当前的数据库连接数: select count(*) from v$process; 数据库允许的最大连接数: select value from v$parameter where name processes; 修改数据库最大连接数: ----设置数据库最大连接数为2000 alte…

CSP 202305-2 垦田计划

直接用循环找最长天数的寻常写法只能拿15分&#xff0c;便运行超时结束了 #include <iostream> using namespace std; int main(){int n,m,k,t0;cin>>n>>m>>k;auto*datanew pair<int ,int>[n];for(int i0;i<n;i){cin>>data[i].first&g…

43.MQ—RabbitMQ

目录 一、MQ—RabbitMQ。 &#xff08;1&#xff09;同步调用与异步调用。 &#xff08;1.1&#xff09;同步调用。 &#xff08;1.2&#xff09;异步调用。 &#xff08;2&#xff09;MQ之间的区别。 &#xff08;3&#xff09;RabbitMQ学习。 &#xff08;3.1&#xf…

如何多号定时发朋友圈?

如何多号定时发圈&#xff1f; 通过定时发表朋友圈可以节省时间&#xff0c;保持账号信息更新的频率&#xff0c;在不同的适当时间进行宣传&#xff0c;让发布内容更精准的抵达目标客户&#xff0c;提高互动效果和阅读率&#xff0c;还可以防止朋友圈被折叠。 下面来看看是如何…

statistic learning outlook

supervised learning 贝叶斯估计 决策树与信息熵 信息熵 H ( D ) − ∑ i 1 n p ( X x i ) l o g ( P ( X x i ) ) − ∑ p i l o g ( p i ) H(D)-\sum_{i1}^n p(Xx_i)log(P(Xx_i))-\sum p_ilog(p_i) H(D)−∑i1n​p(Xxi​)log(P(Xxi​))−∑pi​log(pi​)&#xff0c;信…

帮助中心管理系统,人人都能用的知识管理平台

帮助中心管理系统是一种知识管理平台&#xff0c;旨在帮助企业有效组织和管理知识资源&#xff0c;使其能够为客户和员工提供快速、准确的帮助和支持。 关于帮助中心管理系统的重要特点和优势&#xff1a; 知识库管理&#xff1a; 帮助中心管理系统允许企业将知识组织和分类…