`
lanhuidong
  • 浏览: 227584 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

netty(二)——对象传递

阅读更多

上一篇中服务端把字符串转换成字符数组后传给客户端,那么能否直接传递对象呢?答案当然是可以,不过这个对象必须实现了Serializable接口(如果对象没实现Serializable接口,那么将不能传递该对象,但是程序也没有报以错,具体还得查看netty源码怎么写的)。

要传递的对象:

public class User implements Serializable {

    private Long id;
    private String username;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}

 

服务器端代码:

public class ObjectServer {

    public void run() throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())),new ObjectEncoder(), new ObjectServerHandler());
                        }
                    })
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);
            ChannelFuture f = b.bind(7777).sync();
            System.out.println("server started.");
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        new ObjectServer().run();
    }
}

public class ObjectServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        User user = (User) msg;
        System.out.println(user);
        user.setUsername("ooxx");
        ctx.write(user);
        ctx.flush();
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.close();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //打印异常信息并关闭连接
        cause.printStackTrace();
        ctx.close();
    }
}

 

客户端代码:

public class ObjectClient {

    public static void main(String[] args) throws InterruptedException {
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(workerGroup)
                    .channel(NioSocketChannel.class)
                    .option(ChannelOption.SO_KEEPALIVE, true)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())),new ObjectEncoder(), new ObjectClientHandler());
                        }
                    });
            ChannelFuture f = b.connect("127.0.0.1", 7777).sync();
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
        }
    }
}

public class ObjectClientHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        User user = new User();
        user.setId(1L);
        user.setUsername("netty");
        ctx.write(user);
        ctx.flush();
        System.out.println("xxx");
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        User user = (User) msg;
        System.out.println(user);
        ctx.close();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

 

原文:http://www.nexusy.com/2014/06/11/netty-2/

分享到:
评论

相关推荐

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

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

    netty-4.1.4-jar包

    这个“netty-4.1.4-jar包”包含了两个重要的文件:“netty-all-4.1.17.Final.jar”和“netty-all-4.1.17.Final-sources.jar”,它们是Netty框架的特定版本——4.1.17.Final的组件。 首先,我们来看“netty-all-...

    dubbo——rpc的原理和netty1

    1. **服务消费方发起调用**:客户端以本地方法调用的方式发起请求,实际调用的是服务代理对象(client stub)。 2. **组装消息体**:client stub接收到调用请求后,将方法名、参数等信息打包成适合网络传输的数据...

    Netty4事件处理传播机制,java高级开发工程师要求(csdn)————程序.pdf

    当一个事件(如连接建立、数据接收等)发生时,它会从头节点开始沿着链路向下传递,每个处理器有机会处理事件或将其传递给下一个处理器。这种模式允许灵活地组合和定制网络应用的逻辑,使得事件处理可以被分解到多个...

    itstack-demo-netty-master.zip

    《深入剖析Netty框架——基于itstack-demo-netty-master.zip》 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本项目"itstack-demo-netty-master.zip"是针对...

    Netty 入门与实战:仿写微信 IM 即时通讯系统

    在本文中,我们将深入探讨Netty框架,并通过实战项目——仿写微信IM即时通讯系统,来深入了解其在高性能网络应用中的应用。Netty是Java领域中一个高效的异步事件驱动的网络应用程序框架,它为快速开发可维护的高性能...

    netty技术文档,socket技术第七章

    3. **Frame Decoders and Encoders**:在 Netty 中,还有一类特殊的编解码器用于处理“帧”——在网络上传输的数据块。例如,LengthFieldBasedFrameDecoder 可以根据消息前的长度字段来解析出完整的消息,而 ...

    基于netty5的自定义协议Demo

    本篇文章将深入探讨如何基于Netty5实现一个自定义协议——luck协议,以及相关的编码解码过程。 首先,让我们理解什么是Netty。Netty是由JBOSS提供的一个Java开源框架,它的核心特性包括:非阻塞I/O模型、高效的缓冲...

    netty收发消息增查数据库,获取在线客户端数,pom项目

    1. **Netty的消息收发机制**:Netty 使用ChannelHandlerContext作为消息传递的核心对象,它包含了发送和接收消息的方法。当客户端连接到服务器时,Netty会创建一个ChannelHandlerContext对象,通过这个对象,我们...

    netty通讯实践

    在本文中,我们将深入探讨 Netty 的通讯实践,了解它如何利用 Java NIO(非阻塞I/O)提升性能,并通过具体的代码示例——InputUtil.java 和 HostInfo.java,来解析 Netty 的通信环节步骤。 1. **Netty 框架基础** ...

    聊天室业务011111111111

    Netty的ChannelHandlerContext对象可以用来定位到特定的连接,实现定向消息传递。 5. **心跳机制**(118-第3章_28-netty进阶-聊天业务-心跳-480P 清晰-AVC.Cover.jpg):为了检测客户端是否在线,通常会实施心跳...

    dubbo-source-code-analysis:dubbo原始码解析-源码解析

    《Dubbo源码深度解析——探索服务治理的奥秘》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务框架,已经成为Java世界中微服务架构的重要组成部分。它提供了包括服务注册与发现、负载均衡、调用链跟踪等核心...

    Sistemas-Distribuidos

    《分布式系统详解——基于Java技术》 分布式系统是现代计算领域中的重要组成部分,它通过网络连接的多台计算机协同工作,实现数据共享和任务并行处理。Java作为一门跨平台的编程语言,因其强大的网络通信能力和丰富...

Global site tag (gtag.js) - Google Analytics