netty框架的学习

article/2025/9/21 9:31:52

netty框架的学习

    • 1.netty环境的搭建
    • 2.netty的特点
    • 2.1什么是netty
    • 2.2为什么要使用netty
    • 3.netty框架的搭建
    • 3.1创建一个maven项目
    • 3.2导入依赖
    • 3.3搭建框架

之前几天的话开始稍微熟悉了一点maven和Springboot框架,从今天开始要正式的开始学习netty框架了。

1.netty环境的搭建

要开始学习netty框架的开发的话,首先第一步就是要进行环境的搭建了,搭建netty开发环境很简单,只需要在maven项目中,导入下面这行依赖即可。

<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.16.Final</version>
</dependency>

2.netty的特点

环境搭建好了之后,我现在还不能够正式的开始写程序,因为现在我对netty可以说是完全不了解,所以我们得先去了解netty。

2.1什么是netty

Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。

2.2为什么要使用netty

Netty有很多重要的特性,主要特性如下:

  • 优雅的设计
  • 统一的API接口,支持多种传输类型,例如OIO,NIO
  • 简单而强大的线程模型
  • 丰富的文档
  • 卓越的性能
  • 拥有比原生Java API 更高的性能与更低的延迟
  • 基于池化和复用技术,使资源消耗更低
  • 安全性
  • 完整的SSL/TLS以及StartTLS支持
  • 可用于受限环境,如Applet以及OSGI

3.netty框架的搭建

3.1创建一个maven项目

因为楼主后期主要是使用Springboot框架进行程序开发,所以这儿我们就直接创建一个maven项目来搭建测试netty,具体如何创建一个maven项目我们就不进行过多的一个赘述了。

在这里插入图片描述

然后在启动类的同级目录下创建一个包,包名称可以取名叫server,在这个包下面创建三个文件夹,用于存放netty相关配置类,一个是NettyTcpServer.Java,一个是ServerChannelHandler.java,这个里面就写netty的握手相关操作,一个是ServerChannelInitial.java。

最后创建的项目结构如图所示

这里项目报错应该是开发环境的原因,具体是哪里的原因我也还没找到,但是项目内部并没有报错。

这里我是将启动类的名称改掉了的。

3.2导入依赖

我们知道maven项目是需要导入外部依赖才能够正常运行的,这儿就直接贴出pom.xml文件里面的代码

<groupId>com.example.test</groupId>
<artifactId>netty</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version><relativePath /> <!-- lookup parent from repository -->
</parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version>
</properties><dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>5.0.0.Alpha2</version><!-- <version>4.1.24.Final</version> --></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

3.3搭建框架

这是我的启动类代码

