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

 更新时间:2017年05月21日 09:23:14   作者:荒野的尘埃  
Netty是由JBOSS提供的一个Java开源框架,之前已经给大家简单介绍了一些基础与使用,下面这篇文章主要给大家介绍了关于Netty与Marshalling结合发送对象的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

之前的一篇文章是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应用程序,在这里我们要注意服务端和客户端之间的两个类类名和包名在两端要完全相同。

总结

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

您可能感兴趣的文章:

相关文章

  • 解析Springboot集成Tile38客户端之Set命令实现示例

    解析Springboot集成Tile38客户端之Set命令实现示例

    这篇文章主要为大家介绍了解析Springboot集成Tile38客户端之Set命令实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 在Java的Spring框架中配置Quartz的教程

    在Java的Spring框架中配置Quartz的教程

    这篇文章主要介绍了在Java的Spring框架中配置Quartz的教程,Quartz是一款高人气的开源作业调度框架,需要的朋友可以参考下
    2016-03-03
  • java 文件目录读写删除操作详细实现代码

    java 文件目录读写删除操作详细实现代码

    这篇文章主要介绍了java 文件读写删操作详细实现代码,需要的朋友可以参考下
    2017-09-09
  • Jenkins Maven pom jar打包未拉取最新包解决办法

    Jenkins Maven pom jar打包未拉取最新包解决办法

    包版本号未变更新后,jenkins打包不会拉取最新包,本文主要介绍了Jenkins Maven pom jar打包未拉取最新包解决办法,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java-Redis-Redisson分布式锁的功能使用及实现

    Java-Redis-Redisson分布式锁的功能使用及实现

    这篇文章主要介绍了Java-Redis-Redisson-分布式锁的功能使用及实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Map与JavaBean相互转换的工具类 

    Map与JavaBean相互转换的工具类 

    这篇文章主要介绍了Map与JavaBean相互转换的工具类,在做导入的时候,遇到了需要将map对象转化 成javabean的问题,也就是说,不清楚javabean的内部字段排列,只知道map的 key代表javabean的字段名,value代表值,需要的朋友可以参考下
    2022-02-02
  • Java Map的排序实例详解

    Java Map的排序实例详解

    这篇文章主要介绍了 Java Map的排序实例详解的相关资料,希望通过本文大家能够掌握map的排序,需要的朋友可以参考下
    2017-09-09
  • javaweb实现投票系统

    javaweb实现投票系统

    这篇文章主要为大家详细介绍了javaweb实现投票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 如何解决Spring in action @valid验证不生效的问题

    如何解决Spring in action @valid验证不生效的问题

    这篇文章主要介绍了如何解决Spring in action @valid验证不生效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java实现多任务执行助手

    Java实现多任务执行助手

    这篇文章主要为大家详细介绍了Java实现多任务执行助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论