4.2 自动绑定递增端口

上面代码绑定了8000端口,接下来我们实现一个稍微复杂点的逻辑。我们指定一个起始端口号,比如1000;然后从1000端口往上找一个端口,直到这个端口能够绑定成功。比如1000端口不可用,我们就尝试绑定1001端口,然后1002端口,以此类推。

serverBootstrap.bind(8000)方法是一个异步方法,调用之后是立即返回的,它的返回值是一个ChannelFuture。我们可以给这个ChannelFuture添加一个监听器GenericFutureListener,然后在GenericFutureListener的operationComplete方法里,监听端口是否绑定成功。下面是监听端口是否绑定成功的代码片段。

接下来就可以从1000端口开始,往上找端口号,直到端口绑定成功。我们要做的就是在if (future.isSuccess())的else逻辑里重新绑定一个递增的端口。我们从这段绑定逻辑中抽取出一个bind方法。

上述代码中最关键的就是在端口绑定失败之后,重新调用自身方法,并且把端口号加一,这样,在我们的主流程里面就可以直接调用。

读者可以自行修改代码,运行之后看到效果,最终会发现,端口成功绑定在了1024。从1000开始到1023,端口均绑定失败,这是因为在笔者的Mac系统下,1023以下的端口号都被系统保留了,需要ROOT权限才能绑定。

以上就是自动绑定递增端口的逻辑。接下来,我们一起学习一下,服务端启动引导类ServerBootstrap除了指定线程模型、IO模型、连接读写处理逻辑,还可以做哪些事情?