上一篇中服务端把字符串转换成字符数组后传给客户端,那么能否直接传递对象呢?答案当然是可以,不过这个对象必须实现了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(); } }
相关推荐
在本文中,我们将深入探讨Netty在实际应用中的实例——对象传递调用,以及如何解决TCP粘包问题。同时,我们还会讨论Java序列化方案在Netty中的编解码对比。 首先,让我们来看看TCP粘包问题。在TCP协议中,由于其...
这个“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-...
1. **服务消费方发起调用**:客户端以本地方法调用的方式发起请求,实际调用的是服务代理对象(client stub)。 2. **组装消息体**:client stub接收到调用请求后,将方法名、参数等信息打包成适合网络传输的数据...
当一个事件(如连接建立、数据接收等)发生时,它会从头节点开始沿着链路向下传递,每个处理器有机会处理事件或将其传递给下一个处理器。这种模式允许灵活地组合和定制网络应用的逻辑,使得事件处理可以被分解到多个...
《深入剖析Netty框架——基于itstack-demo-netty-master.zip》 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本项目"itstack-demo-netty-master.zip"是针对...
在本文中,我们将深入探讨Netty框架,并通过实战项目——仿写微信IM即时通讯系统,来深入了解其在高性能网络应用中的应用。Netty是Java领域中一个高效的异步事件驱动的网络应用程序框架,它为快速开发可维护的高性能...
3. **Frame Decoders and Encoders**:在 Netty 中,还有一类特殊的编解码器用于处理“帧”——在网络上传输的数据块。例如,LengthFieldBasedFrameDecoder 可以根据消息前的长度字段来解析出完整的消息,而 ...
本篇文章将深入探讨如何基于Netty5实现一个自定义协议——luck协议,以及相关的编码解码过程。 首先,让我们理解什么是Netty。Netty是由JBOSS提供的一个Java开源框架,它的核心特性包括:非阻塞I/O模型、高效的缓冲...
1. **Netty的消息收发机制**:Netty 使用ChannelHandlerContext作为消息传递的核心对象,它包含了发送和接收消息的方法。当客户端连接到服务器时,Netty会创建一个ChannelHandlerContext对象,通过这个对象,我们...
在本文中,我们将深入探讨 Netty 的通讯实践,了解它如何利用 Java NIO(非阻塞I/O)提升性能,并通过具体的代码示例——InputUtil.java 和 HostInfo.java,来解析 Netty 的通信环节步骤。 1. **Netty 框架基础** ...
Netty的ChannelHandlerContext对象可以用来定位到特定的连接,实现定向消息传递。 5. **心跳机制**(118-第3章_28-netty进阶-聊天业务-心跳-480P 清晰-AVC.Cover.jpg):为了检测客户端是否在线,通常会实施心跳...
《Dubbo源码深度解析——探索服务治理的奥秘》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务框架,已经成为Java世界中微服务架构的重要组成部分。它提供了包括服务注册与发现、负载均衡、调用链跟踪等核心...
《分布式系统详解——基于Java技术》 分布式系统是现代计算领域中的重要组成部分,它通过网络连接的多台计算机协同工作,实现数据共享和任务并行处理。Java作为一门跨平台的编程语言,因其强大的网络通信能力和丰富...