//代码还是源于官方文档
package netty;
import java.util.Date;
//定义一个数据模型
//2208988800为1900年1月1日00:00:00~1970年1月1日00:00:00的总秒数
public class UnixTime {
private final long value;
public UnixTime() {
this(System.currentTimeMillis() / 1000L + 2208988800L);//计算时间的公式
}
public UnixTime(long value) {
this.value = value;
}
public long value() {
return value;
}
@Override
public String toString() {
return new Date((value() - 2208988800L) * 1000L).toString();
}
}
编码:将人类语言转化位机器语言为编码,即文字到0和1
解码:将机器语言转化为人类语言即解码
时间编码类:
package netty;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.MessageToByteEncoder;
/**
* @description 编写一个编码器将UnixTime对象重新转换位一个ByteBuf
*/
//public class TimeEncoder extends ChannelOutboundHandlerAdapter {
//
// //第一,通过 ChannelPromise,当编码后的数据被写到了通道上 Netty 可以通过这个对象标记是成功还是失败。
// //第二, 我们不需要调用 cxt.flush()。因为处理器已经单独分离出了一个方法 void flush(ChannelHandlerContext cxt),如果像自己实现 flush() 方法内容可以自行覆盖这个方法,也就是默认会调用flush()
// @Override
// public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
// UnixTime m = (UnixTime) msg;
// ByteBuf encoded = ctx.alloc().buffer();
// encoded.writeInt((int)m.value());
// ctx.write(encoded,promise);//(1)
//
// }
// @Override
// public void flush(ChannelHandlerContext ctx) throws Exception {
// super.flush(ctx);
// }
//}
/**
* @description 上面代码的简化操作
*/
public class TimeEncoder extends MessageToByteEncoder<UnixTime> {
@Override
protected void encode(ChannelHandlerContext ctx, UnixTime msg, ByteBuf out) throws Exception {
out.writeInt((int)msg.value());
}
}
时间解码类:
package netty;
import io.netty.buffer.ByteBuf