Netty 官方文档-自学笔记1
(创建一个时间服务)
该协议实现了netty 的TIME 协议部分。与以往案例发送一个32字节的消息,而不需要接受任可请求,一旦发送完信息后,就关闭连接。
在该协议中,我们将学习如何建立连接并发送消息及在完成通信后关闭连接。
由于我们当前忽视了接收到的数据,只是在建立连接后就发送消息,因此不需要用到channelRead()方法。不过,我们应该重载了 channelActive() 方法。
package io.netty.example.time;
public class TimeServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(final ChannelHandlerContext ctx) { // 当建立连接准备通信时,该方法被唤醒
final ByteBuf time = ctx.alloc().buffer(4); // 需要重新分配一个32位的字符流包含信息内容,通过.alloc()方法获取到ByteBufAllocator对象。
time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));
final ChannelFuture f = ctx.writeAndFlush(time); // (3)
f.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
assert f == future;
ctx.close();
}//channelFuture 代表一个I/O操作是否被执行,任何请求操作不会被执行,因为左右的操作在netty中是异步的,所以执行完channelFuture后,需要调用close方法,但是close不会立即执行,会先返回一个future
}); // (4)
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}