Time协议实现
一.Time协议
Time协议,此协议提供了一个独立于站点的,机器可读的日期和时间信息。时间服务返回的是以秒数,是从1900年1月1日午夜到现在的秒数。
二.服务端
(1)TimeServerHandler
package com.jd.zteam.excelInsert.netty;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class TimeServerHandler extends ChannelInboundHandlerAdapter {
/**
* channelActive():当一个连接被建立并且准备产生流量(traffic)的时候
* @author lvgaofan
* @date 2019/8/26
* @param
* @return
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//为了发送消息,我们需要产生一个新的buffer用于放消息
//因为例子当中要放一个32位的Integer,因此需要一个ByteBuf(容量至少4bytes)
//通过ctx.alloc()获得ByteBufAllocator接口的实现,ByteBufAllocator用于分配产生buffers
//为啥ByteBuf不用调用Nio当中的flip()方法?因为它不包含flip()方法而是将他分为两点:一个负责读操作一个负责写操作
//负责写操作的当ByteBuf写入的时候它的索引就会增加,而负责读操作的索引不会变化
//负责读和负责写他们各自的索引代表了消息开始和结束的地方,Nio没有这种明确的方式,只能用flip,这就会造成你忘记调用flip时,
//发送错误的数据或者发送空消息这一问题
final ByteBuf time = ctx.alloc().buffer(4);
time.writeInt((int)(System.currentTimeMillis()/1000+2208988800L));
//ChannelFuture代表一个还未发生的I/O操作
//ChannelFuture意味着任何请求操作可能未被执行,因为Netty是异步的
final ChannelFuture future = ctx.writeAndFlush(time);
//当调用write()方法返回ChannelFuture并且已经是完成状态时,你需要调用close方法
//那么我们怎么知道请求已经完成了呢?最简单的方式就是为ChannelFuture添加一个ChannelFutureListener监听
//他会告诉我们这个Channe