Node.js实现TCP和HTTP并作简单的比较
TCP和Node
傳輸控制協(xié)議是一個(gè)面向連接的協(xié)議,換句話說,它是一個(gè)傳輸層的協(xié)議,它主要的職務(wù)呢,就是確保信息傳輸?shù)恼_性。
我們使用的很多如HTTP協(xié)議都是基于TCP的,為什么呢?因?yàn)槲覀儾幌M麄鬏數(shù)膆tml文件缺斤少兩吧,少了一個(gè)字符(字節(jié))都可能會(huì)造成全體的崩盤吧?
連接數(shù)據(jù)庫的時(shí)候我們用的其實(shí)也是TCP套接字。
本來吧,IP數(shù)據(jù)包的傳輸是無序的?這就是TCP存在的理由,我們總是需要一些規(guī)則來限定我們的生活。就像法律一樣,沒有法律,社會(huì)能安定嗎?所以,我們需要TCP。同時(shí),為了能夠更加自由,TCP是字符編碼不敏感的,它不計(jì)較傳輸文件流的字符,它只在乎傳輸過程安全穩(wěn)定。法律不在乎所謂人情,它只要理性,它也只負(fù)責(zé)處理結(jié)果。
- 話不多說,上代碼,首先我們先確保我們的telnet服務(wù)是打開的(win7默認(rèn)是關(guān)閉的)
這是我們的服務(wù)器,用的是http的模塊,實(shí)際上net才是tcp的模塊
之后新建一個(gè)cmd窗口,telnet 127.0.0.1 3000如果沒有報(bào)錯(cuò)就是連接成功了~
- 接下來,我們進(jìn)行代碼2的編寫
之后我們再次開一個(gè)新窗口telnet localhost 300 , 我們發(fā)現(xiàn),屏幕輸出了新的連接這樣一排字。
這一次我們使用的是net模塊,因此我們也可以很好的理解,http是封裝在tcp之上的協(xié)議。
其實(shí)express就是又在http上封裝了一層(參見req,res),而koa則相當(dāng)于在http上封裝了兩層(參見ctx.req,ctx.res)
修改上述代碼,用cmd寫telnet再試試?事情變得非常有趣了哈哈哈!
TCP和HTTP服務(wù)器有著兩個(gè)本質(zhì)的區(qū)別,其一,那就是回調(diào)類型中對象的類型。net服務(wù)器中它是一個(gè)連接對象,而HTTP服務(wù)器中,則是請求和相應(yīng)對象。
其二,就是,瀏覽器在訪問站點(diǎn)的時(shí)候不會(huì)只用一個(gè)連接,很多主流瀏覽器為了速度一次會(huì)同時(shí)打開七八個(gè)連接,并發(fā)送請求。
HTTP是比TCP更高層的API。
默認(rèn)情況下,Node會(huì)告訴瀏覽器保持連接,因?yàn)槎啻螖嚅_TCP在打開TCP這樣更影響效率。
下面我用HTTP來實(shí)現(xiàn)一個(gè)簡單的請求的過程(或者說客戶端和服務(wù)器會(huì)話?)
server.js
let http=require('http'); http.createServer((req,res)=>{res.writeHead(200);res.end('Hello,world'); }).listen(3000);client.js
let http=require('http'); let _http_req={host:'127.0.0.1',port:3000,url:'/',method:'GET' }; http.request(_http_req,(res)=>{let content='';res.setEncoding('utf-8');res.on('data',(chunk)=>{content+=chunk;});res.on('end',()=>{console.log(content);}); }).end();使用 http.request() 必須總是調(diào)用 req.end()來表明請求的結(jié)束,即使沒有數(shù)據(jù)被寫入請求主體。
轉(zhuǎn)載于:https://www.cnblogs.com/can-i-do/p/7144480.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Node.js实现TCP和HTTP并作简单的比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET里创建Microsoft
- 下一篇: 专题——背包问题