博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Netty使用Marshalling传输信息
阅读量:6489 次
发布时间:2019-06-24

本文共 6456 字,大约阅读时间需要 21 分钟。

使用Marshalling传输信息,需要有以下两个包,可以在官网下载

jboss-marshalling-1.3.0.CR9.jar

jboss-marshalling-serial-1.3.0.CR9.jar

一、编写要作为传输的Javabean,Student类一定要继承Serializable接口,才能实现序列化

[java]  
 
  1. package demo;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Student implements Serializable{  
  6.     String name;  
  7.     String classs;  
  8.     int age;  
  9.   
  10.     @Override  
  11.     public String toString() {  
  12.         return "Student [name=" + name + ", classs=" + classs + ", age=" + age + "]";  
  13.     }  
  14.   
  15.     public Student(String name, String classs, int age) {  
  16.         super();  
  17.         this.name = name;  
  18.         this.classs = classs;  
  19.         this.age = age;  
  20.     }  
  21.   
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.   
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.   
  30.     public String getClasss() {  
  31.         return classs;  
  32.     }  
  33.   
  34.     public void setClasss(String classs) {  
  35.         this.classs = classs;  
  36.     }  
  37.   
  38.     public int getAge() {  
  39.         return age;  
  40.     }  
  41.   
  42.     public void setAge(int age) {  
  43.         this.age = age;  
  44.     }  
  45.   
  46. }  


二、编写客户端:

通过MarshallingCodeFactory获得MarshallingDecoder和MarshallingEncoder,并将这两个编解码器添加到channelpipeline中

[java]  
 
  1. package client;  
  2.   
  3. import factory.MarshallingCodeCFactory;  
  4. import io.netty.bootstrap.Bootstrap;  
  5. import io.netty.channel.ChannelFuture;  
  6. import io.netty.channel.ChannelInitializer;  
  7. import io.netty.channel.ChannelOption;  
  8. import io.netty.channel.EventLoopGroup;  
  9. import io.netty.channel.nio.NioEventLoopGroup;  
  10. import io.netty.channel.socket.SocketChannel;  
  11. import io.netty.channel.socket.nio.NioSocketChannel;  
  12.   
  13. public class Client {  
  14.     public static void main(String[] args) throws Exception {  
  15.         new Client().connect("127.0.0.1"8888);  
  16.     }  
  17.   
  18.     public void connect(String host, int port) throws Exception {  
  19.         EventLoopGroup group = new NioEventLoopGroup();  
  20.         try {  
  21.             Bootstrap b = new Bootstrap();  
  22.             b.group(group).channel(NioSocketChannel.class);  
  23.             b.option(ChannelOption.TCP_NODELAY, true);  
  24.             b.handler(new ChannelInitializer<SocketChannel>() {  
  25.   
  26.                 @Override  
  27.                 protected void initChannel(SocketChannel ch) throws Exception {  
  28.                     ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());  
  29.                     ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());  
  30.                     ch.pipeline().addLast(new ClientChannelHandler());  
  31.                 }  
  32.             });  
  33.             ChannelFuture f = b.connect(host, port);  
  34.             f.channel().closeFuture().sync();  
  35.         } finally {  
  36.             group.shutdownGracefully();  
  37.         }  
  38.     }  
  39.   
  40. }  

三、MarshallingCodeFactory的代码如下:

[java]  
 
  1. package factory;  
  2.   
  3. import org.jboss.marshalling.MarshallerFactory;  
  4. import org.jboss.marshalling.Marshalling;  
  5. import org.jboss.marshalling.MarshallingConfiguration;  
  6.   
  7. import io.netty.handler.codec.marshalling.DefaultMarshallerProvider;  
  8. import io.netty.handler.codec.marshalling.DefaultUnmarshallerProvider;  
  9. import io.netty.handler.codec.marshalling.MarshallerProvider;  
  10. import io.netty.handler.codec.marshalling.MarshallingDecoder;  
  11. import io.netty.handler.codec.marshalling.MarshallingEncoder;  
  12. import io.netty.handler.codec.marshalling.UnmarshallerProvider;  
  13.   
  14. public class MarshallingCodeCFactory {  
  15.   
  16.     public static MarshallingDecoder buildMarshallingDecoder() {  
  17.         final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial");  
  18.         final MarshallingConfiguration configuration = new MarshallingConfiguration();  
  19.         configuration.setVersion(5);  
  20.         UnmarshallerProvider provider = new DefaultUnmarshallerProvider(factory, configuration);  
  21.         MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024);  
  22.         return decoder;  
  23.     }  
  24.   
  25.     public static MarshallingEncoder buildMarshallingEncoder() {  
  26.         final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial");  
  27.         final MarshallingConfiguration configuration = new MarshallingConfiguration();  
  28.         configuration.setVersion(5);  
  29.         MarshallerProvider provider = new DefaultMarshallerProvider(factory, configuration);  
  30.         MarshallingEncoder encoder = new MarshallingEncoder(provider);  
  31.         return encoder;  
  32.     }  
  33.   
  34. }  

四、ClientChannelHandler的代码如下:

客户端与服务端连通后,客户端直接将Student对象写入channelpipeline中

