tomcat源碼分析(3) Connector 分析

快速創(chuàng)建Connector測(cè)試類

1.創(chuàng)建類名為TestConnector,執(zhí)行main方法

public class TestConnector {
    public static void main(String[] args) throws Exception {
        Connector connector = new Connector("HTTP/1.1");
        connector.setPort(8080);
        connector.init();//protocolHandler.init(); 這里主要是綁定8080端口的ServerSocketChannel
        /**
         * 替換init的Adapter初始化
         * adapter = new CoyoteAdapter(this); //連接Service的橋梁沫勿,通過(guò)他將request response 傳入到webapps 的應(yīng)用當(dāng)中
         * protocolHandler.setAdapter(adapter);
         * Adapter是對(duì)讀寫(xiě)io的數(shù)據(jù)與業(yè)務(wù)處理的適配
         */
        connector.getProtocolHandler().setAdapter(new Adapter() {
            @Override
            public void service(Request req, Response res) throws Exception {
                res.setStatus(200);
                res.doWrite(ByteBuffer.wrap("Hello World...".getBytes()));
            }

            @Override
            public boolean prepare(Request req, Response res) throws Exception {
                return false;
            }

            @Override
            public boolean asyncDispatch(Request req, Response res, SocketEvent status) throws Exception {
                return false;
            }

            @Override
            public void log(Request req, Response res, long time) {
            }

            @Override
            public void checkRecycled(Request req, Response res) {
            }

            @Override
            public String getDomain() {
                return null;
            }
        });
        connector.start();
        System.in.read();
    }
}

2.瀏覽器輸入http://127.0.0.1:8080/ 頁(yè)面返回Hello World...
3.Connector的構(gòu)造函數(shù)中使用setProtocol進(jìn)行協(xié)議的選擇創(chuàng)建ProtocolHandler

public Connector(String protocol) {
        setProtocol(protocol);
        // Instantiate protocol handler
        ProtocolHandler p = null;
        try {
            Class<?> clazz = Class.forName(protocolHandlerClassName);
            p = (ProtocolHandler) clazz.getConstructor().newInstance();
        } catch (Exception e) {
            log.error(sm.getString(
                    "coyoteConnector.protocolHandlerInstantiationFailed"), e);
        } finally {
            this.protocolHandler = p;
        }
        //省略非關(guān)鍵代碼....
}
public void setProtocol(String protocol) {
    boolean aprConnector = AprLifecycleListener.isAprAvailable() &&
            AprLifecycleListener.getUseAprConnector();
    if ("HTTP/1.1".equals(protocol) || protocol == null) {
        if (aprConnector) {
            setProtocolHandlerClassName("org.apache.coyote.http11.Http11AprProtocol");
        } else {
            setProtocolHandlerClassName("org.apache.coyote.http11.Http11NioProtocol");
        }
    } else if ("AJP/1.3".equals(protocol)) {
        if (aprConnector) {
            setProtocolHandlerClassName("org.apache.coyote.ajp.AjpAprProtocol");
        } else {
            setProtocolHandlerClassName("org.apache.coyote.ajp.AjpNioProtocol");
        }
    } else {
        setProtocolHandlerClassName(protocol);
    }
}

4.connector.init();

@Override
protected void initInternal() throws LifecycleException {
    ...  
    adapter = new CoyoteAdapter(this);
    protocolHandler.setAdapter(adapter);
    ...
    try {
        protocolHandler.init();//bind() serverSock.socket().bind(addr,getAcceptCount());
    } catch (Exception e) {
        throw new LifecycleException(
                sm.getString("coyoteConnector.protocolHandlerInitializationFailed"), e);
    }
    ...
}

5.connector.start();

@Override
protected void startInternal() throws LifecycleException {
    ...
    try {
        protocolHandler.start();//開(kāi)始接受tcp請(qǐng)求連接
    } catch (Exception e) {
        throw new LifecycleException(
                sm.getString("coyoteConnector.protocolHandlerStartFailed"), e);
    }
    ...
}

