文档章节

Netty与Marshalling结合发送对象—Netty学习二

刺猬一号
 刺猬一号
发布于 2017/05/24 12:16
字数 924
阅读 12
收藏 0

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

© 著作权归作者所有

刺猬一号
粉丝 12
博文 373
码字总数 616361
作品 0
深圳
私信 提问
《深入探索Netty原理及源码分析》文集小结

写在2017年末尾,翻看文集的第一篇文章已经是三个月前的事了,也没想过这文集会写那么久,这么慢。。。 Netty文集中的文章主要都是我学习过程的笔记,写博客的主要目的是为了通过输出来倒逼输...

tomas家的小拨浪鼓
2017/12/30
0
0
JBoss Marshalling编解码的学习

1.首先交代maven依赖Marshalling API 和Marshalling Serial Protocol 2. 3.服务端开发 4.客户端开发 运行结果: netty的Marshalling编解码器支持半包粘包的处理...

啊哈关关
2017/10/31
0
0
第八章:附带的ChannelHandler和Codec

本章介绍 使用SSL/TLS创建安全的Netty程序 使用Netty创建HTTP/HTTPS程序 处理空闲连接和超时 解码分隔符和基于长度的协议 写大数据 序列化数据 上一章讲解了如何创建自己的编解码器,我们现在...

李矮矮
2016/09/26
90
0
netty系列(一) 初识netty

背景 对公司http服务进行压力测试,选择netty+springmvc与传统的tomcat服务进行对比。 选择的业务接口为用户能一步触达的页面(例如推送push后,许多用户会点击push通知条进入app某页面,造成...

春夏秋冬菜
2018/05/21
0
0
【Netty】Netty实例开源项目

版权声明:本文为谙忆原创文章,转载请附上本文链接,谢谢。 https://blog.csdn.net/qq_26525215/article/details/81989644 Netty netty-not-sticky-pack-demo 项目地址 Netty 本篇博客讲解:...

谙忆
2018/08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙。我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名。 Xulu并不是第一个攻击...

阿里云官方博客
19分钟前
3
0
MD5 加密需要注意编码格式!!!

相信做过MD5加密的童鞋都遇到过字符编码的坑,一般加密出来的结果和其他人不一样都是字符编码不一致导致的,比如类文件的字符编码、浏览器的字符编码等和对方不一致,所以就需要转码统一字符...

jason_kiss
21分钟前
1
0
python中字符串的操作

https://www.jianshu.com/p/7fc851b6a7ee

writeademo
30分钟前
1
0
如何制定 Java 性能调优标准?

想让你的程序更快更稳,但是系统经常出各种 bug,无从下手?Java 性能调优全攻略来啦! 我有一个朋友,有一次他跟我说,他们公司的系统从来没有经过性能调优,功能测试完成后就上线了,线上也...

Java领航员
31分钟前
2
0
java博客项目

项目地址:https://github.com/otale/tale 项目演示地址:https://tale.biezhi.me/ 项目介绍:Tale使用轻量级mvc框架Blade进行开发,默认主题使用漂亮的pinghsu, 特征 设计简洁,界面美观 ...

编程资源库
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部