Netty从零到一--入门篇

Netty框架入门篇 - 初识Netty及第一款Netty应用程序 文章目录初识NettyNetty简介为什么用NettyNetty特性总结异步和事件驱动Netty核心组件简介Channel事件和ChannelHandlerChannelFutureEventLoop、EventLoopGroup总结 初识Netty Netty简介 Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。在网络编程领域,Netty是Java的卓越框架,它驾驭了Java高级API的能力,并将其隐藏在一个易于使用的API之后,通过Netty 阅读详情

开始

本章节依次讲解了Netty的核心组成部分,并包含简单的例子让你可以快速上手。在本章结束之后,你可以写出依赖Netty的客户端和服务端。

准备

如果想要运行本章节的例子,那么最少需要最新版本的Netty和1.6以上的JDK。最新的Netty请到http://netty.io/downloads.html 下载,JDK请自行下载(建议官方)
如果你对本章节中介绍的类有疑问,请查阅官方API文档。另外,如果在使用过程中有任何问题,任何建议,请告知http://netty.io/community.html

编写一个Discard服务

最简单的协议不是’Hello,world!’,而是DISCARD。DISCARD协议会将所有收到的数据丢弃,也不做任何响应(简单来说,就是什么都不做)
为了实现这个DISCARD协议,你只需要忽略所有的收到的数据就好了。让我们直接从编写一个处理Netty产生的I/O事件类开始。

public class DiscardServerHandler extends ChannelInboundHandlerAdapter{

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //DISCARD就是这样,把数据偷偷扔掉
        ((ByteBuf)msg).release();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //抛出异常时关闭链接
        cause.printStackTrace();
        ctx.close();
    }
}
  1. DiscardServerHandler继承自ChannelInboundHandlerAdapter,而ChannelInboundHandlerAdapter是ChannelInboundHandler的一个实现。ChannelInboundHandler提供了很多可以重写的方法。但是现在继承ChannelInboundHandlerAdapter就够了,不必要去实现ChannelInboundHandler。
  2. 我们重写了channelRead()这个方法。这个方法是在接收完数据时调用的,例子中接收数据的数据类型是ByteBuf。
  3. 为了实现这个DISCARD协议,方法中忽略了接收到的数据。ByteBuf 是一种引用计数的对象,并且它必须显式的用releaser()方法释放。请记住:每一个经过handler的引用计数的对象都应该由handler释放。所以,channelRead()通常以以下形式实现:
  这是示例代码
        try {
            //自己的逻辑

        }
        finally {
        //无论如何,都要释放掉。
            ReferenceCountUtil.release(msg);
        }
  1. exceptionCaught() 事件处理方法是在Netyy抛出I/O错误或者实现的handler方法上抛出异常时调用。在大多数情况,捕获的异常应该被打印出来,并且将相关的Channel关闭。但是,当你想在发生异常时做一些处理,重写这个方法会给你带来不同的思路。比如,在关闭连接前,发送错误码作为回应。

一切OK。我门已经实现了这个DISCARD服务器的第一部分,下一步就是写一个main()方法来启动一个使用DiscardServerHandler的服务器。

public class DiscardServer {
    private int port;
    public DiscardServer(int port){
        this.port = port;
    }
    public void run(){
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try{
            ServerBootstrap sb = new ServerBootstrap();
            sb.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            socketChannel.pipeline().addLast(new DiscardServerHandler());
                        }
                    })
                    .option(ChannelOption.SO_BACKLOG,128)
                    .childOption(ChannelOption.SO_KEEPALIVE,true);
            ChannelFuture f = sb.bind(port).sync();
            f.channel().closeFuture().sync();
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
    public static void main(String[] args) throws Exception {
        int port;
        if (args.length > 0) {
            port = Integer.parseInt(args[0]);
        } else {
            port = 8080;
        }
        new DiscardServer(port).run();
    }
  1. NioEventLoopGroup是一个处理I/O操作的多线程事件循环。Netty为不同类型的传输模式提供了各种EventLoopGroup实现。我门实现了一个服务器端的应用,并且,在这个例子里用到了两个NioEventLoopGroup。第一个,经常被称为“boss”,接收一个即将到达的连接。第二个,被称为“worker”,在boss接收一个连接并且在其上注册之后处理在该连接上的数据。使用多少个线程,这些线程如何映射到Channel(通道)上取决于对EventLoopGroup的具体实现,或者通过构造器配置。
  2. ServerBootstrap 是一个建立服务的帮助类。你也可以使用Channel直接建立服务。无论如何,请记住这是一个枯燥的过程,而且在大多数情况下并不需要这么做。
  3. 我们指定使用NioServerSocketChannel类,该类用于实例化一个新通道来接收传入连接。
  4. ChannelInitializer始终由新接收的Channel来评估。ChannelInitializer是为了帮助用户配置一个新的Channel而生的handler。您很可能希望通过添加一些处理程序(例如DiscardServerHandler)来配置新通道的通道管道,以实现您的网络应用程序。随着程序变得复杂,可以给pipeline加入更多的handler类,最终将这个匿名类抽取到外部类中。
  5. 你也可以在Channel实现类设置参数。现在我们正在写一个TCP/IP 服务,所以我们可以设置像tcpNoDelay 和 keepAlive这样的设置。详细的设置请参照官方文档关于ChannelOption和ChannelConfig的部分。
  6. option()是对接收连接的NioServerSocketChannel,而childOption()是用于父通道接受的通道,在本例中为NioServerSocketChannel。
  7. 剩下的是绑定到端口并启动服务器。在这里,我们绑定到机器上所有NICs(网络接口卡)的端口8080。现在可以任意多次调用bind()方法(使用不同的绑定地址)。

