websocket學(xué)習(xí)

websocket的定義

WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議每辟。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455瞳步,并由RFC7936補(bǔ)充規(guī)范黎做。WebSocket API也被W3C定為標(biāo)準(zhǔn)伐债。
WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單嫁艇,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)攀芯。在WebSocket API中附鸽,瀏覽器和服務(wù)器只需要完成一次握手脱拼,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸坷备。

websocket的優(yōu)勢(shì):

  1. 較少的控制開銷熄浓。
  2. 更強(qiáng)的實(shí)時(shí)性。由于協(xié)議是全雙工的省撑,所以服務(wù)器可以隨時(shí)主動(dòng)給客戶端下發(fā)數(shù)據(jù)赌蔑。相對(duì)于HTTP請(qǐng)求需要等待客戶端發(fā)起請(qǐng)求服務(wù)端才能響應(yīng),延遲明顯更少竟秫;即使是和Comet等類似的長(zhǎng)輪詢比較娃惯,其也能在短時(shí)間內(nèi)更多次地傳遞數(shù)據(jù)。
  3. 保持連接狀態(tài)肥败。與HTTP不同的是趾浅,Websocket需要先創(chuàng)建連接愕提,這就使得其成為一種有狀態(tài)的協(xié)議,之后通信時(shí)可以省略部分狀態(tài)信息皿哨。而HTTP請(qǐng)求可能需要在每個(gè)請(qǐng)求都攜帶狀態(tài)信息(如身份認(rèn)證等)浅侨。
    更好的二進(jìn)制支持。Websocket定義了二進(jìn)制幀证膨,相對(duì)HTTP如输,可以更輕松地處理二進(jìn)制內(nèi)容。
  4. 可以支持?jǐn)U展央勒。Websocket定義了擴(kuò)展不见,用戶可以擴(kuò)展協(xié)議、實(shí)現(xiàn)部分自定義的子協(xié)議崔步。如部分瀏覽器支持壓縮等脖祈。
  5. 更好的壓縮效果。相對(duì)于HTTP壓縮刷晋,Websocket在適當(dāng)?shù)臄U(kuò)展支持下盖高,可以沿用之前內(nèi)容的上下文,在傳遞類似的數(shù)據(jù)時(shí)眼虱,可以顯著地提高壓縮率喻奥。

使用socket.io實(shí)現(xiàn)簡(jiǎn)單的聊天室

  1. 前端代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>websocket聊天室</title>
    <style>
        #content{
            width: 600px;
            height: 300px;
            border: 1px solid black;
        }
        .me{
            color: green;
        }
    </style>
    <script src="http://localhost:8080/socket.io/socket.io.js"></script>
    <script>
        let sock = io.connect("ws://localhost:8080");
        sock.on("connect",()=>{
            console.log("連接建立");
        })
        sock.on("disconnect",()=>{
            console.log("連接斷開");
        })
        window.onload = function(){
            let ul = document.querySelector("#content");
            let msg = document.querySelector("#msg");
            let btn = document.querySelector("#btn");
            
            sock.on("msg",function(str){
                let li = document.createElement("li");
                li.innerHTML = str;
                ul.appendChild(li);
            })

            btn.onclick = function(){
                let sendMsg = msg.value.replace(/(^\s+)|(\s+$)/g,"");
                if(sendMsg.length !== 0){
                    sock.emit("msg",sendMsg);
                    let li = document.createElement("li");
                    li.innerHTML= sendMsg;
                    li.className = "me";
                    ul.appendChild(li);
                    msg.value = "";
                }
            }
        }
    </script>
</head>
<body>
    <ul id="content"></ul>
    <textarea id="msg" cols="80" rows="10"></textarea>
    <input type="submit" value="發(fā)送" id="btn">
</body>
</html>
  1. nodejs服務(wù)器端的代碼
const http = require("http");
const io = require("socket.io");

let httpServer = http.createServer();
httpServer.listen(8080);

let wsServer = io.listen(httpServer);
let sockArr = [];
wsServer.on("connection",sock=>{
    sockArr.push(sock);
    sock.on("disconnect",()=>{
        let n = sockArr.indexOf(sock);
        if(n!=-1){
            sockArr.splice(n,1);
        }
    })
    sock.on("msg",function(str){
        sockArr.forEach(s=>{
            if(s!=sock){
                s.emit("msg",str);
            }
        })
    })
    setInterval(() => {
        console.log(sockArr.length)
    }, 1000);
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捏悬,隨后出現(xiàn)的幾起案子撞蚕,更是在濱河造成了極大的恐慌,老刑警劉巖过牙,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甥厦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寇钉,警方通過查閱死者的電腦和手機(jī)刀疙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扫倡,“玉大人谦秧,你說我怎么就攤上這事∧炖#” “怎么了疚鲤?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缘挑。 經(jīng)常有香客問我集歇,道長(zhǎng),這世上最難降的妖魔是什么语淘? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任诲宇,我火速辦了婚禮际歼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焕窝。我一直安慰自己,他們只是感情好维贺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布它掂。 她就那樣靜靜地躺著,像睡著了一般溯泣。 火紅的嫁衣襯著肌膚如雪虐秋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天垃沦,我揣著相機(jī)與錄音客给,去河邊找鬼。 笑死肢簿,一個(gè)胖子當(dāng)著我的面吹牛靶剑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播池充,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼桩引,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了收夸?” 一聲冷哼從身側(cè)響起坑匠,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卧惜,沒想到半個(gè)月后厘灼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咽瓷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年设凹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茅姜。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡围来,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匈睁,到底是詐尸還是另有隱情监透,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布航唆,位于F島的核電站胀蛮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糯钙。R本人自食惡果不足惜粪狼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一退腥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧再榄,春花似錦狡刘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疾就,卻和暖如春澜术,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猬腰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工鸟废, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姑荷。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓盒延,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鼠冕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兰英,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345