[html]  
 
  1. package demo;  
  2.   
  3. import io.netty.channel.ChannelHandlerAdapter;  
  4. import io.netty.channel.ChannelHandlerContext;  
  5.   
  6. public class ClientChannelHandler extends ChannelHandlerAdapter {  
  7.     @Override  
  8.     public void channelActive(ChannelHandlerContext ctx) throws Exception {  
  9.         Student s = new Student("小红", "5班", 12);  
  10.         ctx.writeAndFlush(s);  
  11.     }  
  12.   
  13.     @Override  
  14.     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {  
  15.   
  16.     }  
  17.   
  18.     @Override  
  19.     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {  
  20.   
  21.     }  
  22. }  


五、服务端代码:

[java]  
 
  1. package demo;  
  2.   
  3. import factory.MarshallingCodeCFactory;  
  4. import io.netty.bootstrap.ServerBootstrap;  
  5. import io.netty.channel.ChannelFuture;  
  6. import io.netty.channel.ChannelInitializer;  
  7. import io.netty.channel.ChannelOption;  
  8. import io.netty.channel.EventLoopGroup;  
  9. import io.netty.channel.nio.NioEventLoopGroup;  
  10. import io.netty.channel.socket.SocketChannel;  
  11. import io.netty.channel.socket.nio.NioServerSocketChannel;  
  12.   
  13. public class Server {  
  14.     public static void main(String[] args) {  
  15.         try {  
  16.             new Server().bind(8888);  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.     }  
  21.   
  22.     public void bind(final int port) throws Exception {  
  23.         EventLoopGroup bossGroup = new NioEventLoopGroup();  
  24.         EventLoopGroup workGroup = new NioEventLoopGroup();  
  25.         try {  
  26.             ServerBootstrap b = new ServerBootstrap();  
  27.             b.option(ChannelOption.TCP_NODELAY, true);  
  28.             b.group(bossGroup, workGroup).channel(NioServerSocketChannel.class)  
  29.                     .childHandler(new ChannelInitializer<SocketChannel>() {  
  30.   
  31.                         @Override  
  32.                         protected void initChannel(SocketChannel ch) throws Exception {  
  33.                             ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());  
  34.                             ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());  
  35.                             ch.pipeline().addLast(new ServerChannelHandler());  
  36.                         }  
  37.   
  38.                     });  
  39.             ChannelFuture f = b.bind(port).sync();  
  40.             System.out.println("服务端已启动");  
  41.             f.channel().closeFuture().sync();  
  42.         } catch (InterruptedException e) {  
  43.             e.printStackTrace();  
  44.         } finally {  
  45.             bossGroup.shutdownGracefully();  
  46.             workGroup.shutdownGracefully();  
  47.         }  
  48.     }  
  49.   
  50. }  

六、ServerChannelHandler的代码如下:

[java]  
 
  1. package demo;  
  2.   
  3. import io.netty.channel.ChannelHandlerAdapter;  
  4. import io.netty.channel.ChannelHandlerContext;  
  5.   
  6. public class ServerChannelHandler extends ChannelHandlerAdapter {  
  7.   
  8.     @Override  
  9.     public void channelActive(ChannelHandlerContext ctx) throws Exception {  
  10.         System.out.println("active");  
  11.     }  
  12.   
  13.     @Override  
  14.     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {  
  15.         System.out.println(msg);  
  16.     }  
  17.   
  18.     @Override  
  19.     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {  
  20.         cause.printStackTrace();  
  21.     }  
  22.   
  23. }  


服务端将输出如下:

[plain]  
 
  1. 服务端已启动  
  2. active  
  3. Student [name=小红, classs=5班, age=12]  
表明服务端成功接收了客户端发送的Student对象


注意:

作为传输对象的JavaBean必须要继承Serializable接口,如上述例子,如果Student继承了Person,那么Person也必须继承Serializable接口,否则将报错

转载地址:http://ddouo.baihongyu.com/

你可能感兴趣的文章
添加附属组
查看>>
Nginx反向代理svn服务器提交文件出现500错误
查看>>
自己手动复现一个熊猫烧香病毒
查看>>
很简单的JS点击复制(代码)
查看>>
SQL Server 导入excel时“该值违反了该列的完整性约束”错误
查看>>
SAP 开源 SCA 工具,扫描软件包依赖漏洞
查看>>
嵌入式Linux学习方法——给那些彷徨者(上)
查看>>
Spark中Lambda表达式的变量作用域
查看>>
Zabbix3.4.2的agent端配置和安装
查看>>
mysql备份时候两个很有用的参数
查看>>
SpringBoot(三)_controller的使用
查看>>
LinkedBlockingQueue源码解析
查看>>
Kotlin 1.3 新特性抢先看,协程已稳定并将向后兼容
查看>>
Parat-基于kali2018的远程管理工具
查看>>
ES6(正则扩展)
查看>>
从零玩转jQuery-核心函数和静态方法
查看>>
8月3日科技联播:新型VR头盔可令盲人重获光明 ,联通阿里成立合资企业“云粒智慧”...
查看>>
Jeknins的Pipline方式构建任务
查看>>
Python全栈 项目(电子词典、协程、pdb调试)
查看>>
(周期计划-7)常用集合的源码分析:ArrayList
查看>>