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();
  }
}


目录
相关文章
|
9月前
|
编解码 前端开发 网络协议
Netty Review - ObjectEncoder对象和ObjectDecoder对象解码器的使用与源码解读
Netty Review - ObjectEncoder对象和ObjectDecoder对象解码器的使用与源码解读
198 0
|
缓存 前端开发 Java
【Netty官方文档翻译】引用计数对象(reference counted objects)
【Netty官方文档翻译】引用计数对象(reference counted objects)
109 0
|
Java
Netty之了解 Recycler 对象回收池
Netty之了解 Recycler 对象回收池
206 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对象。
280 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
1476 0
|
3月前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
6月前
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC