netty 是 开源的基于java的网络通信框架,其中java对象的传输,netty使用的是java原生的序列化/反序列化实现的,而Kryo是性能更好的java序列化框架,能否让netty和kryo结合,实现高性能的数据通信呢?下面就是如何实现。
首先,模仿Netty自带的ObjectEncoder,写一个kryo序列化的ObjectEncoder:
import static org.jboss.netty.buffer.ChannelBuffers.dynamicBuffer; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBufferOutputStream; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneEncoder; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Output; public class ObjectKryoEncoder extends OneToOneEncoder { private static final byte[] LENGTH_PLACEHOLDER = new byte[4]; @Override protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { ChannelBufferOutputStream bout = new ChannelBufferOutputStream(dynamicBuffer( 4096, ctx.getChannel().getConfig().getBufferFactory())); bout.write(LENGTH_PLACEHOLDER); Kryo kryo = new Kryo(); Output output = new Output(bout); kryo.writeClassAndObject(output, msg); output.flush(); output.close(); ChannelBuffer encoded = bout.buffer(); encoded.setInt(0, encoded.writerIndex() - 4); return encoded; } }
接下来,模仿Netty自带的ObjectDecoder,写一个kryo序列化的ObjectDecoder:
import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBufferInputStream; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; public class ObjectKryoDecoder extends LengthFieldBasedFrameDecoder { public ObjectKryoDecoder() { this(10485760); } public ObjectKryoDecoder(int maxObjectSize) { super(maxObjectSize, 0, 4, 0, 4); } @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { ChannelBuffer frame = (ChannelBuffer) super.decode(ctx, channel, buffer); if (frame == null) { return null; } Kryo kryo = new Kryo(); Input input = null; try { input = new Input(new ChannelBufferInputStream(frame)); return kryo.readClassAndObject(input); } finally { input.close(); } } }
以上的Encoder和Decoder都是kryo序列化的版本,将其注入ChannelPipelineFactory 中即可:
ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("decoder", new ObjectKryoDecoder()); pipeline.addLast("encoder", new ObjectKryoEncoder()); pipeline.addLast("handler", new TimeClientHandler3()); return pipeline; } }); ......
相关推荐
1、基于netty+websocket+springboot的实时聊天系统项目源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...
Netty+Spring Boot仿微信 全栈开发高性能后台及客户端
springboot+netty+websocket+redis 分布式聊天,实现简单的聊天功能
springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot...
实现netty作为服务端,websocket连接成功,将channel保存到map集合,通过js发送心跳,服务端接收心跳信息并响应给客户端,当服务端断开时 客户端进行重连操作
netty+webSocket实现在线聊天
基于springboot+netty+vue构建的类似bililbili的弹幕群聊系统,个人娱乐项目,可用于前后端开发学习研究 基于springboot+netty+vue构建的类似bililbili的弹幕群聊系统,个人娱乐项目,可用于前后端开发学习研究 ...
1、基于Spring Boot 实现的WebSocket实时数据通信Demo 2、结合Netty实现多客户端之间进行网络通信 3、在Web端建立多客户端之间的通信机制
netty+thrift高并发高性能
毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+...
绍如何搭建一个准实时聊天问答程序,包括微信小程序和H5网页版。...该项目服务端主要使用了Java + Spring Boot + Netty + WebSocket等技术栈,聊天客户端使用的是UniApp来轻松搭建微信小程序和H5网页端。
基于springboot+netty+redis+hdfs实现的一个线上分布式网盘系统,毕业设计项目,个人学习,课设等均可,项目经过测试,可完美运行! 项目结构 项目主要分为一下几个模块 web-service 主要功能是页面展示,交互 ...
基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip基于springcloud+Netty+MQ+mysql的分布式...
netty案例,netty4.1中级拓展篇六《SpringBoot+Netty+Elasticsearch收集日志信息数据存储》源码 ...
NETTY+ACTIVITYMQ,NETTY+ACTIVITYMQ,NETTY+ACTIVITYMQ 基于spring集成netty的实现
netty+4G DTU
Spring+Netty+WebSocket实例,通用性还行,比较贴近生产,注释什么写的比较全
omen-1.1 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用...
springmvc+mybatis+mysql+nety+soketio实现聊天室,一对一聊天