6.通過(guò)上述步驟中我們發(fā)現(xiàn)connector 中大部分操作都是基于protocolHandler (默認(rèn)不啟動(dòng)apr我們使用的是org.apache.coyote.http11.Http11NioProtocol)茧吊。我們腦子里會(huì)出現(xiàn)大體的流程 protocolHandler 創(chuàng)建服務(wù)器套接字并將其綁定到指定的本地8080端口,偵聽(tīng)并接受到此套接字的連接,將讀取的數(shù)據(jù)封裝為request 創(chuàng)建response,傳入到Adapter 進(jìn)行業(yè)務(wù)處理(寫(xiě)入響應(yīng)碼:200 寫(xiě)入body:Hello World...)將response中通過(guò)socket返回客戶端。這個(gè)只是可以簡(jiǎn)單的描述流程川蒙,這個(gè)過(guò)程中涉及到nio的實(shí)現(xiàn),線程模型的設(shè)計(jì)长已,長(zhǎng)短連接的控制畜眨,如何通過(guò)優(yōu)化提高并發(fā),會(huì)在后續(xù)分析Http11NioProtocol中設(shè)計(jì)

7.補(bǔ)充發(fā)一下張圖片(http1.1默認(rèn)是開(kāi)始keepalive)
訪問(wèn)tomcat抓包的內(nèi)容.png

注意:Wireshark中npcap可以進(jìn)行抓取127.0.0.1的數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末术瓮,一起剝皮案震驚了整個(gè)濱河市康聂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胞四,老刑警劉巖早抠,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撬讽,居然都是意外死亡蕊连,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門游昼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甘苍,“玉大人,你說(shuō)我怎么就攤上這事烘豌≡赝ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)囚聚。 經(jīng)常有香客問(wèn)我靖榕,道長(zhǎng),這世上最難降的妖魔是什么顽铸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任茁计,我火速辦了婚禮,結(jié)果婚禮上谓松,老公的妹妹穿的比我還像新娘星压。我一直安慰自己,他們只是感情好鬼譬,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布娜膘。 她就那樣靜靜地躺著,像睡著了一般优质。 火紅的嫁衣襯著肌膚如雪竣贪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天巩螃,我揣著相機(jī)與錄音演怎,去河邊找鬼。 笑死牺六,一個(gè)胖子當(dāng)著我的面吹牛颤枪,可吹牛的內(nèi)容都是我干的汗捡。 我是一名探鬼主播淑际,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扇住!你這毒婦竟也來(lái)了春缕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艘蹋,失蹤者是張志新(化名)和其女友劉穎锄贼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體女阀,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宅荤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浸策。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冯键。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖庸汗,靈堂內(nèi)的尸體忽然破棺而出惫确,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布改化,位于F島的核電站掩蛤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陈肛。R本人自食惡果不足惜揍鸟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燥爷。 院中可真熱鬧蜈亩,春花似錦、人聲如沸前翎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)港华。三九已至道川,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間立宜,已是汗流浹背冒萄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橙数,地道東北人尊流。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灯帮,于是被迫代替她去往敵國(guó)和親崖技。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理钟哥,服務(wù)發(fā)現(xiàn)迎献,斷路器,智...
    卡卡羅2017閱讀 134,716評(píng)論 18 139
  • CONNECTOR的初始化 我們知道Tomcat中有很多容器腻贰,包括Server吁恍、Service、Connector...
    allenhai閱讀 1,130評(píng)論 0 2
  • 0 系列目錄# WEB請(qǐng)求處理 WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理 WEB請(qǐng)求處理二:Nginx請(qǐng)求反向代理 本...
    七寸知架構(gòu)閱讀 13,971評(píng)論 22 190
  • 生活是非常有意義的事情播演,原因不是因?yàn)椴皇撬囊饬x冀瓦,而是因?yàn)槟阈枰ヌ剿魉囊饬x。這真的簡(jiǎn)直就是不可理喻写烤。 總是會(huì)發(fā)...
    麥麥小公主__閱讀 312評(píng)論 1 1
  • 最近工作比較忙翼闽,所以也沒(méi)有時(shí)間靜下來(lái)沉淀一下。為什么寫(xiě)博客顶霞,更重要的是對(duì)自己所學(xué)的東西的一種沉淀和記錄吧肄程。1.UI...
    __夏至未至閱讀 424評(píng)論 0 2