提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).childHandler(new TestServerInitializer());
Bootstrap bootstrap = new Bootstrap();
//设置相关参数
bootstrap.group(group)//设置线程组
.channel(NioSocketChannel.class)//设置客户端通道实现类(底层是反射)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyClientHandler());
}
});
Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置 整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类, ServerBootstrap 是服务端启动引导类
常见的方法有
• public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup),该方法 用于服务器端,用来设置两个 EventLoop
• public B group(EventLoopGroup group) ,该方法用于客户端,用来设置一个 EventLoop
• public B channel(Class<? extends C> channelClass),该方法用来设置一个服务器端的通道实现
• public B option(ChannelOption option, T value),用来给 ServerChannel 添加配置
• public ServerBootstrap childOption(ChannelOption childOption, T value),用来给接收到的 通道添加配置
• public ServerBootstrap childHandler(ChannelHandler childHandler),该方法用来设置业务处理类 (自定义的 handler)
• public ChannelFuture bind(int inetPort) ,该方法用于服务器端,用来设置占用的端口号
• public ChannelFuture connect(String inetHost, int inetPort) ,该方法用于客户端,用来连接服务器 端
1、Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理。但是可以 过一会等它执行完成或者直接注册一个监听,具体的实现就是通过 Future 和 ChannelFutures,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发 注册的监听事件
2、常见的方法有
• Channel channel(),返回当前正在进行 IO 操作的通道
• ChannelFuture sync(),等待异步操作执行完毕
public class NettyByteBuf01 {
public static void main(String[] args) {
//创建一个ByteBuf
//说明
//1. 创建 对象,该对象包含一个数组arr , 是一个byte[10]
//2. 在netty 的buffer中,不需要使用flip 进行反转
// 底层维护了 readerindex 和 writerIndex
//3. 通过 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="+buffer.capacity());//10
for (int i=0;i<buffer.capacity();i++){
System.out.println(buffer.readByte());
}
}
}
public class NettyByteBuf02 {
public static void main(String[] args) {
//创建ByteBuf
ByteBuf byteBuf = Unpooled.copiedBuffer("hello,world!", Charset.forName("utf-8"));
//使用相关的方法
if(byteBuf.hasArray()) { // true
byte[] content = byteBuf.array();
//将 content 转成字符串
System.out.println(new String(content, Charset.forName("utf-8")));
System.out.println("byteBuf=" + byteBuf);
System.out.println(byteBuf.arrayOffset()); // 0
System.out.println(byteBuf.readerIndex()); // 0
System.out.println(byteBuf.writerIndex()); // 12
System.out.println(byteBuf.capacity()); // 36
//System.out.println(byteBuf.readByte()); //
System.out.println(byteBuf.getByte(0)); // 104
int len = byteBuf.readableBytes(); //可读的字节数 12
System.out.println("len=" + len);
//使用for取出各个字节
for(int i = 0; i < len; i++) {
System.out.println((char) byteBuf.getByte(i));
}
//按照某个范围读取
System.out.println(byteBuf.getCharSequence(0, 4, Charset.forName("utf-8")));
System.out.println(byteBuf.getCharSequence(4, 6, Charset.forName("utf-8")));
}
}
}
hello,world!
byteBuf=UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 12, cap: 64)
0
0
12
64
104
len=12
h
e
l
l
o
,
w
o
r
l
d
!
hell
o,worl