上一篇中服务端把字符串转换成字符数组后传给客户端,那么能否直接传递对象呢?答案当然是可以,不过这个对象必须实现了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 框架学习 —— 第一个 Netty 应用(csdn)————程序
Netty 框架学习 —— 编解码器框架(csdn)————程序
NettyDemo Netty使用实例,对象传递调用; LineBasedFrameDecoder + 消息中得换行符;解决TCP 粘包问题; Java序列化方案编解码对比;对象调用方案
Netty 框架学习 —— 预置的 ChannelHandler 和编解码器(csdn)————程序
《Netty最佳实践》——《Netty实战》补遗-Netty-Best-Practices
netty案例,netty4.1中级拓展篇三《Netty传输Java对象》源码 https://mp.weixin.qq.com/s?__biz=MzIxMDAwMDAxMw==&mid=2650724806&idx=1&sn=bb986119b9cdd950e2e6d995295e7f06&scene=19#wechat_redirect
所以想学好Socket通信不是件容易事,那么接下来就来学习一下新的技术Netty,为什么会选择Netty?因为它简单!使用Netty不必编写复杂的逻辑代码去实现通信,再也不需要去考虑性能问题,不需要考虑编码问题,半包读写...
netty5 对象传输demo
Netty在Android开发中的应用实战系列(二)——— Encoder | Decoder | Handler 的使用:https://azhon.blog.csdn.net/article/details/100831777 Netty在Android开发中的应用实战系列(三)——— 心跳处理 | 断线...
厉害了,Netty 轻松实现文件上传!(csdn)————程序
Netty将java对象作为数据的发送与接收 使用:先运行UserServer,在运行UserClient。成功连接后,服务器发送一个User对象给客户端。输出到客户端控制台 5.第四个示例 com.user_1 Netty将java对象作为数据的发送与...
在前一个资源的基础上,实现传输对象。属于入门级别。仅供学习
经过本人测试通过,少走弯路
Netty4事件处理传播机制,java高级开发工程师要求(csdn)————程序
Netty权威指南第二版PDF
《Netty权威指南(第2 版)》是异步非阻塞通信领域的经典之作,基于最新版本的Netty 5.0 编写,是国内首本深入介绍Netty 原理和架构的书籍,也是作者多年实战经验的总结和浓缩。内容不仅包含Java NIO入门知识、Netty...
用kryo序列化对象,然后集成netty通过socket进行网络传输!通过自定义长度规则解决黏包、拆包问题!数据包格式是报文头+报文体!前4个字节是报文头,保存数据长度;后面是报文体,保存数据!
Netty实现端口数据转发:3000进4000出
Netty中集成Protobuf实现Java对象数据传递示例代码.rar