Netty使用Marshalling传输信息

简介: 使用Marshalling传输信息,需要有以下两个包,可以在官网下载jboss-marshalling-1.

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

jboss-marshalling-1.3.0.CR9.jar

jboss-marshalling-serial-1.3.0.CR9.jar


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

[java]   view plain  copy
  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]   view plain  copy
  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]   view plain  copy
  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]   view plain  copy
  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]   view plain  copy
  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]   view plain  copy
  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]   view plain  copy
  1. 服务端已启动  
  2. active  
  3. Student [name=小红, classs=5班, age=12]  
表明服务端成功接收了客户端发送的Student对象


注意:

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

相关文章
|
4月前
|
Java
Netty传输object并解决粘包拆包问题
Netty传输object并解决粘包拆包问题
38 0
|
12月前
|
前端开发 Java 程序员
Spring Boot+Netty+Websocket实现后台向前端推送信息
学过 Netty 的都知道,Netty 对 NIO 进行了很好的封装,简单的 API,庞大的开源社区。深受广大程序员喜爱。基于此本文分享一下基础的 netty 使用。实战制作一个 Netty + websocket 的消息推送小栗子。
|
消息中间件 前端开发 JavaScript
Spring Boot+Netty+Websocket实现后台向前端推送信息
Spring Boot+Netty+Websocket实现后台向前端推送信息
|
存储 Java Linux
Netty实战(四)Netty的传输
流经网络的数据总是具有相同的类型:字节。这些字节是如何流动的主要取决于我们所说的网络传输。
168 0
|
网络协议 前端开发 Linux
快来体验快速通道,netty中epoll传输协议详解
在前面的章节中,我们讲解了kqueue的使用和原理,接下来我们再看一下epoll的使用。两者都是更加高级的IO方式,都需要借助native的方法实现,不同的是Kqueue用在mac系统中,而epoll用在liunx系统中。
|
编解码
Netty(二)之整合Marshalling传输实体类
Netty(二)之整合Marshalling传输实体类
78 0
|
编解码 安全 前端开发
在netty中使用protobuf并实现数据加密传输
在netty中使用protobuf并实现数据加密传输
500 0
在netty中使用protobuf并实现数据加密传输
|
网络协议
netty系列之:kequeue传输协议详解
在前面的章节中,我们介绍了在netty中可以使用kequeue或者epoll来实现更为高效的native传输方式。那么kequeue和epoll和NIO传输协议有什么不同呢? 本章将会以kequeue为例进行深入探讨。
|
前端开发 Ubuntu Java
netty系列之:在netty中使用native传输协议
对于IO来说,除了传统的block IO,使用最多的就是NIO了,通常我们在netty程序中最常用到的就是NIO,比如NioEventLoopGroup,NioServerSocketChannel等。
|
设计模式 JSON Java
RPC框架(3 - 实现Netty传输和通用序列化接口)
RPC框架(3 - 实现Netty传输和通用序列化接口)