StringEncoder和StringDecoder

本文介绍了Netty框架中编解码的重要作用及其如何简化开发流程。编码将对象转化为字节数组,便于网络传输及数据存储;解码则完成相反过程。Netty通过提供通用框架和现成组件,降低了用户的开发难度。

StringEncoder和StringDecoder

 

通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。

反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。

 

从网络读取的inbound消息,需要经过解码,将二进制的数据报转换成应用层协议消息或者业务消息,才能够被上层的应用逻辑识别和处理;同理,用 户发送到网络的outbound业务消息,需要经过编码转换成二进制字节数组(对于Netty就是ByteBuf)才能够发送到网络对端。编码和解码功能 是NIO框架的有机组成部分,无论是由业务定制扩展实现,还是NIO框架内置编解码能力,该功能是必不可少的。

为了降低用户的开发难度,Netty对常用的功能和API做了装饰,以屏蔽底层的实现细节。编解码功能的定制,对于熟悉Netty底层实现的开发者 而言,直接基于ChannelHandler扩展开发,难度并不是很大。但是对于大多数初学者或者不愿意去了解底层实现细节的用户,需要提供给他们更简单 的类库和API,而不是ChannelHandler。

Netty在这方面做得非常出色,针对编解码功能,它既提供了通用的编解码框架供用户扩展,又提供了常用的编解码类库供用户直接使用。在保证定制扩展性的基础之上,尽量降低用户的开发工作量和开发门槛,提升开发效率。

@AllArgsConstructor public class NettyClient { private String host; private int port; public void connect(String api, String msg) throws InterruptedException, JsonProcessingException { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) .handler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel channel) throws Exception { ChannelPipeline p = channel.pipeline(); p.addLast(new LengthFieldBasedFrameDecoder(1024 * 1024, 0, 4, 0, 4)); p.addLast(new StringDecoder(CharsetUtil.UTF_8)); p.addLast(new LengthFieldPrepender(4)); p.addLast(new StringEncoder(CharsetUtil.UTF_8)); p.addLast(new NettyClientHandler()); } }); ObjectMapper mapper = new ObjectMapper(); Channel channel = b.connect(host, port).sync().channel(); String json = JsonUtil.toJson(new GreetRequest(api, msg)); System.out.println("request: " + json); channel.writeAndFlush(json).sync(); channel.closeFuture().sync(); } finally { group.shutdownGracefully(); } } public static void main(String[] args) throws InterruptedException, JsonProcessingException { new NettyClient("127.0.0.1", 9000).connect("greet","alice"); } } public class NettyClientHandler extends SimpleChannelInboundHandler<String> { @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception { System.out.printf("response: " + JsonUtil.toJson(s)); } } client 以及 handler的代码如上所示,哪里出了问题
最新发布
08-26
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值