netty初学第一个代码跑起来.............................

springboot集成netty实战 今天我们分享springboot集成netty的过程: 1、jar包依赖,Netty服务端和客户端依赖的jar包一样: <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.28.Final</version> </dependency> <!-- 序列 阅读详情

——————————————————————————————————————————————

——————————————————————————————————————————————

package com.netty.test;


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


public class DiscardServer {
    private int port;


    public DiscardServer(int port) {
        super();
        this.port = port;
    }


    public void run() throws Exception {


        /***
         * NioEventLoopGroup 是用来处理I/O操作的多线程事件循环器,
         * Netty提供了许多不同的EventLoopGroup的实现用来处理不同传输协议。 在这个例子中我们实现了一个服务端的应用,
         * 因此会有2个NioEventLoopGroup会被使用。 第一个经常被叫做‘boss’,用来接收进来的连接。
         * 第二个经常被叫做‘worker’,用来处理已经被接收的连接, 一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。
         * 如何知道多少个线程已经被使用,如何映射到已经创建的Channels上都需要依赖于EventLoopGroup的实现,
         * 并且可以通过构造函数来配置他们的关系。
         */
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        System.out.println("准备运行端口:" + port);
        try {
            /**
             * ServerBootstrap 是一个启动NIO服务的辅助启动类 你可以在这个服务中直接使用Channel
             */
            ServerBootstrap b = new ServerBootstrap();
            /**
             * 这一步是必须的,如果没有设置group将会报java.lang.IllegalStateException: group not
             * set异常
             */
            b = b.group(bossGroup, workerGroup);
            /***
             * ServerSocketChannel以NIO的selector为基础进行实现的,用来接收新的连接
             * 这里告诉Channel如何获取新的连接.
             */
            b = b.channel(NioServerSocketChannel.class);
            /***
             * 这里的事件处理类经常会被用来处理一个最近的已经接收的Channel。 ChannelInitializer是一个特殊的处理类,
             * 他的目的是帮助使用者配置一个新的Channel。
             * 也许你想通过增加一些处理类比如NettyServerHandler来配置一个新的Channel
             * 或者其对应的ChannelPipeline来实现你的网络程序。 当你的程序变的复杂时,可能你会增加更多的处理类到pipline上,
             * 然后提取这些匿名类到最顶层的类上。
             */
            b = b.childHandler(new ChannelInitializer<SocketChannel>() { // (4)
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new DiscardServerHandler());// demo1.discard
                    // ch.pipeline().addLast(new
                    // ResponseServerHandler());//demo2.echo
                    // ch.pipeline().addLast(new
                    // TimeServerHandler());//demo3.time
                }
            });
            /***
             * 你可以设置这里指定的通道实现的配置参数。 我们正在写一个TCP/IP的服务端,
             * 因此我们被允许设置socket的参数选项比如tcpNoDelay和keepAlive。
             * 请参考ChannelOption和详细的ChannelConfig实现的接口文档以此可以对ChannelOptions的有一个大概的认识。
             */
            b = b.option(ChannelOption.SO_BACKLOG, 128);
            /***
             * option()是提供给NioServerSocketChannel用来接收进来的连接。
             * childOption()是提供给由父管道ServerChannel接收到的连接,
             * 在这个例子中也是NioServerSocketChannel。
             */
            b = b.childOption(ChannelOption.SO_KEEPALIVE, true);
            /***
             * 绑定端口并启动去接收进来的连接
             */
            ChannelFuture f = b.bind(port).sync();
            /**
             * 这里会一直等待,直到socket被关闭
             */
            f.channel().closeFuture().sync();
        } finally {
            /***
             * 关闭
             */
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    //将规则跑起来
    public static void main(String[] args) throws Exception {
        int port;
        if (args.length > 0) {
            port = Integer.parseInt(args[0]);
        } 
        else {
            port = 5100;
        }
        new DiscardServer(port).run();
        System.out.println("server:run()");
    }

}

—————————————————————————————————————————————————-

——————————————————————————————————————————————————

package com.netty.test;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;


