-
Netty 写大型数据
写大型数据
因为网络饱和的可能性,如何在异步框架中高效地写大块的数据是一个特殊的问题。
由于写操作是非阻塞的,所以即使没有写出所有的数据,写操作也会在完成时返回并通知ChannelFuture。
当这种情况发生时,如果仍然不停地写入,就有内存耗尽的风险。
所以在写大型数据时,需要准备好处理到远程节点的连接是慢速连接的情况,这种情况会导致内存释放的延迟。
让我们考虑下将一个文件内容写...
2017-11-16 11:23:06 |
Netty
-
Netty-14-抽象编解码器
抽象的编解码器类
虽然我们一直将解码器和编码器作为单独的实体讨论,但是你有时将会发现在同一个类中管理入站和出站数据和消息的转换是很有用的。
Netty 的抽象编解码器类正好用于这个目的,因为它们每个都将捆绑一个解码器/编码器对,以处理我们一直在学习的这两种类型的操作。
正如同你可能已经猜想到的,这些类同时实现了ChannelInboundHandler 和ChannelOutbound...
2017-11-16 11:23:06 |
Netty
-
Netty-14-encoder 编码器
编码器
回顾一下我们先前的定义,编码器实现了ChannelOutboundHandler,并将出站数据从一种格式转换为另一种格式,和我们方才学习的解码器的功能正好相反。
Netty 提供了一组类,用于帮助你编写具有以下功能的编码器:
将消息编码为字节;
将消息编码为消息
抽象类 MessageToByteEncoder
我们将首先从抽象基...
2017-11-16 11:23:06 |
Netty
-
Netty-14-decoder 解码器
解码器
在这一节中,我们将研究Netty 所提供的解码器类,并提供关于何时以及如何使用它们的具体示例。
这些类覆盖了两个不同的用例:
将字节解码为消息——ByteToMessageDecoder 和 ReplayingDecoder;
将一种消息类型解码为另一种——MessageToMessageDecoder。
因为解码器是负责将入站数据...
2017-11-16 11:23:06 |
Netty
-
Netty-14-编解码器
编解码器
就像很多标准的架构模式都被各种专用框架所支持一样,常见的数据处理模式往往也是目标实现的很好的候选对象,它可以节省开发人员大量的时间和精力。
当然这也适应于本章的主题:编码和解码,或者数据从一种特定协议的格式到另一种格式的转换。这些任务将由通常称为编解码器的组件来处理。
Netty 提供了多种组件,简化了为了支持广泛的协议而创建自定义的编解码器的过程。
例如,如果你正在构建一...
2017-11-16 11:23:06 |
Netty
-
Netty-13-EmbeddedChannel 测试 ChannelHandler
在这一节中,我们将讲解如何使用EmbeddedChannel 来测试ChannelHandler。
Junit 断言
org.junit.Assert 类提供了很多用于测试的静态方法。
失败的断言将导致一个异常被抛出,并将终止当前正在执行中的测试。
导入这些断言的最高效的方式是通过一个import static 语句来实现:
import static org.junit.Asse...
2017-11-16 11:23:06 |
Netty
-
Netty-13-EmbeddedChannel 异常测试
为什么需要异常处理
有时候网络资源是比较珍贵的,可能是恶意攻击,可能是程序故障。
如果传入一个非常大的字节信息,我们一般应该直接拒绝掉这个请求,而不是消耗大量的资源去处理这个请求。
下面我们一起来写一个关于异常处理的例子。
他类似于前面的入站操作测试。
解码器与测试
入站解码器
package com.github.houbb.netty.inaction.chap09;
i...
2017-11-16 11:23:06 |
Netty
-
Netty-13-EmbeddedChannel api
概述
你已经知道,可以将ChannelPipeline 中的ChannelHandler 实现链接在一起,以构建你的应用程序的业务逻辑。
我们已经在前面解释过,这种设计支持将任何潜在的复杂处理过程分解为小的可重用的组件,每个组件都将处理一个明确定义的任务或者步骤。
在本章中,我们还将展示它是如何简化测试的。
Netty 提供了它所谓的Embedded 传输,用于测试ChannelHa...
2017-11-16 11:23:06 |
Netty