运行

修改DiscardServerHandler类如下所示:

public class DiscardServerHandler extends ChannelInboundHandlerAdapter{

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//  这是示例代码
//        try {
//            //DISCARD就是这样,把数据偷偷扔掉
//
//        }
//        finally {
//            ReferenceCountUtil.release(msg);
//        }
        ByteBuf in = (ByteBuf) msg;
        try {
            while (in.isReadable()) { // (1)
                System.out.print((char) in.readByte());
                System.out.flush();
            }
        } finally {
            ReferenceCountUtil.release(msg); // (2)
        }
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //抛出异常时关闭链接
        cause.printStackTrace();
        ctx.close();
    }
}

其实只是做了打印接收到的信息而已。打开浏览器,输入localhost:8080,就可以在控制台看见请求头信息了。

Netty网络编程-入门篇(一) Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化并简化了TCP和UDP套接字服务器开发等网络编程。 目前版本:4.1.36 支持: 最低Oracle JDK 1.7 支持最新的Maven JDK 9的用法: Netty可以在模块化的JDK9应用程序中作为自动模块的集合使用。模块名称遵循反向dns样式,并且由于历史原因派生自子项目名称,而不是根... 阅读详情

相关推荐

Netty框架入门篇 - 核心组件再认识

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 为什么Eventloop设计时,需要保证同一个线程才能执行任务;由于往网络上传输数据需要提供个API供业务线程进行调用,而在Netty中channel都会绑定一个Eventloop,由Eventloop对应的线程来传输数据。Netty就是为了避免业务线程与Eventloop中的线程同时写数据造成冲突,于是,就采用了这种机制,也就是业务线程需要传输数据时,必须

wzljiayou的博客 4134

DotNetty学习—— 总章(索引)

前一阵子学习了基于.net core的Socket编程。觉得很是有趣。准备深入学习一下Socket编程,听闻Java的Netty框架很是优秀。所以今天来了解一下—DotNetty 这个东西是怎么来的呢? 是.net core版的Netty。具体怎么来的请自行百度。在此不赘述!!! Netty是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一...

a1234012340a的博客 8575

netty案例,netty4.1基础入门篇一《嗨!NettyServer》

前言介绍 凡是新知识都需要有个入门的案例,一个简单的输入输出就能解除你当前遇到的所有疑惑。不要总想着先学理论后学实战。【X东方还135学理论,246学实战,800个床位不锈钢】,本案例专题主要介绍netty4.1的使用。 开发环境 1、jdk1.8【jdk1.7以下只能部分支持netty】 2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】 3...

bugstack虫洞栈 2558

Dotnetty搭建教程

DotNetty搭建教程

qq_35319925的博客 2568

netty案例,netty4.1基础入门篇零《初入JavaIO之门BIO、NIO、AIO实战练习》

前言介绍 在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共存;分别是BIO、NIO和AIO。 Java BIO[Blocking I/O] | 同步阻塞I/O模式 BIO 全称Block-IO 是一种同步且阻塞...

bugstack虫洞栈 2847

DotNetty系列二:基本使用,博文里的源代码

https://blog.youkuaiyun.com/qq_34719168/article/details/87890983,这个博文里面的项目源码。

DotNetty完全教程(二)

第一个DotNetty应用程序 准备工作 NuGet包介绍 DotNetty由九个项目构成,在NuGet中都是单独的包,可以按需引用,其中比较重要的几个是以下几个: DotNetty.Common 是公共的类库项目,包装线程池,并行任务和常用帮助类的封装 DotNetty.Transport 是DotNetty核心的实现 DotNetty.Buffers 是对内存缓冲区管理的封装 DotNett...

白话屋 1万+

在win10-wsl2(ubuntu)中安装jlink

