public B channel(Class<? extends C> channelClass) { if (channelClass == null) { throw new NullPointerException("channelClass"); } return channelFactory(new ReflectiveChannelFactory<C>(channelClass));}
ReflectiveChannelFactory 反射的核心实现如下:
public ReflectiveChannelFactory(Class<? extends T> clazz) { if (clazz == null) { throw new NullPointerException("clazz"); } this.clazz = clazz;}@Overridepublic T newChannel() { try { return clazz.getConstructor().newInstance(); } catch (Throwable t) { throw new ChannelException("Unable to create Channel from class " + clazz, t); }}
实际上就是通过 NioServerSocketChannel 创建了 Channel 对象 。
启动类设置 Handler启动类可以为启动服务类和父类,分别设置 Handler 。
这个也是一开始老马学习 netty 比较迷惑的地方,这两个有啥区别呢?
文章插图
输入图片说明
本质区别:
(1)ServerBoostrap 中的 Handler 是 NioServerSocketChannel 使用的,所有连接这个监听端口的客户端都会执行 。
(2)父类 AbstractServerBoostrap 中的 Handler 是一个工厂类,会为每一个接入的客户端都创建一个新的 Handler 。
端口绑定最后,还有服务端的端口绑定 。我们上面只是简单的过了一下,这里做一下展开:
private ChannelFuture doBind(final SocketAddress localAddress) { //1. 创建 channel 并注册 final ChannelFuture regFuture = initAndRegister(); final Channel channel = regFuture.channel(); if (regFuture.cause() != null) { return regFuture; } //2. 创建完成后,设置对应的附加属性 if (regFuture.isDone()) { // At this point we know that the registration was complete and successful. ChannelPromise promise = channel.newPromise(); doBind0(regFuture, channel, localAddress, promise); return promise; } else { // Registration future is almost always fulfilled already, but just in case it's not. final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel); regFuture.addListener(new ChannelFutureListener() { //3. 添加监听器 @Override public void operationComplete(ChannelFuture future) throws Exception { Throwable cause = future.cause(); if (cause != null) { // Registration on the EventLoop failed so fail the ChannelPromise directly to not cause an // IllegalStateException once we try to access the EventLoop of the Channel. promise.setFailure(cause); } else { // Registration was successful, so set the correct executor to use. // See https://github.com/netty/netty/issues/2586 promise.registered(); doBind0(regFuture, channel, localAddress, promise); } } }); return promise; }}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Netty 实战:如何实现文件服务器?
- Netty 实战:如何实现 HTTP 服务器?
- 什么是2021年最佳的后端开发框架
- 如何实现几百台SIP终端实现自动化部署
- 如何在 Linux 终端查看图像
- 浅谈linux下基于UDP服务的负载均衡方法
- 粽子是端午节的必备食物据说在春秋时期 关于端午粽子的由来
- 端午节五彩线的颜色 端午节绑五色线的意义
- 驱五毒是什么节日 端午节的五毒有哪些
- 课后服务申请理由怎么写?