public class DiscardServerHandler extends ChannelHandlerAdapter {
    /**
     * 这里我们覆盖了chanelRead()事件处理方法。 每当从客户端收到新的数据时, 这个方法会在收到消息时被调用,
     * 这个例子中,收到的消息的类型是ByteBuf
     * 
     * @param ctx
     *            通道处理的上下文信息
     * @param msg
     *            接收的消息
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {


        try {
            ByteBuf in = (ByteBuf) msg;
            // 打印客户端输入,传输过来的的字符
            System.out.print(in.toString(CharsetUtil.UTF_8));
        } finally {
            /**
             * ByteBuf是一个引用计数对象,这个对象必须显示地调用release()方法来释放。
             * 请记住处理器的职责是释放所有传递到处理器的引用计数对象。
             */
            // 抛弃收到的数据
            ReferenceCountUtil.release(msg);
        }


    }


    /***
     * 这个方法会在发生异常时触发
     * 
     * @param ctx
     * @param cause
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        /**
         * exceptionCaught() 事件处理方法是当出现 Throwable 对象才会被调用,即当 Netty 由于 IO
         * 错误或者处理器在处理事件时抛出的异常时。在大部分情况下,捕获的异常应该被记录下来 并且把关联的 channel
         * 给关闭掉。然而这个方法的处理方式会在遇到不同异常的情况下有不 同的实现,比如你可能想在关闭连接之前发送一个错误码的响应消息。
         */
        // 出现异常就关闭
        cause.printStackTrace();
        ctx.close();
    }

}



IM实战之netty服务端分析 IM 架构之服务端 阅读详情

相关推荐

SpringBoot+Netty实战:5分钟搞定MQTT服务端搭建(附完整代码)

本文详细介绍了如何利用SpringBoot与Netty快速搭建一个高性能、可深度定制的MQTT服务端。通过实战代码演示了从环境配置、Netty服务端核心实现到连接管理、消息分发等关键环节,为物联网设备通信、微服务间轻量级消息传递等场景提供了稳定可靠且易于扩展的解决方案。

weixin_29218509的博客 391

Springboot集成Netty

本章具体讲解SpringBoot中如何集成Netty 1.搭建一个Springboot项目 一,服务端 1.项目结构目录 2.导入jar包 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId...

qq_37497275的博客 5289

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

Netty使用(一)

一:netty介绍 Netty是由Jboss提供的一个java 开源框架,github上独立运行的项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 二使用:添加pom文件 <!-- https://mvnrepository.com/artifact/io.netty/netty-all --> <dependency> <groupId>io.netty</groupId...

beautifulYuan的博客 2094

Uncertainty-Aware Mean Teacher(UA-MT)

本文提出了一种新的基于不确定性的半监督学习框架(UA-MT),通过额外利用未标记的数据从3D MR图像中分割左心房。具体地说,本文建立了一个教师模型和一个学生模型,学生模型通过最小化标注数据上的分割监督损失和所有输入数据上的与教师模型预测输出的一致性损失进行优化。如果没有未标记输入中的注释,教师模型的预测目标可能不可靠且有噪声。:在估计不确定性 U 的指导下,我们过滤掉相对不可靠**(高不确定性),整个体积** U 的不确定性**是 {u} ∈ RH×W ×D。过滤掉高不确定性的,也就是熵大于某个值的。

Alexa_的博客 1870

Unity3D 简单水面shader的实现

实现思路 今天来实现一个简单的水面效果。水面的话主要是以下几个效果叠加 1.水面的动态波浪效果,我们这里使用最简单的正弦波加上法线贴图来模拟。如果想要更精确的波动效果可以考虑使用Gerstner波 2.不同水深颜色不同的效果,使用该顶点深度和顶点坐标的差值来计算深度,然后映射到颜色 3.浪涌效果,还是根据顶点深度和顶点坐标的差值来计算深度,然后叠加上一层浪涌 4.折射效果,用grabpass,采样之后进行偏移,最后叠加上去。 代码实现 首先是顶点位移函数,使用正弦函数代入顶点的x坐标和z坐标来算,因为这里写

