Netty学习教程之Netty与Marshalling结合发送对象

发布时间 - 2026-01-11 01:12:43    点击率:

前言

之前的一篇文章是Netty简单的学习,我们可以传递一个字符串,那么如果我们想要在Netty中传递一个对象该怎么办呢 ?

那么这个时候我们可以结合Marshalling来传递。

方法如下:

首先需要导入两个Marshalling的依赖包

jboss-marshalling-1.3.0.CR9.jar
jboss-marshalling-serial-1.3.0.CR9.jar

注意:我开始学习的时候只导入了第一个jar包,没有导入第二个,结果是不报错,但是客户端和服务端之间传递不了消息。所以两个包一定要都导入才行。

MarshallingCodeCFactory工具类

public class MarshallingCodeCFactory { 
 
 public static MarshallingDecoder buildMarshallingDecoder() { 
  final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial"); 
  final MarshallingConfiguration configuration = new MarshallingConfiguration(); 
  configuration.setVersion(5); 
  UnmarshallerProvider provider = new DefaultUnmarshallerProvider(factory, configuration); 
  MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024*1024); 
  return decoder; 
 } 
 
 public static MarshallingEncoder buildMarshallingEncoder() { 
  final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial"); 
  final MarshallingConfiguration configuration = new MarshallingConfiguration(); 
  configuration.setVersion(5); 
  MarshallerProvider provider = new DefaultMarshallerProvider(factory, configuration); 
  MarshallingEncoder encoder = new MarshallingEncoder(provider); 
  return encoder; 
 } 
} 

server端

public class Server { 
  
 public static void main(String[] args) throws InterruptedException { 
  //1.第一个线程组是用于接收Client端连接的 
  EventLoopGroup bossGroup = new NioEventLoopGroup();  
  //2.第二个线程组是用于实际的业务处理的 
  EventLoopGroup workerGroup = new NioEventLoopGroup(); 
  ServerBootstrap b = new ServerBootstrap(); 
  b.group(bossGroup, workerGroup);//绑定两个线程池 
  b.channel(NioServerSocketChannel.class);//指定NIO的模式,如果是客户端就是NioSocketChannel 
  b.option(ChannelOption.SO_BACKLOG, 1024);//TCP的缓冲区设置 
  b.option(ChannelOption.SO_SNDBUF, 32*1024);//设置发送缓冲的大小 
  b.option(ChannelOption.SO_RCVBUF, 32*1024);//设置接收缓冲区大小 
  b.option(ChannelOption.SO_KEEPALIVE, true);//保持连续 
  b.childHandler(new ChannelInitializer<SocketChannel>() { 
   protected void initChannel(SocketChannel ch) throws Exception { 
    //设置Marshalling的编码和解码 
    ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder()); 
    ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder()); 
    ch.pipeline().addLast(new ServertHandler()); 
   } 
  }); 
  ChannelFuture future = b.bind(8765).sync();//绑定端口 
  future.channel().closeFuture().sync();//等待关闭(程序阻塞在这里等待客户端请求) 
  bossGroup.shutdownGracefully();//关闭线程 
  workerGroup.shutdownGracefully();//关闭线程 
 } 
 
} 

ServerHandler处理类

public class ServertHandler extends ChannelHandlerAdapter { 
 
 @Override 
 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
   throws Exception { 
  cause.printStackTrace(); 
 } 
 
 @Override 
 public void channelRead(ChannelHandlerContext ctx, Object msg) 
   throws Exception { 
  Send send = (Send) msg; 
  System.out.println("client发送:"+send); 
   
  Receive receive = new Receive(); 
  receive.setId(send.getId()); 
  receive.setMessage(send.getMessage()); 
  receive.setName(send.getName()); 
  ctx.writeAndFlush(receive); 
 } 
  
} 

由于我们已经在Server端和Client端定义了传递的类型又Marshalling工厂处理,所以此时我们接收的时候直接转成发送的对象类型就行了。

Client端

public class Client { 
 
 public static void main(String[] args) throws InterruptedException { 
  EventLoopGroup worker = new NioEventLoopGroup(); 
  Bootstrap b = new Bootstrap(); 
  b.group(worker) 
  .channel(NioSocketChannel.class) 
  .handler(new ChannelInitializer<SocketChannel>() { 
   @Override 
   protected void initChannel(SocketChannel sc) throws Exception { 
    //ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes()); 
    //sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,buf)); 
    //sc.pipeline().addLast(new StringDecoder()); 
    sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder()); 
    sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder()); 
    sc.pipeline().addLast(new ClientHandler()); 
   } 
  }); 
  ChannelFuture f=b.connect("127.0.0.1",8765).sync(); 
  for(int i=1;i<=5;i++){ 
   Send send = new Send(); 
   send.setId(i); 
   send.setMessage("message"+i); 
   send.setName("name"+i); 
   f.channel().writeAndFlush(send); 
  } 
  f.channel().closeFuture().sync(); 
  worker.shutdownGracefully(); 
 } 
} 

