没有合适的资源?快使用搜索试试~ 我知道了~
首页Netty实战指南:Java NIO网络应用框架
Netty实战指南:Java NIO网络应用框架
需积分: 9 3 下载量 51 浏览量
更新于2024-07-18
收藏 3.23MB PDF 举报
Netty In Action中文版是一本专注于Java NIO(New I/O)网络应用框架的实战教程。该书旨在帮助读者理解和开发高效的网络应用程序,特别适合Java网络新手和有经验的开发者进行学习和复习。Netty基于Java NIO,利用非阻塞I/O模型,提供了一种易于使用且具有高度扩展性的网络编程解决方案。 在第一章,作者首先介绍了Netty的基本概念,包括为何选择非阻塞I/O而非传统的阻塞I/O。非阻塞I/O允许应用程序在I/O操作不阻塞的情况下执行其他任务,从而提高性能和并发处理能力。章节中还深入剖析了Java NIO可能遇到的问题,如Epoll错误和内存泄露,以及Netty如何通过其内部复杂但用户友好的API,如事件驱动模型,来解决这些问题。 对于网络应用的初学者,这一章是理解网络编程基础的起点,涵盖了Java网络API的优缺点,以及如何通过Netty避免常见的问题。此外,章节还强调了异步IO的重要性,解释了为何在追求高扩展性时,使用异步编程模式能够有效应对并发请求,提高系统的吞吐量和响应速度。 通过阅读此章节,读者不仅会掌握Netty的基本架构和工作原理,还能理解异步处理机制在实际网络编程中的应用,以及如何利用Netty作为Java NIO框架来构建高性能的客户端-服务器应用。后续章节会进一步深化这些概念,并通过实例演示如何实际操作和优化Netty的使用。这是一本深入了解和实践Netty技术的实用指南。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10409343/bg10.jpg)
指定 InetSocketAddress,服务器监听此端口
设置 childHandler 执行所有的连接请求
都设置完毕了,最后调用 ServerBootstrap.bind() 方法来绑定服务器
2.3.2 实现服务器业务逻辑
Netty 使用 futures 和回调概念,它的设计允许你处理不同的事件类型,更详细的介绍
将再后面章节讲述,但是我们可以接收数据。你的 channel handler 必须继承
ChannelInboundHandlerAdapter 并且重写 channelRead 方法,这个方法在任何时候都会被
调用来接收数据,在这个例子中接收的是字节。
下面是 handler 的实现,其实现的功能是将客户端发给服务器的数据返回给客户端:
[java] view plaincopy
1. package netty.example;
2.
3. import io.netty.buffer.Unpooled;
4. import io.netty.channel.ChannelFutureListener;
5. import io.netty.channel.ChannelHandlerContext;
6. import io.netty.channel.ChannelInboundHandlerAdapter;
7.
8. public class EchoServerHandler extends ChannelInboundHandlerAdapter {
9.
10. @Override
11. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Ex
ception {
12. System.out.println("Server received: " + msg);
13. ctx.write(msg);
14. }
15.
16. @Override
17. public void channelReadComplete(ChannelHandlerContext ctx) throws Except
ion {
18. ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureLi
stener.CLOSE);
19. }
20.
21. @Override
22. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
23. cause.printStackTrace();
24. ctx.close();
25. }
26.
![](https://csdnimg.cn/release/download_crawler_static/10409343/bg11.jpg)
27. }
Netty 使用多个 Channel Handler 来达到对事件处理的分离,因为可以很容的添加、
更新、删除业务逻辑处理 handler。Handler 很简单,它的每个方法都可以被重写,它的所
有的方法中只有 channelRead 方法是必须要重写的。
2.3.3 捕获异常
重写 ChannelHandler 的 exceptionCaught 方法可以捕获服务器的异常,比如客户端
连接服务器后强制关闭,服务器会抛出"客户端主机强制关闭错误",通过重写
exceptionCaught 方法就可以处理异常,比如发生异常后关闭 ChannelHandlerContext。
2.4 编写应答程序的客户端
服务器写好了,现在来写一个客户端连接服务器。应答程序的客户端包括以下几步:
连接服务器
写数据到服务器
等待接受服务器返回相同的数据
关闭连接
2.4.1 引导客户端
引导客户端启动和引导服务器很类似,客户端需同时指定 host 和 port 来告诉客户端
连接哪个服务器。看下面代码:
[java] view plaincopy
1. package netty.example;
2.
3. import io.netty.bootstrap.Bootstrap;
4. import io.netty.channel.ChannelFuture;
5. import io.netty.channel.ChannelInitializer;
6. import io.netty.channel.EventLoopGroup;
7. import io.netty.channel.nio.NioEventLoopGroup;
8. import io.netty.channel.socket.SocketChannel;
9. import io.netty.channel.socket.nio.NioSocketChannel;
10. import io.netty.example.echo.EchoClientHandler;
11.
12. import java.net.InetSocketAddress;
13.
14. public class EchoClient {
15.
16. private final String host;
17. private final int port;
18.
![](https://csdnimg.cn/release/download_crawler_static/10409343/bg12.jpg)
19. public EchoClient(String host, int port) {
20. this.host = host;
21. this.port = port;
22. }
23.
24. public void start() throws Exception {
25. EventLoopGroup group = new NioEventLoopGroup();
26. try {
27. Bootstrap b = new Bootstrap();
28. b.group(group).channel(NioSocketChannel.class).remoteAddress(new
InetSocketAddress(host, port))
29. .handler(new ChannelInitializer<SocketChannel>() {
30. @Override
31. protected void initChannel(SocketChannel ch) throws
Exception {
32. ch.pipeline().addLast(new EchoClientHandler());
33. }
34. });
35. ChannelFuture f = b.connect().sync();
36. f.channel().closeFuture().sync();
37. } finally {
38. group.shutdownGracefully().sync();
39. }
40. }
41.
42. public static void main(String[] args) throws Exception {
43. new EchoClient("localhost", 20000).start();
44. }
45. }
创建启动一个客户端包含下面几步:
创建 Bootstrap 对象用来引导启动客户端
创建 EventLoopGroup 对象并设置到 Bootstrap 中,EventLoopGroup 可以理解为
是一个线程池,这个线程池用来处理连接、接受数据、发送数据
创建 InetSocketAddress 并设置到 Bootstrap 中,InetSocketAddress 是指定连接的
服务器地址
添加一个 ChannelHandler,客户端成功连接服务器后就会被执行
调用 Bootstrap.connect()来连接服务器
最后关闭 EventLoopGroup 来释放资源
![](https://csdnimg.cn/release/download_crawler_static/10409343/bg13.jpg)
2.4.2 实现客户端的业务逻辑
客户端的业务逻辑的实现依然很简单,更复杂的用法将在后面章节详细介绍。和编
写服务器的 ChannelHandler 一样,在这里将自定义一个继承
SimpleChannelInboundHandler 的 ChannelHandler 来处理业务;通过重写父类的三个方法
来处理感兴趣的事件:
channelActive():客户端连接服务器后被调用
channelRead0():从服务器接收到数据后调用
exceptionCaught():发生异常时被调用
实现代码如下
[java] view plaincopy
1. package netty.example;
2.
3. import io.netty.buffer.ByteBuf;
4. import io.netty.buffer.ByteBufUtil;
5. import io.netty.buffer.Unpooled;
6. import io.netty.channel.ChannelHandlerContext;
7. import io.netty.channel.SimpleChannelInboundHandler;
8. import io.netty.util.CharsetUtil;
9.
10. public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf>
{
11.
12. @Override
13. public void channelActive(ChannelHandlerContext ctx) throws Exception {
14. ctx.write(Unpooled.copiedBuffer("Netty rocks!",CharsetUtil.UTF_8));
15. }
16.
17. @Override
18. protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) thro
ws Exception {
19. System.out.println("Client received: " + ByteBufUtil.hexDump(msg.rea
dBytes(msg.readableBytes())));
20. }
21.
22. @Override
23. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
![](https://csdnimg.cn/release/download_crawler_static/10409343/bg14.jpg)
24. cause.printStackTrace();
25. ctx.close();
26. }
27. }
可能你会问为什么在这里使用的是 SimpleChannelInboundHandler 而不使用
ChannelInboundHandlerAdapter?主要原因是 ChannelInboundHandlerAdapter 在处理完
消息后需要负责释放资源。在这里将调用 ByteBuf.release()来释放资源。
SimpleChannelInboundHandler 会在完成 channelRead0 后释放消息,这是通过 Netty 处理
所有消息的 ChannelHandler 实现了 ReferenceCounted 接口达到的。
为什么在服务器中不使用 SimpleChannelInboundHandler 呢?因为服务器要返回相
同的消息给客户端,在服务器执行完成写操作之前不能释放调用读取到的消息,因为写操作
是异步的,一旦写操作完成后,Netty 中会自动释放消息。
客户端的编写完了,下面让我们来测试一下
2.5 编译和运行 echo(应答)程序客户端和服务器
注意,netty4 需要 jdk1.7+。
本人测试,可以正常运行。
2.6 总结
本章介绍了如何编写一个简单的基于 Netty 的服务器和客户端并进行通信发送数据。
介绍了如何创建服务器和客户端以及 Netty 的异常处理机制。
第三章:Netty 核心概念
在这一章我们将讨论 Netty 的 10 个核心类,清楚了解他们的结构对使用 Netty 很有用。可
能有一些不会再工作中用到,但是也有一些很常用也很核心,你会遇到。
Bootstrap or ServerBootstrap
EventLoop
EventLoopGroup
ChannelPipeline
剩余190页未读,继续阅读
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/658a8f3341524facbaedf8a653704288_yang398835.jpg!1)
yang398835
- 粉丝: 6
- 资源: 19
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 岩石滑动与断层冲击地压:声发射特征分析
- 新时代煤炭工业八大战略新取向剖析
- 开采强度对华亭矿区冲击地压危险性的影响分析
- 新安煤矿探采对比:影响安全生产的关键因素与技术支撑
- 210MW循环流化床锅炉引风机变频改造优化与节能效果
- 浅埋煤层开采沉陷预测:方法应用与影响分析
- 优化巷道过陷落柱支护方案:数值模拟与现场试验
- 坚硬顶板定向断裂爆破技术:安全高效采煤新方案
- 北航2019算法课作业解析:投资策略与凸子多边形优化
- 断层破碎带垮冒下堆积体边界抗力分布关键影响因素
- 哈拉沟选煤厂优化末煤系统提高效率与处理能力
- 瓦斯涌出影响下采动煤体蠕变失稳研究
- 提升煤矿装载效率的可控箕斗定量装载设备设计
- 水分调控下烟煤瓦斯吸附特性对比研究
- 重介质悬浮液密度控制硬件设计与选型探讨
- 坚硬顶板巷道支护参数设计:现场测试与数值分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)