o83290102o5的博客 1万+

高性能IO框架Netty一-第一个Netty程序

目录 一、Netty简介 1、Netty是什么? 2、为什么要用Netty? 3、为什么Netty使用NIO而不是AIO? 4、为什么不用Netty5 二、HelloNetty! 1、NettyServer 2、NettyServerHandler 3、NettyClient 4、NettyClientHandler 5、程序演示 6、总结 Netty作为一个高性能I...

b379685397的博客 3万+

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 251

让初学者也能看懂的netty流程

本文是摘要文(netty服务端的启动和轮询流程)用四个版本的语言简述了netty的流程(流程图版、组件版、工作列表版、代码版)旨在帮小白快速破冰,用简短的文字感受netty的特性;

qq_43346055的博客 874

在 SAP S/4HANA 分析模型中添加 Measures,Calculated、Restricted、Currency Conversion 与 Unit Conversion 的建模思路

摘要: SAP S/4HANA分析查询建模中,度量(measure)的加工层级是关键难点,涉及聚合时机、币种/单位语义、过滤上下文等复杂因素。度量不仅是数字字段,还需处理计算口径(Calculated Measures)、上下文绑定(Restricted Measures)和单位转换等问题。Calculated Measures适合派生指标(如毛利率),需注意聚合前后计算差异;Restricted Measures通过固化过滤条件(如区分实际/计划金额)确保业务语义一致性。建模时应将业务逻辑下沉到分析模型层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1022

安卓逆向 | 某社交类APP gsid

*本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除

爬虫进击之路 3083

netty初学总结

netty初学笔记阻塞与非阻塞同步与异步BIO、NIO与AIOSpringboot整合nettypom依赖目录结构代码 阻塞与非阻塞 阻塞:阻塞是指调用结果返回之前,当前线程会被挂起。 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会显式技术阻塞当前线程 。 同步与异步 同步:在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回。 异步::异步的概念和同步相对应。当c...

qq_40351478的博客 340

Gbase 8a GDCA考试真题100%

本文整理一些Gbase 8a中非常易错得考试真题及答案,而且都是不好搜的。加粗的是正确答案。

打工之路,一路生花 4305

Netty 初学者笔记

本文非常适合小白,不适合大神。如果你不了解netty是什么东西,或者是想简单跑一下,请继续阅读。Netty 是一个,用于快速开发基于 TCP、UDP 和 WebSocket 等协议的网络服务。它是一个开源项目,主要用来构建高可扩展性和高并发的服务器和客户端应用。Netty 的核心目标是简化网络编程,同时提供灵活性和强大的性能优化。它屏蔽了底层复杂的网络通信细节(如 Socket 的读写操作、线程管理等),开发者只需关注业务逻辑。桥豆麻袋!这些概念似乎太生硬了吧?比如什么叫异步和事件驱动?

m0_64303245的博客 852

点云语义分割:RandLANet模型推理C++部署(2)

一、数据读取及预处理 二、模型推理 三、结果保存

zhaoguanhua的博客 3798

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

netty学习推荐书_从零开始学netty——第一个netty程序

说在前面的事自己学习用netty之前有很多的疑惑,这里先把自己的疑惑与答案写出来,希望可以帮到有同样疑惑的朋友。问题:netty版本的选择,3,4,5。答案:3和4的改动挺大,但是4和5的不大,现在官方给的版本是4,本来是有5的,结果下架了,但是可以在很多maven库中找到5。所有人都希望自己所学的内容生命周期长点,并不想刚学完就会废弃掉。我推荐的版本是4。跟着官方走。问题:netty的书的选择答...

weixin_34226837的博客 1186

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

netty的新手教程---适合初学者

Netty 是一个基于 NIO 的客户端/服务器框架,主要用于快速开发可伸缩的网络应用程序。总的来说,Netty 在需要高性能、高并发、可扩展性和可靠性的网络应用场景中都有着广泛的应用。它的设计初衷是为了满足现代网络应用的各种需求,因此被许多大型互联网企业和软件开发机构所采用。