ClientHandler端

public class ClientHandler extends ChannelHandlerAdapter{ 
  @Override 
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
    throws Exception { 
   cause.printStackTrace(); 
   ctx.close(); 
  } 
 
  @Override 
  public void channelRead(ChannelHandlerContext ctx, Object msg) 
    throws Exception { 
   Receive receive = (Receive) msg; 
   System.out.println("server反馈:"+receive); 
  } 
} 

send类

public class Send implements Serializable { 
 
 /** 
  * serialVersionUID:TODO(用一句话描述这个变量表示什么) 
  * 
  * @since 1.0.0 
  */ 
 
 private static final long serialVersionUID = 1L; 
 
 private Integer id; 
 private String name; 
 private String message; 
 
 public Integer getId() { 
  return id; 
 } 
 
 public void setId(Integer id) { 
  this.id = id; 
 } 
 
 public String getName() { 
  return name; 
 } 
 
 public void setName(String name) { 
  this.name = name; 
 } 
 
 public String getMessage() { 
  return message; 
 } 
 
 public void setMessage(String message) { 
  this.message = message; 
 } 
 
 @Override 
 public String toString() { 
  return "Send [id=" + id + ", name=" + name + ", message=" + message + "]"; 
 } 
 
} 

Receive类

public class Receive implements Serializable{ 
 
 /** 
  * serialVersionUID:TODO(用一句话描述这个变量表示什么) 
  * @since 1.0.0 
  */ 
  
 private static final long serialVersionUID = 1L; 
 private Integer id; 
 private String name; 
 private String message; 
 private byte[] sss; 
  
 public byte[] getSss() { 
  return sss; 
 } 
 public void setSss(byte[] sss) { 
  this.sss = sss; 
 } 
 public Integer getId() { 
  return id; 
 } 
 public void setId(Integer id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public String getMessage() { 
  return message; 
 } 
 public void setMessage(String message) { 
  this.message = message; 
 } 
 @Override 
 public String toString() { 
  return "Receive [id=" + id + ", name=" + name + ", message=" + message + ", sss=" + Arrays.toString(sss) + "]"; 
 } 
  
} 

注意:send类和receive这两个类,我们再真实环境开发的时候服务器和客户端往往是两个web应用程序,在这里我们要注意服务端和客户端之间的两个类类名和包名在两端要完全相同。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# netty  # marshalling  # 发送对象  # 发送数据  # Netty学习教程之基础使用篇  # 客户端  # 在这里  # 第一个  # 我们可以  # 第二个  # 句话  # 绑定  # 服务端  # 这两个  # 要注意  # 这个时候  # 这篇文章  # 才行  # 报错  # 谢谢大家  # 一篇文章  # 转成  # 完全相同  # 应用程序  # 方法如下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用PHP快速搭建CMS系统?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何快速配置高效服务器建站软件?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Python制作简易注册登录系统  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  ,网页ppt怎么弄成自己的ppt?  Laravel如何处理CORS跨域请求?(配置示例)  如何快速搭建高效服务器建站系统?  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  ,交易猫的商品怎么发布到网站上去?  Python文件操作最佳实践_稳定性说明【指导】  微信小程序 闭包写法详细介绍  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  中山网站推广排名,中山信息港登录入口?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  浅析上传头像示例及其注意事项  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  手机软键盘弹出时影响布局的解决方法  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  浅谈Javascript中的Label语句  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  网站制作价目表怎么做,珍爱网婚介费用多少?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  PythonWeb开发入门教程_Flask快速构建Web应用  如何快速生成凡客建站的专业级图册?  🚀拖拽式CMS建站能否实现高效与个性化并存?  图册素材网站设计制作软件,图册的导出方式有几种?  如何用西部建站助手快速创建专业网站?  实例解析angularjs的filter过滤器  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel如何为API生成Swagger或OpenAPI文档  Android GridView 滑动条设置一直显示状态(推荐)  java中使用zxing批量生成二维码立牌  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  在线制作视频网站免费,都有哪些好的动漫网站?