时间服务器

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值