? ? ? ?我這人比較懶,之前計(jì)劃每周至少一篇博客窒舟,但是自從寫(xiě)了幾篇之后再也沒(méi)減持下去嘲驾。最近有個(gè)小伙伴在http長(zhǎng)連接下面@我淌哟。因此呢,為了避免以后有人還問(wèn)辽故。所以這次我寫(xiě)一個(gè)http之tcp具體實(shí)現(xiàn)徒仓,幫助大家具體理解所謂的通信協(xié)議到底是什么。
? ? ? ?*******所謂的通信協(xié)議就是通信雙方約定的規(guī)則*******
? ? ? ? 比如對(duì)于tcp來(lái)說(shuō)誊垢,雙方約定建立鏈接時(shí)掉弛,相互hello對(duì)方一個(gè),發(fā)起這多hello一次喂走。結(jié)束時(shí)雙方bye一次殃饿,并相互確認(rèn)bye聽(tīng)到了。這就是tcp協(xié)議的一部分芋肠。當(dāng)然tcp協(xié)議很復(fù)雜乎芳,還有很多其他約定。
? ? ? ? http是以消息封裝在tcp消息體里的帖池。在傳輸層來(lái)看奈惑,http協(xié)議就是一個(gè)消息。網(wǎng)上具體背書(shū)式的介紹http協(xié)議我就不介紹了睡汹。請(qǐng)參看我寫(xiě)的http協(xié)議那篇里面有鏈接携取。下面直接討論http實(shí)現(xiàn)的主干邏輯。??
????????本文是使用ServerSocketChannel實(shí)現(xiàn)的帮孔。這個(gè)東西依賴于java。不知道其他語(yǔ)言怎么搞得不撑,沒(méi)考究過(guò)文兢。不過(guò)應(yīng)該萬(wàn)變不離其宗。
? ? ? ? 上圖為通過(guò)線程綁定端口焕檬,注冊(cè)通道姆坚,讓后通過(guò)線程啟動(dòng),來(lái)監(jiān)聽(tīng)web服務(wù)实愚。
上圖為接受tcp連接是個(gè)SocketChannel對(duì)象兼呵,讓后將SocketChannel放到線程池中處理兔辅。
讀通道里的tcp連接內(nèi)容。
????????這里的解析我就不貼代碼了击喂,因?yàn)樘L(zhǎng)维苔。解析就是讀tcp消息體,讓后http協(xié)議格式懂昂,解析http消息介时。http協(xié)議格式:
????????然后根據(jù)URL里面 鏈接地址,解析出對(duì)應(yīng)的處理方法進(jìn)行響應(yīng)處理凌彬。這就是http整個(gè)協(xié)議使用tcp實(shí)現(xiàn)的邏輯沸柔。因?yàn)槲沂鞘褂霉敬a。很多有業(yè)務(wù)邏輯代碼我沒(méi)有貼铲敛。所以看起來(lái)可能有點(diǎn)缺失褐澎。
? ? ? ? 建議大家可以去看jetty源碼,就可以理解了伐蒋。