在 官方下载linux版本的deb包拷贝到ubuntu的/home目录下(其他目录也可以),进行安装然后提示很多依赖缺失的错误,此时执行自动安装需要的依赖包再次重新安装就可以啦查看是否安装成功,输入JLink 再按下两次Table键,是否如下所示这样表示安装成功了。

yaq_30401的博客 3142

DotNetty入门指南:5分钟构建你的第一个高性能网络服务器

想要快速构建高性能的.NET网络应用?DotNetty是你的终极解决方案!这个强大的异步网络应用框架是Netty的.NET移植版本,能够帮助你轻松构建高效的TCP/UDP服务器和客户端。🎯 ## 什么是DotNetty? **DotNetty**是一个事件驱动、异步的网络应用框架,专门为.NET平台设计。它基于Java Netty的成功经验,提供了构建高性能网络服务器的完整工具集。无论是构建

gitblog_00650的博客 509

【WILEY】wiley期刊投稿详解:从revision到Accepted全流程实例讲解

注意:包括没标注修改位置的word文件和标注了修改位置的word文件。

Everyday try to become better -Kobe Bryant 1万+

JeecgBoot漏洞利用工具解析:一键getshell原理与安全加固实践

在应用安全领域,远程代码执行(RCE)和文件上传漏洞是Web系统面临的高危威胁,其核心原理在于对用户输入的控制不足或安全校验缺失。攻击者通过构造恶意请求,可绕过系统边界,在服务器上执行任意命令或上传恶意文件,从而获取系统控制权。这类漏洞的技术价值在于揭示了应用层安全防护的薄弱环节,其利用方式自动化、集成化趋势明显,极大地提升了攻击效率。在低代码开发平台等快速构建的业务系统中,此类风险尤为突出。应用场景广泛覆盖安全测试、渗透评估与应急响应。本文聚焦于JeecgBoot平台的历史高危漏洞,深入解析其SQL注入、

weixin_30787531的博客 553

Netty 从零到一学习系列之入门篇

 Netty开发使用相当的简单,且相当的灵活,开发者不用关心NIO底层的知识,只需要关心业务内容即可。Netty是通过ChannelHandler 进行扩展,开发者只需要实现 ChannelHandler,并把实现类注册到 ChannelPipline中即可。     ChannelHandler是一个接口,Netty实现了ChanneHandlerAdapter适配器,开发者可以直接继承Cha...

small_love的专栏 890

瑞数6.5逆向实战:手把手教你用RPC搞定cookie sign加密(附环境补全技巧)

本文深入解析瑞数6.5逆向实战,重点探讨如何结合环境补全与RPC调用技术来应对其动态加密机制。文章详细介绍了环境指纹采集、双重验证等核心防护原理,并提供了基于Puppeteer的RPC实现方案,手把手教你搞定cookie sign加密,附有实用的环境补全技巧与完整代码示例。

weixin_29315091的博客 1273

利用Netty,从零到一实现自己的简易实时聊天系统

从零到一实现自己的建议实时聊天, 聊天主页面收到新消息后提示并刷新最新消息,消息已读/未读状态实时变更,消息实时收与发。

Fealiy的博客 1981

LVDS系列23:Xilinx Ultrascale系ISERDESE3原语(一)

当FIFO_RD_CLK与CLKDIV对齐时,也就是Latency With Late FIFO Empty情况时,延迟比前一种情况长一个FIFO_RD_CLK时钟周期,也就是在FIFO_RD_CLK上升沿后一点,CLKDIV才成功驱动完FIFO_EMPTY的变化,于是读侧要得到FIFO_EMPTY为0的情况则要等到下一个FIFO_RD_CLK的上升沿采集时;IS_CLK_INVERTED、IS_CLK_B_INVERTED设置CLK和CLK_B是否反转,一般情况下设置0;

weixin_38828382的博客 900

手把手教你学Simulink——基于Simulink的无迹卡尔曼滤波(UKF)控制仿真建模示例

本文详细介绍了在Simulink中实现无迹卡尔曼滤波(UKF)控制倒立单摆系统的完整过程。通过对比扩展卡尔曼滤波(EKF),重点阐述了UKF在处理强非线性系统时的优势:采用无迹变换(UT)通过确定性采样捕捉非线性特性,精度可达三阶泰勒展开且无需计算雅可比矩阵。文章分步骤讲解了状态空间定义、UKF参数设计、Simulink实现方法,以及结合LQR控制器的闭环系统搭建,并通过仿真验证UKF在大角度偏移情况下具有更优的估计精度和控制性能。最后还讨论了工程实践要点和扩展方向,为非线性系统控制提供了实用解决方案。

MHD0815的博客 97

Netty-入门篇

Netty-入门篇

S1124654的博客 1396

063.CI/CD for ML:给YOLO项目装上自动化流水线

