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());
-
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(); }
}
-
其中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();
}
}
} -
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()); -
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(); }
}
运行一段时间后出现错误如下:
[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]