一、 前言
Tomcat中接受请求的组件是connector,本文就来研究下tomcat中BIO方式和NIO方式接受请求的原理。
二、 Connector
研究过tomcat的童鞋应该都知道tomcat的容器构造:
Connector是一个桥梁它把Server和Engine链接了起来,Connector的作用是接受客户端端的请求,然后把请求委托为engine容器去处理。
三、 NioEndpoint
3.1 主流程启动时序
下面首先分析下套接字绑定代码:
public void bind() throws Exception { //创建服务套接字
serverSock = ServerSocketChannel.open();
socketProperties.setProperties(serverSock.socket());
InetSocketAddress addr = (getAddress()!=null?new InetSocketAddress(getAddress(),getPort()):new InetSocketAddress(getPort()));
serverSock.socket().bind(addr,getBacklog());
serverSock.configureBlocking(true); //打开阻塞模式
serverSock.socket().setSoTimeout(getSocketProperties().getSoTimeout()); // 初始化接受线程个数和轮询链接套接字状态线程个数
if (acceptorThreadCount == 0) { // FIXME: Doesn't seem to work that well with multiple accept threads
acceptorThreadCount = 1;
} if (pollerThreadCount <= 0) { //minimum one poller thread
pollerThreadCount = 1;
}
stopLatch = new CountDownLatch(pollerThreadCount); // Initialize SSL if needed
if (isSSLEnabled()) {
SSLUtil sslUtil = handler.getSslImplementation().getSSLUtil(this);
sslContext = sslUtil.createSSLContext();
sslContext.init(wrap(sslUtil.getKeyManagers()),
sslUtil.getTrustManagers(), null);
SSLSessionContext sessionContext =
sslContext.getServerSessionContext(); if (sessionContext != null) {
sslUtil.configureSessionContext(sessionContext);
} // Determine which cipher suites and protocols to enable
enabledCiphers = sslUtil.getEnableableCiphers(sslContext);
enabledProtocols =