剛接觸Netty,寫的不好敬請諒解。
最近有一個需求,需要從客戶端客戶端定時的向服務器發送數據,通知服務器自己的一些狀態信息,比如本地的cup使用率,內存使用率等信息,大體實現如下:
是用到了java提供的線程池,newScheduledThreadPool:定長線程池,支持定時及周期性任務執行。
TestTask.java:
public class TestTask implements Runnable {
private final ChannelHandlerContext ctx;
public TestTask(ChannelHandlerContext ctx) {
this.ctx = ctx;
}
@Override
public void run() {
//do something
ctx.writeAndFlush(Unpooled.copiedBuffer(String.valueOf(System.currentTimeMillis()), CharsetUtil.UTF_8));
}
}
此類中的run方法可以執行其他的業務操作。
此處是客戶端需要向服務器發送定時數據,故:
NettyClientHandler:
public class NettyClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private ScheduledFuture<?> heartBeat;
@Override
public void channelActive(ChannelHandlerContext ctx) {
this.heartBeat = this.scheduler.scheduleWithFixedDelay(new TestTask(ctx),0,2,TimeUnit.SECONDS);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
System.out.println("channelInactive 連接斷開了");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
服務器代碼常規處理即可,此處並沒有證書認證之類的操作,故
this.heartBeat = this.scheduler.scheduleWithFixedDelay(new TestTask(ctx),0,2,TimeUnit.SECONDS);
寫在了channelActive方法中,若需要證書認證的操作,則channelActive中做證書認證的操作,而定時任務的操作寫在channelRead0方法中即可。
此處是客戶端向服務器發送定時任務,若服務器向客戶端發送定時任務,則做相應修改即可。
也可做一些心跳檢測之類的業務操作。
————————————————
版權聲明:本文為CSDN博主「小夢_人生如戲」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yu532164710/article/details/83210940