05RPC - netty发送对象

简介: 05RPC - netty发送对象

Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输。

例如http协议中,就是通过HttpRequestDecoderByteBuf数据流进行处理,转换成http的对象。基于这个思路,我自定义一种通讯协议:Server和客户端直接传输java对象。

实现的原理是通过Encoder把java对象转换成ByteBuf流进行传输,通过DecoderByteBuf转换成java对象进行处理,处理逻辑如下图所示:

定义发送:EchoOutHandler

public class EchoOutHandler extends ChannelOutboundHandlerAdapter {
   @Override
      public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
          super.write(ctx, msg, promise);
      }
}

定义接收:EchoInHandler

public class EchoInHandler extends ChannelInboundHandlerAdapter {
  @Override
  public void channelRead(ChannelHandlerContext ctx, Object msg)
      throws Exception {
    System.out.println("in1");
        ctx.fireChannelRead(msg);
  }
  @Override
  public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();//刷新后才将数据发出到SocketChannel
  }
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
      throws Exception {
    cause.printStackTrace();
    ctx.close();
  }
}

调用:

public class EchoServer {
  private final int port;
  public EchoServer(int port) {
    this.port = port;
  }
  public void start() throws Exception {
    EventLoopGroup eventLoopGroup = null;
    try {
      //server端引导类
      ServerBootstrap serverBootstrap = new ServerBootstrap();
      //连接池处理数据
      eventLoopGroup = new NioEventLoopGroup();
      serverBootstrap.group(eventLoopGroup)
      .channel(NioServerSocketChannel.class)//指定通道类型为NioServerSocketChannel,一种异步模式,OIO阻塞模式为OioServerSocketChannel
      .localAddress("localhost",port)//设置InetSocketAddress让服务器监听某个端口已等待客户端连接。
      .childHandler(new ChannelInitializer<Channel>() {//设置childHandler执行所有的连接请求
        @Override
        protected void initChannel(Channel ch) throws Exception {
          ch.pipeline().addLast(new EchoInHandler());
          ch.pipeline().addLast(new EchoOutHandler()); 
        }
      });
      // 最后绑定服务器等待直到绑定完成,调用sync()方法会阻塞直到服务器完成绑定,然后服务器等待通道关闭,因为使用sync(),所以关闭操作也会被阻塞。
      ChannelFuture channelFuture = serverBootstrap.bind().sync();
      System.out.println("开始监听,端口为:" + channelFuture.channel().localAddress());
      channelFuture.channel().closeFuture().sync();
    } finally {
      eventLoopGroup.shutdownGracefully().sync();
    }
  }
  public static void main(String[] args) throws Exception {
    new EchoServer(20000).start();
  }
}


目录
相关文章
|
7月前
|
编解码 前端开发 网络协议
Netty Review - ObjectEncoder对象和ObjectDecoder对象解码器的使用与源码解读
Netty Review - ObjectEncoder对象和ObjectDecoder对象解码器的使用与源码解读
171 0
|
缓存 前端开发 Java
【Netty官方文档翻译】引用计数对象(reference counted objects)
【Netty官方文档翻译】引用计数对象(reference counted objects)
94 0
|
Java
Netty之了解 Recycler 对象回收池
Netty之了解 Recycler 对象回收池
199 0
Netty之了解 Recycler 对象回收池
|
Java 应用服务中间件 程序员
netty系列之:使用Jboss Marshalling来序列化java对象
在JAVA程序中经常会用到序列化的场景,除了JDK自身提供的Serializable之外,还有一些第三方的产品可以实现对JAVA对象的序列化。其中比较有名的就是Google protobuf。当然,也有其他的比较出名的序列化工具,比如Kryo和JBoss Marshalling。
|
XML 编解码 JSON
netty案例,netty4.1中级拓展篇三《Netty传输Java对象》
Netty在实际应用级开发中,有时候某些特定场景下会需要使用Java对象类型进行传输,但是如果使用Java本身序列化进行传输,那么对性能的损耗比较大。为此我们需要借助protostuff-core的工具包将对象以二进制形式传输并做编码解码处理。与直接使用protobuf二进制传输方式不同,这里不需要定义proto文件,而是需要实现对象类型编码解码器,用以传输自定义Java对象。
269 0
netty案例,netty4.1中级拓展篇三《Netty传输Java对象》
|
存储 算法 Java
netty系列之:netty中常用的对象编码解码器
我们在程序中除了使用常用的字符串进行数据传递之外,使用最多的还是JAVA对象。在JDK中,对象如果需要在网络中传输,必须实现Serializable接口,表示这个对象是可以被序列化的。这样就可以调用JDK自身的对象对象方法,进行对象的读写。 那么在netty中进行对象的传递可不可以直接使用JDK的对象序列化方法呢?如果不能的话,又应该怎么处理呢? 今天带大家来看看netty中提供的对象编码器。
|
网络协议 Java 前端开发
netty tcp 字节有序-&gt;对象有序
io.netty.handler.codec.serialization.ObjectDecoder 将ByteBuf[]反序列化为java对象。 A decoder which deserializes the received ByteBufs into Java objects.  io.netty.handler.codec.serialization.ObjectEncod
1468 0
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
13531 1
|
7月前
|
消息中间件 Oracle Dubbo
Netty 源码共读(一)如何阅读JDK下sun包的源码
Netty 源码共读(一)如何阅读JDK下sun包的源码
145 1