Netty学习:搭建一个简单的Netty服务
Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。Netty大大简化了网络程序的开发过程比如TCP和UDP的 Socket的开发。Netty 已逐渐成为 Java NIO 编程的首选框架。
项目官方地址:http://netty.io/index.html
一. Netty 的优点:
- API 使用简单,开发门槛低;
- 功能强大,预置了多种编解码功能,支持多种主流协议;
- 定制能力强,可以通过 ChannelHandler 对通信框架进行灵活的扩展;
- 性能高,通过与其它业界主流的 NIO 框架对比,Netty 的综合性能最优;
- 社区活跃,版本迭代周期短,发现的 BUG 可以被及时修复,同时,更多的新功能会被加入;
- 经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它完全满足不同行业的商用标准。
二. 搭建Netty服务:
- 添加pom依赖
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.0.Final</version> </dependency>
- SimpleServer(服务端)
package com.yingjun.netty.server; 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; /** * * Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输, * 例如http协议中,就是通过HttpRequestDecoder对ByteBuf数据流进行处理,转换成http的对象。 * */ public class SimpleServer { private int port; public SimpleServer(int port) { this.port = port; } public void run() throws Exception { //EventLoopGroup是用来处理IO操作的多线程事件循环器 //bossGroup 用来接收进来的连接 EventLoopGroup bossGroup = new NioEventLoopGroup(); //workerGroup 用来处理已经被接收的连接 EventLoopGroup workerGroup = new NioEventLoopGroup(); try { //启动 NIO 服务的辅助启动类 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) //配置 Channel .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { // 注册handler ch.pipeline().addLast(new SimpleServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) .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 { new SimpleServer(9999).run(); } }
- SimpleServerHandler(服务端请求处理Handler)
package com.yingjun.netty.server; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; public class SimpleServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("SimpleServerHandler.channelRead"); ByteBuf result = (ByteBuf) msg; byte[] result1 = new byte[result.readableBytes()]; // msg中存储的是ByteBuf类型的数据,把数据读取到byte[]中 result.readBytes(result1); String resultStr = new String(result1); // 接收并打印客户端的信息 System.out.println("Client said:" + resultStr); // 释放资源,这行很关键 result.release(); // 向客户端发送消息 String response = "hello client!"; // 在当前场景下,发送的数据必须转换成ByteBuf数组 ByteBuf encoded = ctx.alloc().buffer(4 * response.length()); encoded.writeBytes(response.getBytes()); ctx.write(encoded); ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // 当出现异常就关闭连接 cause.printStackTrace(); ctx.close(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } }
- SimpleServer(客户端)
package com.yingjun.netty.server; import io.netty.bootstrap.Bootstrap; 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; import io.netty.channel.socket.nio.NioSocketChannel; public class SimpleClient { public void connect(String host, int port) throws Exception { EventLoopGroup workerGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(workerGroup); b.channel(NioSocketChannel.class); b.option(ChannelOption.SO_KEEPALIVE, true); b.handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new SimpleClientHandler()); } }); // Start the client. ChannelFuture f = b.connect(host, port).sync(); // Wait until the connection is closed. f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { SimpleClient client=new SimpleClient(); client.connect("127.0.0.1", 9999); } }
- SimpleServerHandler(客户端请求处理Handler)
package com.yingjun.netty.server; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; public class SimpleClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("SimpleClientHandler.channelRead"); ByteBuf result = (ByteBuf) msg; byte[] result1 = new byte[result.readableBytes()]; result.readBytes(result1); System.out.println("Server said:" + new String(result1)); result.release(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // 当出现异常就关闭连接 cause.printStackTrace(); ctx.close(); } // 连接成功后,向server发送消息 @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { String msg = "hello Server!"; ByteBuf encoded = ctx.alloc().buffer(4 * msg.length()); encoded.writeBytes(msg.getBytes()); ctx.write(encoded); ctx.flush(); } }
- 运行结果:
SimpleClientHandler.channelRead Server said:hello client! ------------------------------------------ SimpleServerHandler.channelRead Client said:hello Server! SimpleServerHandler.channelRead Client said:hello Server!
相关推荐
- LengthFieldBasedFrameDecoder:一个预定义的解码器,可以根据数据包长度字段来自动拆包。 5. **示例代码片段**: ```java public class NettyServer { public static void main(String[] args) throws ...
Netty 是一个专门为高性能网络应用设计的异步事件驱动的网络应用程序框架,它极大地简化了Java网络编程。Netty 在解决JDK自带的NIO API使用复杂性方面表现出色,提供了一套高度封装且功能丰富的API,使得开发者可以...
综上所述,搭建一个Netty+Spring的游戏框架需要理解两个框架的核心原理,并将其特性融合到游戏服务的各个层面。通过这样的框架,可以构建出稳定、高效的网络游戏服务器。如果你对这个主题感兴趣,可以参考给定的博文...
在本项目中,"springboot+netty开发简易式游戏源码"是一个使用Spring Boot和Netty框架构建的轻量级游戏服务器的示例。这个项目结合了两个强大的技术,旨在提供一个高效、可扩展的游戏后端解决方案。下面将详细阐述...
在深入学习Netty的基础上,教程将引导读者实现一个简单的即时通讯系统,类似于微信的聊天功能。这包括用户注册登录、消息发送与接收、群组管理等多个模块。这一部分将涉及到如何使用Netty处理TCP连接,实现可靠的...
2. **Channel与Pipeline**:Netty中的Channel代表一个网络连接,负责读写数据。Pipeline(管道)则是一系列处理通道事件的处理器链,每个处理器可以对数据进行解码、编码或者执行业务逻辑。 3. **ByteBuf**:Netty...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“netty学习教程”压缩包包含了19个PDF文档,旨在全面介绍Netty的基础知识以及实际应用。以下是根据这些...
将Spring Boot与Netty结合,可以创建一个微服务,该服务能够作为MQTT代理,处理客户端的连接、订阅、发布消息等操作。项目中的代码可能包括以下几个关键部分: 1. MQTT服务器端点配置:使用Netty构建MQTT服务器,...
在"服务端Netty搭建"这个主题中,我们将深入探讨如何利用Netty来创建一个能够处理文件传输和JSON格式字符串交互的服务端。 首先,Netty的核心概念是基于Reactor模式,它允许服务端同时处理多个客户端连接,而无需为...
物联网技术在近年来得到了广泛应用,尤其是在智能设备和自动化系统中,Netty作为一个高性能、异步事件驱动的网络应用框架,成为了物联网(IoT)领域的重要工具。本项目包含两个关键部分:Netty服务端和客户端,它们...
Netty是一个高性能、异步事件驱动的网络应用框架,常用于构建高效的服务器和客户端应用程序,尤其是在高并发场景下。在本示例中,我们将探讨如何使用Netty实现一个基于HTTP协议的文件服务器。 首先,我们需要理解...
总的来说,这个Netty网络编程学习文档会提供一个全面的视角来理解和应用Netty,从基础的服务器和客户端搭建,到高级的特性利用,再到实战经验分享,都是提升网络编程能力的宝贵资源。通过深入学习和实践,我们可以...
在本项目中,"Spring Boot + Netty 实现温湿度采集的展示" 是一个结合了Spring Boot微服务框架和Netty高性能网络库的系统,用于实时监控和展示环境中的温湿度数据。这样的系统通常用于物联网(IoT)场景,如智能家居、...
在构建高性能、低延迟的智能终端云端服务时,Spring Boot 和 Netty 的集成是一个非常有效的方法。本项目“springboot-netty-protobuf-master”旨在提供一个基础架构,它利用了Spring Boot的便捷性以及Netty的高效...
总的来说,这个项目提供了从零开始构建一个RTMP服务器的参考,可以帮助开发者深入理解RTMP协议以及如何利用Netty构建高性能的网络服务。通过学习和研究这个项目,开发者可以掌握网络编程、实时流媒体传输以及服务器...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨Netty 5的三个...记得参考提供的网站资源,它们将为你的Netty学习之路提供宝贵的支持。
SpringBoot以其便捷的依赖管理和自动配置功能简化了Java应用的搭建和部署,而Netty则是一个高效的异步事件驱动的网络应用框架,常用于构建服务器和客户端的通信系统。 首先,我们要理解SpringBoot的核心理念。它...
在IT行业中,网络通信是至关重要的一个环节,特别是在开发分布式系统和Web服务时。JBoss Netty是一个高性能、异步事件驱动的网络应用程序框架,它为快速开发可维护的高性能协议服务器和客户端提供了丰富的API。本篇...
在构建高性能、高并发的游戏服务器时,Netty作为一个强大的异步事件驱动的网络应用程序框架,被广泛应用。"基于Netty消息框架的Java游戏服务器"项目,旨在利用Netty的特性来设计并实现一个高效的游戏服务器。这个...
- **分布式消息队列**:基于Netty实现一个简易的消息队列系统,学习消息队列的基本原理。 #### 六、性能优化技巧 - **零拷贝技术**:避免数据在不同缓冲区之间复制,提高数据传输效率。 - **线程模型优化**:合理...