zoukankan      html  css  js  c++  java
  • 解决netty客户端接收报文不完整的情况

    逻辑就是在处理handler前加入一个处理符,然后

    channelReadComplete这个事件进行处理。
    同时注意客服端的配置:
     1 public void connect(String addr, int port, final String xml, final String key,final boolean flag) throws Exception {
     2         EventLoopGroup group = new NioEventLoopGroup();
     3         try {
     4             Bootstrap b = new Bootstrap();
     5             b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
     6             .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024))//这行配置比较重要
     7                     .handler(new ChannelInitializer<SocketChannel>() {
     8                         protected void initChannel(SocketChannel ch) throws Exception {
     9                             ChannelPipeline pipeline = ch.pipeline();
    10                             pipeline.addLast(new EsbClientHandler(xml, key,flag));
    11                         }
    12                     });
    13             ChannelFuture f = b.connect(addr, port);
    14             // 等待客户端关闭连接
    15             f.channel().closeFuture().sync();
    16         } catch (Exception e) {
    17             e.printStackTrace();
    18         } finally {
    19             group.shutdownGracefully();
    20         }
    21     }

    源码如下:

     1 public class EsbClientHandler extends ChannelHandlerAdapter {
     2 
     3     private static Logger logger = Logger.getLogger(EsbClientHandler.class);
     4 
     5     private ByteBuf byteMsg;
     6 
     7     private boolean flag;
     8 
     9     /**
    10      * 临时客户端数据key
    11      */
    12     private String key = "key";
    13 
    14     public EsbClientHandler(String xml, String key, boolean flag) {
    15         this.key = key;
    16         this.flag = flag;
    17         byte[] req = null;
    18         try {
    19             req = xml.getBytes("UTF-8");
    20         } catch (UnsupportedEncodingException e) {
    21             e.printStackTrace();
    22         }
    23         byteMsg = Unpooled.buffer(req.length);
    24         byteMsg.writeBytes(req);
    25     }
    26 
    27     @Override
    28     public void channelActive(ChannelHandlerContext ctx) throws Exception {
    29         ctx.writeAndFlush(byteMsg);
    30     }
    31 
    32     @Override
    33     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    34         try {
    35             ByteBuf buf = (ByteBuf) msg;
    36             byte[] req = new byte[buf.readableBytes()];
    37             buf.readBytes(req);
    38             String body = new String(req, "UTF-8");
    39             flag = true;
    40             String xml = WebUtil.getXmlStr(body);
    41             analysisXml(xml);
    42         } catch (Exception e) {
    43             e.printStackTrace();
    44         } finally {
    45             ReferenceCountUtil.release(msg);
    46         }
    47 
    48     }
    49 
    50     @Override
    51     public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    52         ctx.flush();
    53         if (flag) {
    54             ctx.close();
    55         } else {
    56             ctx.read();
    57         }
    58     }
    59 
    60     @Override
    61     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    62         // 释放资源
    63         ctx.close();
    64     }
    65 
    66     /**
    67      * 
    68      * 客户端解析服务端返回的xml数据,进行数据操作
    69      * 
    70      * @param xml
    71      */
    72     public void analysisXml(String xml) {
    73         System.out.println("获取服务器接收报文:" + xml);
    74         logger.info("开始解析xml:");
    75         logger.info(xml);
    76         NettyMap.setDataMap(key, xml);
    77     }
    78 }
  • 相关阅读:
    python之《set》
    python之 《zip,lambda, map》
    python之 socketserver模块的使用
    iOS FMDB小试了一下
    人生要自强不息-路遇瞎子感悟
    iOS Node Conflict svn冲突
    iOS 隐藏Status Bar
    iOS NSURLSession 封装下载类
    iOS NSFileManager
    iOS prototype Cells
  • 原文地址:https://www.cnblogs.com/huzi007/p/11334122.html
Copyright © 2011-2022 走看看