Bootstrap ServerBootstrap
Bootstrap的意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty的Bootstrap是客户端的引导开始类,ServerBootstrap是服务端的引导开始类。
常用的API有:
//该方法用于设置服务器端的BossGroup和WorkerGroup,第一个参数是BossGroup,第二个参数是WorkerGroup
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup)
//该方法用于设置通道的类型,如果是服务端就设置NioServerSocketChannel,客户端就NioSocketChannel
public B channel(Class<? extends C> channelClass)
//设置BossGroup的通道的配置项,通常是一些tcp的配置,option是配置项,value是值。
public <T> B option(ChannelOption<T> option, T value)
//设置WorkerGroup的通道的配置项
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value)
//用来设置WorkerGroup的Socketchannel的pipeline里面的处理器。通常添加自己的业务处理类
public ServerBootstrap childHandler(ChannelHandler childHandler)
//绑定地址。
public ChannelFuture bind(String inetHost, int inetPort)
//下面两个是Bootstrap常用,也会有上面的API在这个使用
//连接服务器。
public ChannelFuture connect(String inetHost, int inetPort)
//设置客户端的IO线程组。workerGroup
public B group(EventLoopGroup group)
Future、ChannelFuture
Netty中的所有IO操作都是异步的,不能立即得知消息是否被正确处理,所以可以使用这个并通过添加回调,使得可以在回调中进行处理。
如下代码:
public class ServerGroupChatServer {
public ConcurrentSkipListSet<SocketChannel> socketChannels = new ConcurrentSkipListSet();
private int port;
public ServerGroupChatServer(int port){
this.port = port;
}
public void start() throws InterruptedException {
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG,128)
.childOption(ChannelOption.SO_KEEPALIVE,true)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
//socketChannels.add(socketChannel);
//socketChannel.pipeline().addLast(new MyNettyChannelHandler(socketChannels));
}
});
ChannelFuture bindFuture = serverBootstrap.bind("127.0.0.1", port);
bindFuture.addListener(new GenericFutureListener<Future<? super Void>>() {
@Override
public void operationComplete(Future<? super Void> future) throws Exception {
//bindFuture是bind操作返回的返回值,在这里添加一个Listener后,当绑定成功后,会执行这个监听回调。
//像其他返回ChannelFuture的操作皆可如此做。
@Override
public void operationComplete(Future<? super Void> future) throws Exception {
boolean success = future.isSuccess();
if (success)
System.out.println("服务绑定成功");
else{
System.out.println("服务绑定失败");
}
}
}
});
bindFuture.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws InterruptedException {
ServerGroupChatServer serverGroupChatServer = new ServerGroupChatServer(9898);
serverGroupChatServer.start();
}
}
future常见API:
//是否完成,完成就会触发监听回调,但是已完成不代表成功,也有可能失败
boolean isDone();
//是否执行成功
boolean isSuccess();
//是否可取消
boolean isCancellable();
//取消
boolean cancel(boolean var1);
//是否已经被取消
boolean isCancelled();
//添加一个监听器,当isDone方法
Future<V> addListener(GenericFutureListener<? extends Future<? super V>> var1);
//当发生异常时,返回具体异常。
Throwable cause();
//化异步为同步,也就是如果调用这个方法,会阻塞当前线程,直到异步任务完成。
ChannelFuture sync() throws InterruptedException;
//获取返回结果,这个方法是阻塞的,直到异步任务执行完成返回返回值,还有一些其他超时的重载方法。
V get()
//下面是channelFuture
//获取当前进行IO操作的通道
Channel channel();
结果:
channel
- 是Netty网络通信的组件,能够用于执行网络IO操作(读写等)。
- 通过Channel可以获得当前网络连接的通道状态。
- 通过Channel可以获得网络连接的配置参数。
- Channel提供了异步非阻塞的IO操作,异步非阻塞表示任何IO调用都将立即返回,不进行等待,并且不能保证IO操作能够立即完成,只能通过事件回调和事件监听来处理。
- 调用立即返回一个ChannelFuture实例,通过注册监听器到ChannelFuture上,可以对IO操作的成功/失败/取消等结果进行回调处理。
不同协议,对应的channel类型会有所不同。
- NioServerSocketChannel :异步的服务端TCP Socket连接。
- NioSocketChannel:异步的客户端TCP Socket连接。
- NioDatagramChannel:异步的UDP连接。
- NioSctpChannel:异步的客户端Sctp连接。
- NioSctpServerChannel:异步的Sctp服务端连接。
Selector
- Netty基于Selector对象实现IO多路复用,通过Selector,一个线程可以监听多个channel事件。
- 当向一个Selector中注册了某个channel并且指定了相关感兴趣事件后,Selector内部机制就可以监控这些channel是否有就绪的IO事件(比如可读、可写等),并对相应发生事件进行处理,就可以实现一个程序处理多个Channel的情况。
剩下几个核心组件另开篇章