Netty中所有的IO操作都是异步的, 不能立刻得知消息是否被正确处理, 但是可以过一会等它执行完成或者直接注册一个监听器, 具体的实现就是通过Future和ChannelFuture, 他们可以注册一个监听, 当操作执行成功或者失败时监听会自动触发注册的监听事件
常见方法:
ChannelPipeline是一个重点:
入站 出站
案例一
package com.dance.netty.netty.buf;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
public class NettyByteBuf01 {
public static void main(String[] args) {
/*
* 创建一个ByteBuf
* 创建对象, 该对象包含一个数组arr, 是一个byte[10]
* 在Netty的Buffer中, 不需要使用flip进行反转
* 底层维护了readerIndex 和 writerIndex
* 通过readerIndex, writerIndex, capacity 将buffer分为三个区域
* 0 -> readerIndex : 已读区域
* readerIndex -> writerIndex : 未读区域
* writerIndex -> capacity : 可写区域
*/
ByteBuf buffer = Unpooled.buffer(10);
for (int i = 0; i < 10; i++) {
buffer.writeByte(i);
}
System.out.println("capacity is "+buffer.capacity());
// readByte会使 readerIndex增长 如果指定位置则不会
for (int i = 0; i < buffer.capacity(); i++) {
System.out.println(buffer.readByte());
}
}
}
案例二
package com.dance.netty.netty.buf;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.nio.charset.StandardCharsets;
public class NettyByteBuf02 {
public static void main(String[] args) {
ByteBuf byteBuf = Unpooled.copiedBuffer("hello,world!", StandardCharsets.UTF_8);
// 调用相关的方法
if(byteBuf.hasArray()){
// 获取字节数组
byte[] array = byteBuf.array();
// 转为字符串输出
System.out.println(new String(array,StandardCharsets.UTF_8));
// 输出ByteBuf
System.out.println("byte buf is " + byteBuf);
// 数组偏移量
System.out.println(byteBuf.arrayOffset());
// readerIndex 位置
System.out.println(byteBuf.readerIndex());
// writerIndex 位置
System.out.println(byteBuf.writerIndex());
// capacity 边界
System.out.println(byteBuf.capacity());
// 读取宇哥字节
System.out.println(byteBuf.readByte());
// 读取指定位置的一个字节
System.out.println(byteBuf.getByte(0));
// 可读的字节数
System.out.println(byteBuf.readableBytes());
for (int i = 0; i < byteBuf.readableBytes(); i++) {
System.out.println((char)byteBuf.getByte(i));
}
// 从0开始读取4个字节
System.out.println(byteBuf.getCharSequence(0, 4, StandardCharsets.UTF_8));
// 从4开始读取6个字节
System.out.println(byteBuf.getCharSequence(4, 6, StandardCharsets.UTF_8));
}
}
}