日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node.js实现TCP和HTTP并作简单的比较

發(fā)布時(shí)間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node.js实现TCP和HTTP并作简单的比较 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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的模塊
let http=require('http'); http.createServer((req,res)=>{res.writeHead(200,{'Content-Type':'text/html'});res.end('<h1>haha</h1>'); }).listen(3000);

之后新建一個(gè)cmd窗口,telnet 127.0.0.1 3000如果沒有報(bào)錯(cuò)就是連接成功了~

  • 接下來,我們進(jìn)行代碼2的編寫
let net=require('net'); let server=net.createServer(function(conn){console.log("新的連接"); }); server.listen(3000,function(){console.log('\033[96m server listening on *:3000\033[39m'); })

之后我們再次開一個(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再試試?事情變得非常有趣了哈哈哈!

console.log("新的連接");console.log("當(dāng)前有"+count+"個(gè)連接!");count++;conn.on('close',function(){count--;console.log("1個(gè)連接已斷開,現(xiàn)在有"+count+"個(gè)連接")});conn.on('data',function(data){conn.setEncoding('utf-8'); //如果不設(shè)置它下方的注釋就成真了console.log(data);// buffer類型});

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。