热爱技术,享受生活 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

初学Netty

前面提到了NIO操作,但是其代码比较复杂,直接使用NIO去开发是比较困难的而且问题较多,比如Epoll Bug,于是就基于NIO产生了一个比较健壮的开源框架-Netty。

李永志的博客 219

初学netty

截图笔记 代码 public class NettyOioServer { public void server(int port) throws Exception { final ByteBuf buf = Unpooled.unreleasableBuffer( Unpooled.copiedBuffer("Hi!\r\n", Charset.forName("UTF-8"))); EventLoopGroup g

weixin_44521516的博客 202

Netty初学四 数据载体ByteBuf

slice() duplicate() copy():第一个方法是截取readerIndex到writeIndex之间,并且返回的ByteBuf的最大容量是原始的readableBytes(),第二个方法是把整个ByteBuf都截取出来,前两个方法的相同点是底层是与原始的ByteBuf共享,即经过返回的ByteBuf的对象调用write方法都会影响到原始的ByteBuf,但是它们维持的与原始的读写指针不同的指针,最后一个方法会直接从原始的ByteBuf中复制信息。

2201_75920541的博客 1156

Netty初学九 心跳与空闲检测

如果在一段时间内客户端没有收到服务端发来的数据包,则可以判定这个连接为假死状态,因此,服务端的Pipeline中需要再加上一个Handler,这个处理无需登录,所以一般会将这个Handler放在AuthHandler前面。连接假死的现象是:在某一端看来,底层的Tcp连接已经断开,但是应用程序没有捕获到,会认为这条连接仍然是存在的。对于服务端来说,客户端的连接如果出现假死,那么服务端将无法收到客户端的数据,反之,这个连接还是活的,服务端对于连接假死的应对策略是空闲检测。非假死状态下确实没有发送数据。

2201_75920541的博客 979

Netty实战入门详解——让你彻底记住什么是Netty(看不懂你来找我)

Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。

qq_48811377的博客 4158

【netty in action】学习笔记-第二章 编写你的第一个netty程序

【netty in action】学习笔记-第二章 编写你的第一个netty程序 这一章简单粗暴,整个章节都是讲一个例子,例子很简单,但是麻雀虽小五脏俱全。通过这个示例你会对编写基于netty的应用程序有个直观的认识。 我先上代码,后面再分析。 先看看服务端的示例, public class EchoServer { public int port; public EchoServer(int port) { this.port = port; } pub

lucasma的博客 277

Netty初学二 服务端启动流程

1.服务端启动的最小代码: 上述代码: 2.自动绑定递增端口: 上述示例中绑定了8000端口,但是,在一般情况下这个端口可能被占用,因此找一个没有被占用的端口号还是比较有概率性的,那我们如何将这件事情做到自动化呢?即我们只需要给一个起始的端口号,然后自动向上找一个可用的端口为止,以此类推。以下为实现代码: 其中serverBootstrap方法为一个异步(不会等到端口绑定完成后再继

2201_75920541的博客 945

Netty初学八 群聊消息的收发及Netty性能优化

因为上述服务端的代码,在Pipeline中,绝大部分都是与指令相关的handler,Handler越多其链越长,事件传播过程性能损耗会逐渐被放大,因为解码器decode出来的每个Packet对象都要在每隔Handler上经过一遍,因此我i们需要缩短这个事件传播路径。netty的逻辑是,每次有新连接到来的时候都会调用ChannelInitializer的initChannel()方法,与指令相关的Handler每次都会被创建一次。这样每次来一个新连接,添加Handler的时候就不需要每次都创建。

2201_75920541的博客 538

【初学与研发之NETTY】netty4之文件下载

客户端: package ai.asiainfo.transfer.client; import java.io.File; import java.io.FileOutputStream; import ai.asiainfo.util.DBTools; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf

MCpang的博客 8041
上一篇: JDK历史版本的下载
下一篇: Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0
summitjava
博客等级 码龄9年 8粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值