jx_401 2015-08-12 01:34 采纳率: 0%
浏览 2848

netty ssl加密传输自动断开

netty的客户端和服务端已经完成ssl认证,传输数据4-5次以后自动断开,请各位帮忙看看哪有问题,下面是代码和异常
客户端:
1. 注册client的handler部分代码:
SSLEngine sse = client_context.createSSLEngine();
sse.setUseClientMode(true);
sc.pipeline().addLast(new ClientOutboundHandler())
.addLast(new SslHandler(sse))
// .addLast(new IdleStateHandler(30, 30, 0,
// TimeUnit.SECONDS))
// .addLast(new HeartBeatHandler())
// .addLast(new ClientCodec())
.addLast(new ClientInboundHandler())
.addLast(new ClientLogicHandler());

  1. ClientInboundHandler中发送数据代码:
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {

    if (evt instanceof SslHandshakeCompletionEvent) {// 测试ssl加密传输数据
        logger.info("client's ssl connection was complated");
    
        ClientSendHeartbeatTask csht = new ClientSendHeartbeatTask(ctx);
        Thread heartbeatThread = new Thread(csht);
        heartbeatThread.start();
    
        ClientSendDataTask csdt = new ClientSendDataTask(ctx);
        Thread dataThread = new Thread(csdt);
        dataThread.start();
    
    }
    

    }

  2. 其中ClientSendDataTask的代码如下:
    @Override
    public void run() {

    while (true) {
    
        ByteBuf buff = Unpooled.buffer();
        String str = JSONArray.fromObject(etlservice.getEtlTablePojos()).toString();
    
        NioMessage nm = new NioMessage();
        nm.setType(Constance.DEMODATA_MSG_TYPE);
        nm.setJson(str);
        String jsonStr = JacksonUtil.getJsonStr(nm);
        buff.writeInt(jsonStr.getBytes().length).writeBytes(jsonStr.getBytes());
        ctx.writeAndFlush(buff);
    

    // buff.clear();
    // buff.release();
    logger.info("client ClientSendDataTask : send data msg to server");
    try {
    Thread.sleep(10000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }

  3. server端注册handler代码:
    SSLEngine sse = server_context.createSSLEngine();
    sse.setNeedClientAuth(true);
    sse.setUseClientMode(false);

    sc.pipeline().addLast(new ServerOutboundHandler())
    .addLast(new SslHandler(sse))
    // .addLast(new IdleStateHandler(30, 30,
    // 0,TimeUnit.SECONDS))
    // .addLast(new HeartBeatHandler())
    // .addLast(new ServerCodec())
    .addLast(new ServerInboundHandler())
    .addLast(new ServerLogicHandler());

  4. ServerInboundHandler中处理接收的数据代码:
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
    NioMessage nm = NettyUtil.getNioMessage(msg);

    if (0 == nm.getType())
        logger.warn("server channelRead : msg type is zero , throw exception");
    
    try {
        if (Constance.HEARTBEAT_MSG_TYPE == nm.getType()) {
            logger.info("server channelRead : heartbeat msg");
            HeartBeatEntity hb = JacksonUtil.getObjMapper().readValue(nm.getJson(), HeartBeatEntity.class);
            ctx.fireChannelRead(hb);
        } else if (Constance.DEMODATA_MSG_TYPE == nm.getType()) {
            logger.info("server channelRead : data msg");
            // List<EtlTablePojo> pojoList = (List<EtlTablePojo>)
            // JacksonUtil.getObjMapper().readValue(nm.getJson(),
            // List.class);
            System.out.println("=====json is : " + nm.getJson());
            ctx.fireChannelRead(nm.getJson());
        } else if (Constance.RESULT_MSG_TYPE == nm.getType()) {
            logger.info("server channelRead : operation result msg");
            ResultEntity re = JacksonUtil.getObjMapper().readValue(nm.getJson(), ResultEntity.class);
            re.toString();
        }
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    }

  5. 运行一段时间后出现错误如下:
    [nioEventLoopGroup-14-1] DEBUG io.netty.handler.ssl.SslHandler - Swallowing a harmless 'connection reset by peer / broken pipe' error that occurred while writing close_notify in response to the peer's close_notify
    java.io.IOException: Connection reset by peer
    at sun.nio.ch.FileDispatcher.read0(Native Method) ~[na:1.6.0_65]
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21) ~[na:1.6.0_65]
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:198) ~[na:1.6.0_65]
    at sun.nio.ch.IOUtil.read(IOUtil.java:166) ~[na:1.6.0_65]
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:245) ~[na:1.6.0_65]
    at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:436) ~[netty-all-4.0.11.Final.jar:na]
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:870) ~[netty-all-4.0.11.Final.jar:na]
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:208) ~[netty-all-4.0.11.Final.jar:na]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:88) ~[netty-all-4.0.11.Final.jar:na]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485) [netty-all-4.0.11.Final.jar:na]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452) [netty-all-4.0.11.Final.jar:na]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346) [netty-all-4.0.11.Final.jar:na]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [netty-all-4.0.11.Final.jar:na]
    at java.lang.Thread.run(Thread.java:695) [na:1.6.0_65]

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-27 19:56
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥50 汇编语言除法溢出问题
  • ¥65 C++实现删除N个数据列表共有的元素
  • ¥15 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