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]