转自:http://www.xiaoyaochong.net/wordpress/?p=363
我们知道,Netty使用二进制协议传输对象,那怎么通过Netty进行POJO对象传输呢?我们需要提供一种至支持对象传输的协议,这种协议依然是使用ChannelBuffer作为载体。我们要使用ChannelHandler作为编码和反编码的切入。
假设我们现在只需要读取32位整数,虽然这并不是使用ChannelBuffer的最佳场景。
首先我们需要一个传输对象的模型,这个模型将会在服务端和客户端中同时被使用。
public class UnixTime { private final int value; public UnixTime(int value) { this.value = value; } public int getValue() { return value; } @Override public String toString() { return new Date(value * 1000L).toString(); } }
首先服务端接受到客户端连接请求之后,向客户端发送当前时间。使用对象传输,就可以直接新建一个UnixTime对象来进行业务处理。TimeServerHandler核心代码如下:
@Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { UnixTime time = new UnixTime(System.currentTimeMillis() / 1000); ChannelFuture f = e.getChannel().write(time); f.addListener(ChannelFutureListener.CLOSE); }
可是,二进制传输协议并不认识UnixTime对象,怎么办呢,这个时候就需要一次编码了,这里使用一个很简单的逻辑,就是将UnixTime对象的时间值转换成Integer,以便进行二进制传输。核心代码如下:
import static org.jboss.netty.buffer.ChannelBuffers.*; public class TimeEncoder extends SimpleChannelHandler { public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) { UnixTime time = (UnixTime) e.getMessage(); ChannelBuffer buf = buffer(4); buf.writeInt(time.getValue()); Channels.write(ctx, e.getFuture(), buf); } }
跟着我们看客户端接受处理UnixTime对象,需要实现一个TimeDecoder类,这个类实现了ChannelHandler,用来接受服务端传过来的整数并将它转换成UnixTime对象。
@Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) { if (buffer.readableBytes() < 4) { return null; } return new UnixTime(buffer.readInt()); }
跟着在业务逻辑处理的ChanndlHandler就不在需要使用ChannelBuffer接受Byte字节了,可以直接拿UnixTime对象进行业务处理。
总结,这个消息虽然简单,不过已将可以引申出对复杂Java对象的传输了。如果是使用文本的方式的传输对象(明文不安全),在POJO对象上使用Jaxb,标记传输的属性,结合相关的XML框架或者JSON框架,就可以使用XML或者JSON格式,进行远程对象传输,这就是一个远程调用框架的基础了。
相关推荐
netty5 对象传输demo
用kryo序列化对象,然后集成netty通过socket进行网络传输!通过自定义长度规则解决黏包、拆包问题!数据包格式是报文头+报文体!前4个字节是报文头,保存数据长度;后面是报文体,保存数据!
在前一个资源的基础上,实现传输对象。属于入门级别。仅供学习
经过本人测试通过,少走弯路
netty案例,netty4.1中级拓展篇三《Netty传输Java对象》源码 https://mp.weixin.qq.com/s?__biz=MzIxMDAwMDAxMw==&mid=2650724806&idx=1&sn=bb986119b9cdd950e2e6d995295e7f06&scene=19#wechat_redirect
在公司做项目的时候发现用Netty进行TCP/IP通信的Netty客户端接收到的数据进制乱码,经过摸索,终于成功解决了这个鸡肋的问题
Netty IO通信框架应用实例,所有用到技术都是从Netty....3. 演示如何使用对象传输,Encoder和Decoder. 4. 演示如何接收片断的数据 本实例是本人花了一天时间研究的,希望对有所帮助,需要点小分,一起分享,一起进步。
十二个实例带你轻松掌握Netty 江成军 Netty开发网络通信系统的流程和步骤 ...Netty集成第三方编码解码框架传输POJO对象 掌握Netty的异步处理任务和定时计划任务 掌握自定义业务线程池处理长耗时业务
十二个实例带你轻松掌握Netty 江成军 Netty开发网络通信系统的流程和步骤 ...Netty集成第三方编码解码框架传输POJO对象 掌握Netty的异步处理任务和定时计划任务 掌握自定义业务线程池处理长耗时业务
netty5.0通信框架实现客户端和服务器端demo 的数据对象传输,控制的比较完美,里面包括了netty5.0通信框架jar包
本demo是基于netty3.5.2开发的在对象传输上实现的局域网聊天的一个小小socketTcp网络通信测试用例,通信是通过服务器作中转的,网上也有大神说可以通过在客户端实现服务端功能和客户端功能,这样就不用中转这一过程...
本资料是使用netty4来进行对象的传输的demo ,并对这个通信做了封装,方便用户的使用。
}第4章 传输1. 网络中传输的数据总是:字节。所有经过网络传播的对象,最终都要通过序列化/反序列化变成字节流。2. Netty支持多种序列化/反序列化。比如:
这是使用netty-4.1.25.Final编写的常用例子,代码全部可以执行,用eclipse打开,包括以下几点: 1.base64和string编解码用法 ...5.传输对象例子 6.protobuf编解码例子(和简易教程) 7.断线重连例子 8.同步调用方法
这是的数据包库(当前版本为 5.0.0.Alpha1),旨在通过网络高效传输数据。 本质上,数据对象(数据包)被定义为可以在字节表示之间进行转换。 例如,包含一个值为 8 且 id 为 99 的单个整数的数据包将被转换为: ...
消息网络传输除了JDK原生的对象序列化方式,还支持目前主流的编码解码器:kryo、hessian。 Netty网络模型采用主从Reactor线程模型,提升RPC服务器并行吞吐性能。 多线程模型采用guava线程库进行封装。 NettyRPC 1.0 ...
在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据传输流,字符串流,对象流等等等。 BIO:同步并阻塞,服务器实现一个连接一个线程,即客户端有连接请求时...
这是一个基于 Reactor 2.0 核心的 Web 框架原型,带有 Netty 和 Servlet 3.1 (TODO) 引擎。 Reactive Streams SPI 被公开(参见 ),并且提供了 Reactor 2.0(参见 )和 RxJava 1.0(参见 )API。 请参阅代码注释中...
Spring + Netty + Protostuff + ZooKeeper 实现了一个轻量级 RPC 框架,使用 Spring 提供依赖注入与参数配置,使用 Netty 实现 NIO 方式的数据传输,使用 Protostuff 实现对象序列化,使用 ZooKeeper 实现服务注册与...
的数据传输流,字符串流,对象流等等等。 比如程序从服务器上下载图片,就是通过流的方式从网络上以流的方式到程序中,在到硬盘中。 同步,一个任务的完成之前不能做其他操作,必须等待(等于在打电话) 异步,一个...