Tomcat 中的 NIO 源码分析
在 NioEndpoint init 的时候,我们开启了一个 ServerSocketChannel,后来 start 的时候,我们开启多个 acceptor(实际上,默认是 1 个),每个 acceptor 启动以后就开始循环调用 ServerSocketChannel 的 accept 方法获取新的连接,然后调用 endpoint.setSocketOptions(socket) 处理新的连接,之后再进入循环 accept 下一个连接。 到这里,大家应该也就知道了,为什么这个叫 acceptor 了吧?接下来,我们来看看 setSocketOptions 方法到底做了什么。 NioEndpoint # setSocketOptions @Override protected booleansetSocketOptions(SocketChannel socket) { try { // 设置该 SocketChannel 为非阻塞模式 socket.configureBlocking(false); Socket sock = socket.socket; // 设置 socket 的一些属性 socketProperties.setProperties(sock);
// 还记得 startInternal 的时候,说过了 nioChannels 是缓存用的。 // 限于篇幅,这里的 NioChannel 就不展开了,它包括了 socket 和 buffer NioChannel channel = nioChannels.pop; if (channel == ) { // 主要是创建读和写的两个 buffer,默认地,读和写 buffer 都是 8192 字节,8k SocketBufferHandler bufhandler = new SocketBufferHandler( socketProperties.getAppReadBufSize, socketProperties.getAppWriteBufSize, socketProperties.getDirectBuffer); if (isSSLEnabled) { channel = new SecureNioChannel(socket, bufhandler, selectorPool, this); } else { channel = new NioChannel(socket, bufhandler); } } else { channel.setIOChannel(socket); channel.reset; }
// getPoller0 会选取所有 poller 中的一个 poller getPoller0.register(channel); } catch (Throwable t) { ExceptionUtils.handleThrowable(t); try { log.error("",t); } catch (Throwable tt) { ExceptionUtils.handleThrowable(tt); } // Tell to close the socket return false; } return true; } (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |