`

Netty对象传输

阅读更多

转自: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格式,进行远程对象传输,这就是一个远程调用框架的基础了。

 

分享到:
评论
1 楼 asialee 2013-03-17  
复杂对象就需要使用framedecorator了

相关推荐

    netty对象传输gzipdemo

    在“netty对象传输gzipdemo”中,我们关注的是如何使用Netty来传输对象,并且利用gzip进行数据压缩,以提高网络传输效率。 首先,让我们了解一下Netty中的对象传输。在传统的HTTP或FTP等协议中,数据通常以字符串或...

    netty传输对象源码

    为了实现对象传输,我们需要定义两个ChannelHandler:一个Encoder用于编码对象,另一个Decoder用于解码。Encoder可能包含如下代码: ```java public class ObjectEncoder extends MessageToByteEncoder&lt;Object&gt; { ...

    netty同步传输demo

    在“netty同步传输demo”中,我们关注的是如何在Netty中实现客户端的同步调用,以及如何利用ZooKeeper来管理分布式服务端。 首先,让我们深入理解Netty的同步和异步概念。Netty的核心特性之一是其基于NIO(非阻塞I/...

    netty传输kryo序列化的对象基于socket传输

    本主题“netty传输kryo序列化的对象基于socket传输”探讨的是如何结合Netty和Kryo,实现高效、可靠的网络数据传输。首先,我们需要了解Kryo序列化的基本原理。Kryo通过跟踪对象引用和存储类型信息来优化序列化过程,...

    Java Netty基于对象数据传输Demo

    总的来说,这个Demo展示了Netty在对象传输方面的强大能力,使得开发者可以方便地在网络中传递复杂的数据结构,而不必关心底层的字节操作。Netty的高效性能和易用性使其在许多高性能网络应用中成为首选框架。学习和...

    基于netty与protobuf的Android手机视频实时传输

    当接收到视频数据流时,Netty的ByteBuf对象用于存储和处理这些数据。服务器端可能还包含视频流的处理逻辑,比如存储、解码或进一步转发。为了保持实时性,服务器需要快速处理并响应来自客户端的数据包。 **客户端...

    netty文件传输

    在本文中,我们将深入探讨Netty如何实现文件传输,以及它的一些基本用法。 首先,Netty 提供了丰富的 ChannelHandler 实现,使得文件传输变得简单而高效。在文件传输过程中,我们可以使用 FileRegion 类来代表要...

    Netty进制转换乱码问题

    首先,我们要明白Netty作为一个高性能的网络应用框架,它本身并不直接处理字符编码,而是通过ByteBuf对象来存储和传输字节流。ByteBuf是Netty中的核心组件,用于高效地处理网络I/O。因此,当涉及到字符串和字节之间...

    netty案例,netty4.1中级拓展篇三《Netty传输Java对象》源码

    netty案例,netty4.1中级拓展篇三《Netty传输Java对象》源码 https://mp.weixin.qq.com/s?__biz=MzIxMDAwMDAxMw==&mid=2650724806&idx=1&sn=bb986119b9cdd950e2e6d995295e7f06&scene=19#wechat_redirect

    NettyDemo Netty使用实例,对象传递调用

    在本文中,我们将深入探讨Netty在实际应用中的实例——对象传递调用,以及如何解决TCP粘包问题。同时,我们还会讨论Java序列化方案在Netty中的编解码对比。 首先,让我们来看看TCP粘包问题。在TCP协议中,由于其...

    Netty5多文件、大文件上传源码

    在“Netty5多文件、大文件上传源码”这个项目中,我们关注的是如何利用Netty来实现在网络环境中传输多个文件,特别是大文件,并且保持客户端与服务器之间的长连接。下面将详细解释相关的知识点。 1. **Netty框架**...

    Netty服务端与客户端依靠Java序列化传输数据

    在Java世界中,序列化是将对象转换为字节流以便在网络间或存储系统中传输的一种常见技术。Java序列化是Java平台内建的一种标准对象序列化机制,它允许对象的状态被保存和恢复,这对于分布式应用和服务之间的通信尤其...

    netty实战教程、netty代码demo

    Netty 提供了多种传输类型,如 TCP、UDP 以及文件传输等,并且支持自定义协议栈。 二、Netty 的核心组件 1. **ByteBuf**:Netty 自定义的高效字节缓冲区,替代了传统的 Java NIO ByteBuffer。ByteBuf 提供了更友好...

    netty官网学习手册中文版

    - **大数据传输**:在大数据实时传输场景中,Netty的性能优势明显。 通过阅读这个“Netty_3.1中文用户手册.pdf”,你可以了解到Netty的基本原理、设计模式以及如何在实际项目中应用这些知识。尽管Netty不断更新,...

    Netty4 使用

    在本文中,我们将深入探讨Netty 4的使用,包括其核心概念、对象传输、通信封装以及如何利用它来创建高效的服务。 **Netty 4的核心特性** 1. **异步事件驱动**:Netty 使用非阻塞I/O模型,通过EventLoop(事件循环...

    Netty权威指南PDF书籍

    - **高性能**:通过零拷贝、直接内存访问等技术,优化了网络传输效率。 - **丰富的协议支持**:内建了多种常见网络协议,如 HTTP、FTP、SMTP 等,方便快速构建网络应用。 - **高度可定制**:Netty 的 ...

    netty-4.1.4-jar包

    5. **Decoder** 和 **Encoder**:用于在网络数据和应用对象之间进行编码和解码,例如将HTTP请求转换为应用对象,或将响应对象编码为HTTP响应。 6. **Future** 和 **Promise**:异步编程的关键概念,Future表示某个...

    Netty权威指南-Netty源码

    它们负责将字节流转换为对象,或者将对象转换为字节流,以便在网络上传输。例如,TCP 连接中常用的 LengthFieldBasedFrameDecoder 可以解析带有长度字段的帧数据。 在并发处理方面,Netty 使用了 EventLoopGroup 来...

    netty整合SpringMVC实现下载

    - 文件流式传输:避免一次性加载整个文件到内存,可以使用 Netty 的 ChunkedWriteHandler 支持大文件的流式传输。 - 异步处理:在 SpringMVC 中,可以利用 @Async 注解进行异步处理,提高服务性能。 - 错误处理:...

    Netty 3中文版

    - **大数据传输**: 大数据传输场景下,Netty的高性能和可定制性使其成为理想的选择。 通过“Netty In Action中文版”的学习,读者能够掌握Netty 3的精髓,运用其强大的功能来解决实际的网络编程问题,提高开发效率...

Global site tag (gtag.js) - Google Analytics