package com.example.test.netty;import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import com.example.test.netty.server.NettyTcpServer;import io.netty.channel.ChannelFuture;/*** Hello world!**/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class NettyApplication implements CommandLineRunner
{final NettyTcpServer nettyTcpServer;public NettyApplication(NettyTcpServer nettyTcpServer){this.nettyTcpServer = nettyTcpServer;}public static void main( String[] args ){SpringApplication.run(NettyApplication.class, args);}public void run(String... args) throws Exception {// TODO Auto-generated method stubChannelFuture startPLC = nettyTcpServer.start();startPLC.channel().closeFuture().syncUninterruptibly();}
}

NettyTcpServer.Java`

package com.example.test.netty.server;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;import javax.annotation.PreDestroy;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
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;
import io.netty.util.concurrent.Future;@Component
public class NettyTcpServer {private static final Logger log = LoggerFactory.getLogger(NettyTcpServer.class);//boss事件轮询线程组    用来接收进来的连接private EventLoopGroup boss = new NioEventLoopGroup(1);//worker事件轮询线程组     用来处理已经被接收的连接private EventLoopGroup worker = new NioEventLoopGroup();private Integer portPLC=8083;private Channel channel;/*** 存储client的channel* key:ip,value:Channel*/public static Map<String, Channel> map = new ConcurrentHashMap<String, Channel>();public static Map<String, Channel>  getChannes() {return map;}public ChannelFuture start() {// TODO Auto-generated method stub//启动类ServerBootstrap serverBootstrap = new ServerBootstrap();//组配置,初始化ServerBootstrap的线程组serverBootstrap.group(boss, worker)///构造channel通道工厂//bossGroup的通道,只是负责连接.channel(NioServerSocketChannel.class)//设置通道处理者ChannelHandlerworkerGroup的处理器.childHandler(new ServerChannelInitializer())//socket参数,当服务器请求处理程全满时,用于临时存放已完成三次握手请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。.option(ChannelOption.SO_BACKLOG, 1024)//启用心跳保活机制,tcp,默认2小时发一次心跳.childOption(ChannelOption.SO_KEEPALIVE, true);//Future:异步任务的生命周期,可用来获取任务结果//绑定端口,开启监听,同步等待ChannelFuture channelFuture = serverBootstrap.bind(portPLC).syncUninterruptibly();if (channelFuture != null && channelFuture.isSuccess()) {//获取通道channel = channelFuture.channel();log.info("PLC server start success, port = {}", portPLC);} else {log.error("PLC server start fail");}return channelFuture;}@PreDestroypublic void destroy() {if (channel != null) {channel.close();}try {Future<?> future = worker.shutdownGracefully().await();if (!future.isSuccess()) {log.error("PLC workerGroup shutdown fail, {}", future.cause());}Future<?> future1 = boss.shutdownGracefully().await();if (!future1.isSuccess()) {log.error("PLC bossGroup shutdown fail, {}", future1.cause());}} catch (InterruptedException e) {e.printStackTrace();}log.info("PLC server shutdown success");}}

ServerChannelHandler.java

package com.example.test.netty.server;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.channel.SimpleChannelInboundHandler;@ChannelHandler.Sharable
public  class ServerChannelHandler extends SimpleChannelInboundHandler<Object>{private static final Logger log = LoggerFactory.getLogger(ServerChannelHandler.class);@Overridepublic void channelRead(ChannelHandlerContext ctx, Object arg) throws Exception {log.info("tcp client " + ctx.channel().remoteAddress().toString() + "info:" + arg);}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {super.channelActive(ctx);log.info("tcp client " + ctx.channel().remoteAddress().toString() + " connect success");}@Overridepublic void close(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception {// TODO Auto-generated method stubsuper.close(ctx, promise);}@Overrideprotected void messageReceived(ChannelHandlerContext arg0, Object arg1) throws Exception {// TODO Auto-generated method stub}	 	
}

ServerChannelInitializer.java

package com.example.test.netty.server;import java.util.concurrent.TimeUnit;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.timeout.IdleStateHandler;public class ServerChannelInitializer extends ChannelInitializer<SocketChannel>  {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {ChannelPipeline pipeline = socketChannel.pipeline();//ByteBuf delimiter = Unpooled.copiedBuffer("\r\n".getBytes());//pipeline.addFirst(new DelimiterBasedFrameDecoder(2048*10, delimiter));//IdleStateHandler心跳机制,如果超时触发Handle中userEventTrigger()方法pipeline.addLast("idleStateHandler", new IdleStateHandler(15, 0, 0, TimeUnit.MINUTES));//字符串解码器pipeline.addLast(new StringDecoder() ,new StringEncoder());//自定义Handlerpipeline.addLast(new ServerChannelHandler());}
}

代码添加完之后运行启动类
在这里插入图片描述
控制台出现如上,说明服务端启动成功。

然后用调试工具进行客户端的测试
在这里插入图片描述
在调试工具中输入ip和端口点击打开,然后看开发工具控制台,如果有输出,就证明客户端成功连接。
在这里插入图片描述
上图就说明我这个项目客户端已经连接成功了。
然后我们再来测试一下,用客户端向服务端发送数据,看服务端能不能接收到数据。
我们在测试工具中,发送信息那一栏随便输入一点东西,然后点击发送
在这里插入图片描述
发送之后然后查看控制台有没有接收到打印出来
在这里插入图片描述
可以看到我这边控制台是打印出来了的。

这样差不多netty框架就搭建好了,在这里面就可以实现用户端与服务端之间数据的传导。如果我们以后要使用这个框架进行数据的处理的话,就可以直接在ServerChannelHandler.java里面的 channelRead和channelActive方法进行数据的处理。
在这里插入图片描述
差不多一个简单的netty框架就搭建好了。


http://chatgpt.dhexx.cn/article/hmPCYDZG.shtml

相关文章

Netty框架之责任链模式及其应用

Netty框架之概述及基本组件介绍 Reactor网络编程模型解析 前言 在上篇博客介绍完netty框架的基本组件介绍和概述&#xff0c;也跟着代码看了下NioEventLoopGroup的启动过程&#xff0c;以及基于Reactor线程模型的解析&#xff0c;它是开发Netty的核心思想&#xff0c;也是整…

【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

一.Netty是什么&#xff1f; Netty 由 Trustin Lee(韩国&#xff0c;Line 公司)2004 年开发 本质&#xff1a;网络应用程序框架 实现&#xff1a;异步、事件驱动 特性&#xff1a;高性能、可维护、快速开发 用途&#xff1a;开发服务器和客户端 Netty的性能很高&#xff0…

Netty框架实现TCP/IP通信

项目中需要使用到TCP/IP协议完成数据的发送与接收。如果只是用以前写的简单的socket套接字方法&#xff0c;每次接收发送消息都会创建新的socket再关闭socket&#xff0c;造成资源浪费。于是使用netty框架完成java网络通信。 Netty框架的内容很多&#xff0c;这里只是代码…

在SpringBoot中整合使用Netty框架

Netty是一个非常优秀的Socket框架。如果需要在SpringBoot开发的app中&#xff0c;提供Socket服务&#xff0c;那么Netty是不错的选择。 Netty与SpringBoot的整合&#xff0c;我想无非就是要整合几个地方 让netty跟springboot生命周期保持一致&#xff0c;同生共死让netty能用…

Netty框架介绍及实战

Netty框架模型 NIO 的类库和API繁杂&#xff0c;使用麻烦&#xff1a;需要熟练掌握Selector、ServerSocket、ChannelSocketChannel、 ByteBuffer等。开发工作量和难度都非常大&#xff1a; 例如客户端面临断连重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处理等…

Netty框架使用

前言 首先在使用Netty框架的时候需要了解Netty是一个什么东西。 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说&#xff0c;Netty 是一个基于NIO的…

Netty框架简介

Netty框架介绍 早已听说Netty牛逼了&#xff0c;最近有时间学习学习&#xff0c;官网地址&#xff1a;https://netty.io/&#xff0c;Java系的多种服务器/大数据框架&#xff0c;都离不开Netty做出的贡献&#xff0c;例如dubbo&#xff0c;elasticsearch等等&#xff0c;采用的…

netty框架android,隻需五步,即可基於Netty框架實現Android內網推送功能。

隻需五步,即可基於Netty框架實現Android內網推送功能。 一、先引入依賴,客戶端和服務端用的都是同一個依賴netty-all。 Android Studio中Gradle配置: compile io.netty:netty-all:5.0.0.Alpha2 IDEA中Maven配置: io.netty netty-all 5.0.0.Alpha2 二、創建消息模塊包。 目前…

Netty框架之Selector轮询器

Selector的原理详解 1.传统多线程网络通信的服务器设计2.线程池版网络通信的服务器设计Selector版网络通信的服务器设计 说到Selector的作用&#xff0c;我们不得不引入 多线程网络通信的设计 1.传统多线程网络通信的服务器设计 服务器每建立一个客户端连接Socket&#xff0c;…

netty框架学习及springboot整合集成

netty框架学习及springboot整合集成 1. Netty基本概念2. Netty框架2.1 Netty框架结构2.1 Netty NIO2.2 Reactor线程模型 3. Springboot集成netty3.1 引入jar包依赖3.2 服务端3.3 客户端 4. 参考资料 从很久以前就接触到netty&#xff0c;也在几个项目中使用netty进行网络通讯对…

Netty框架介绍

Netty框架介绍 一、netty&#xff08;通讯框架&#xff09;介紹 1、什么是netty Netty是一个基于Java NIO类库的异步通讯框架&#xff0c;他的架构特点是&#xff1a;异步非阻塞、基于事件驱动、高性能、高可靠和高定制行。 2、netty应用场景 rpc远程调用框架dubbo底层就是通…

Netty框架简述

Netty是什么&#xff1f; Netty 是一个广泛使用的 Java 网络编程框架&#xff0c;Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 的内部实现时很复杂的&#xff0c;但是 Netty 提供了简单易用的…

Netty框架的基本使用

Netty概述 为什么使用Netty 前面了解过的NIO模型&#xff0c;它有可靠性高、吞吐量高的优点&#xff0c;但也存在编程复杂的问题&#xff0c;我们要掌握大量的API&#xff0c;如&#xff1a;各种Channel、Buffer、Selector&#xff0c;还要编程处理特殊情况&#xff0c;如&am…

初识Netty框架

总体概述 Netty作为一款网络通信框架&#xff0c;底层封装了NIO。我们在使用Netty时&#xff0c;无需再关注NIO细节。下图为Netty处理流程图&#xff1a; 应用程序中使用Netty作为网络通信框架后&#xff0c;会形成一条PipeLine链&#xff0c;PipeLine链上有一个一个的事件处…

【java网络编程】netty框架

一、简介 netty是一个高性能、异步事件驱动的NIO框架&#xff0c;它基于Java Nio提供的API实现&#xff0c;提供了对TCP、UDP和文件传输的支持。 二、Reactor模型 Reactor是一种并发处理客户端请求响应的事件驱动模型。服务端在接收到客户端请求后采用多路复用策略&#xff0…

Netty学习二:Netty整体框架

一、Netty的整体结构和源码结构 1. Core层 提供底层网络通信的通用抽象和实现&#xff0c;包括可扩展的事件模型、通用的通信API和支持零拷贝的ByteBuf等。 common模块是Netty的核心基础包&#xff0c;提供丰富的工具类&#xff0c;其他模块都需要依赖该模块。常用的包括&…

Netty框架

概述 Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架&#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序。 Netty 是一个基于 NIO 的网络编程框架&#xff0c;使用 Netty 可以帮助你快速、简单的开发出一个网络应用&…

Netty框架基本介绍

NIO 1.概述&#xff1a;NIO全称java non-blocking IO &#xff0c;是指JDK1.4开始&#xff0c;java提供了一系列改进的输入/输出的新特性&#xff0c;被统称为NIO(即New IO )。新增了许多用于处理输入输出的类&#xff0c;这些类都被放在java.nio包及子包下&#xff0c;并且对j…

超详细Netty入门,看这篇就够了!

思维导图 前言 本文主要讲述Netty框架的一些特性以及重要组件&#xff0c;希望看完之后能对Netty框架有一个比较直观的感受&#xff0c;希望能帮助读者快速入门Netty&#xff0c;减少一些弯路。 一、Netty概述 官方的介绍&#xff1a; Netty is an asynchronous event-drive…

SPI通信协议详解(一)

SPI是一个同步的数据总线&#xff0c;也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。 时钟是一个振荡信号&#xff0c;它告诉接收端在确切的时机对数据线上的信号进行采样。 产生时钟的一侧称为主机&#xff0c;另一侧称为从机。总是只有一个…