当前位置:web 服务器 > Tomcat >>

Tomcat源码分析(二)--连接处理

 目标:在这篇文章希望搞明白http请求到tomcat后是怎么由连接器转交到容器的?
      在上一节里已经启动了一个HttpConnector线程,并且也启动了固定数量的HttpProcessor线程。HttpConnector用来等待http连接,得到http连接后交给其中的一个HttpProcessor线程来处理。接下里具体看一下HttpConnector是怎么得到连接得,以及HttpProcessor是怎么处理的。当启动了HttpConnector线程后(在上一节已经知道怎么启动了),便在它的run方法里面循环等待:
[java] 
public void run() { 
    // Loop until we receive a shutdown command 
    while (!stopped) { 
        // Accept the next incoming connection from the server socket 
        Socket socket = null; 
        try { 
            socket = serverSocket.accept(); 
            if (connectionTimeout > 0) 
                socket.setSoTimeout(connectionTimeout); 
            socket.setTcpNoDelay(tcpNoDelay); 
        } catch (AccessControlException ace) { 
            log("socket accept security exception", ace); 
            continue; 
        } catch (IOException e) { 
            try { 
                // If reopening fails, exit 
                synchronized (threadSync) { 
                    if (started && !stopped) 
                        log("accept error: ", e); 
                    if (!stopped) { 
                        serverSocket.close(); 
                        serverSocket = open(); 
                    } 
                } 
                 
            } catch (IOException ioe) { 
                log("socket reopen, io problem: ", ioe); 
                break; 
            } catch (KeyStoreException kse) { 
                log("socket reopen, keystore problem: ", kse); 
                break; 
            } catch (NoSuchAlgorithmException nsae) { 
                log("socket reopen, keystore algorithm problem: ", nsae); 
                break; 
            } catch (CertificateException ce) { 
                log("socket reopen, certificate problem: ", ce); 
                break; 
            } catch (UnrecoverableKeyException uke) { 
                log("socket reopen, unrecoverable key: ", uke); 
                break; 
            } catch (KeyManagementException kme) { 
                log("socket reopen, key management problem: ", kme); 
                break; 
            } 
 
            continue; 
        } 
 
        // Hand this socket off to an appropriate processor 
        HttpProcessor processor = createProcessor(); 
        if (processor == null) { 
            try { 
                log(sm.getString("httpConnector.noProcessor")); 
                socket.close(); 
            } catch (IOException e) { 
                ; 
            } 
            continue; 
        } 
      
        processor.assign(socket); 
 
    } 
 
    // Notify the threadStop() method that we have shut ourselves down 
  
    synchronized (threadSync) { 
        threadSync.notifyAll(); 
    } 
 

这里很关键的就是socket = serverSocket.accept();和processor.assign(socket); 在循环里面内,serverSocket.accept();负责接收http请求然后赋值给socket,最后交给其中一个processor处理。这里processor并不是等到需要的时候再实例化,而是在HttpConnector初始化的时候已经有了若干个processor,在httpConnector里有这样一个声明:
[java] 
private Stack processors = new Stack(); 
表明httpConnector里面持有一个包含HttpProcessor对象的栈,需要的时候拿出来就是了。看一下createProcessor函数就能比较明白了:
[java] 
pr

补充:软件开发 , Java ,
Apache
IIS
Nginx
Tomcat
如果你遇到web 服务器难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,