本文分享了为YOLO目标检测项目搭建CI/CD流水线的实践经验。作者通过手动调试模型导出问题的经历,意识到重复验证工作比模型改进更耗时,提出需要自动化解决方案。文章详细介绍了四阶段流水线设计:1)代码质量检查;2)快速训练验证;3)推理性能基准测试;4)模型注册部署。同时总结了环境不一致、GPU资源争抢等常见问题及解决方案,建议从简单规则开始逐步完善,强调模型版本管理的重要性。实施后不仅提高了效率,还促使团队形成更规范的开发习惯。

2603_95664987的博客 236

Netty框架学习之(一):Netty框架简介

1. 简介 官方定义为:”Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器 和客户端”,按照惯例贴上一张High Level的架构图: 纵观Java系的多种服务器/大数据框架,都离不开Netty做出的贡献,本文对Netty做一个简单的概述 2. 主要特性 Netty有很多重要的特性,主要特性如下: - 优雅的设计 - 统一...

不积跬步,无以至千里;不积小流,无以成江海! 15万+

百万 Token 压力实测:1M Context 的真实能力边界在哪里?

本文揭示了长上下文模型的性能衰减规律:1M上下文存在"容量曲线"与"质量曲线"的分歧,512K是可靠拐点。通过MRCR测试发现,不同任务类型衰减差异显著——检索任务在512K后性能下降30.6%,而生成任务仅下降5%。研究提出三阶段补偿策略:三明治注入(首尾指令强化)、语义面包屑(位置标记)、引用检查(强制溯源),可将512K-1M区间的可用性提升20%。工程实践表明,中段区域(30-70%位置)是注意力薄弱区,需要特殊处理。最终建议:关键检索任务控制在512K内,关联推理任务可扩展至

liuzhupeng的专栏 342

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

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

netty入门篇

先说好,这里所说的入门篇,并不是教你们如何入门,而是在我研读部分源码后,写了一个基本的demo,实现了客户端和服务端的交互,在放出我写的源码之前,写简单介绍下netty中的一些核心概念和核心类。 NIO模型 NIO是相对于BIO的一个概念,BIO是阻塞IO,不管进行accept、connect、read、write操作都可能导致阻塞。NIO就是大家常说的非阻塞模型,但是我感觉还是采用多路复用的思想...

jcw的博客 556

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Netty之入门篇】

二. Netty 入门 1. 概述 1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端 1.2 Netty 的作者 他

诗和远方,代码和你 318

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

netty学习(入门篇)

文章目录netty学习(入门篇)netty诞生简介netty服务器netty客户端 netty学习(入门篇) netty诞生简介 2002年之前,那时候java还没有nio的概念,没有channel,没有缓冲区,io模式是同步阻塞的,想要编写高性能的服务器几乎是不可能的,那时候基本上服务器都是由c,c++编写的,直到jdk1.4java第一次支持了nio,这个类库为java通信模式带来了翻天覆地的...

LiuRenyou的博客 584

Netty深入浅出Java网络编程学习笔记(一) Netty入门篇

本文介绍了Netty的基本概念和组件。Netty是一款Java网络编程框架,具有高性能和可扩展性。通过一个入门案例,我们了解了Netty的运行流程和组件的作用。其中包括EventLoop用于处理任务,Channel用于管理连接,Future与Promise用于处理异步操作,Handler与Pipeline用于实现数据的处理与传递,以及ByteBuf用于高效的内存操作。这些组件共同构成了Netty的核心,使其成为构建高性能网络应用程序的理想选择。

weixin_73077810的博客 1205

Netty入门(一)环境搭建及使用

本文介绍了使用Netty框架实现简单服务端程序的步骤:1. 在Eclipse中创建Maven项目并添加Netty依赖;2. 编写自定义消息处理器类HelloServerHandler,实现接收客户端消息并输出到控制台;3. 创建HelloServer类配置Netty服务器参数,包括线程组、通道初始化等;4. 使用telnet作为客户端进行测试,验证服务端能正确接收并显示客户端发送的消息。整个过程展示了Netty服务端的基本实现流程,从项目配置到代码编写再到功能测试。

ywl470812087的博客 16万+

Netty权威指南——入门篇1 Netty入门应用 备份

在开始使用Netty开发TimeServer之前,先回顾一下使用NIO进行访问端开发的步骤。1、创建ServerSocketChannel,配置为非阻塞模式。2、绑定监听,配置TCP参数。3、创建一个独立的I/O线程,用于轮询多路复用器Selector。4、创建Selector,将之前创建的ServerSocketChannel注册到Selector上,监听SelectionKye.ACCEPT。

geminigoth的博客 900
上一篇: PowerDesigner中model显示注释
下一篇: Netty从零到一之Echo和Time
howie_lu
博客等级 码龄9年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值