webSocket雙向通信

優(yōu)點
  1. 性能高
  2. 雙向
  3. 自帶跨域
對應(yīng)的庫

socket.io

  1. 簡單、方便
  2. 兼容 IE5
  3. 自動數(shù)據(jù)解析

前臺

<script src="http://localhost:8080/socket.io/socket.io.js" charset="utf-8"></script>
<script>
let sock=io.connect('ws://localhost:8080/');
//發(fā)送數(shù)據(jù) sock.emit
//接收數(shù)據(jù) sock.on
// 發(fā)送
sock.emit('aaa', 11, 3);
// 接收
sock.on('timer', time=>{
  console.log(time);
});
</script>

后臺

const http=require('http');
const io=require('socket.io');

//1.建立普通http
let server=http.createServer((req, res)=>{});
server.listen(8080);

//2.建立ws
let wsServer=io.listen(server);
wsServer.on('connection', sock=>{
  // 發(fā)送數(shù)據(jù)  sock.emit('name', 數(shù)據(jù))
  // 接收數(shù)據(jù)  sock.on('name', function (數(shù)據(jù)){});
  // 接收
  sock.on('aaa', function (a, b){
    console.log(a, b, a+b);
  });
  // 定時發(fā)送
  setInterval(function (){
    sock.emit('timer', new Date().getTime());
  }, 1000);
});
原生webSocket

了解三次握手

前臺

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <script>
    let ws=new WebSocket('ws://localhost:8080/');

    ws.onopen=function (){
      alert('連接已建立');
    };
    ws.onmessage=function (){};
    ws.onclose=function (){};
    ws.onerror=function (){};
    </script>
  </head>
  <body></body>
</html>

后臺

const net=require('net');
const crypto=require('crypto');

function parseHeader(str){
  let arr=str.split('\r\n').filter(line=>line);
  arr.shift();

  let headers={};
  arr.forEach(line=>{
    let [name, value]=line.split(':');

    name=name.replace(/^\s+|\s+$/g, '').toLowerCase();
    value=value.replace(/^\s+|\s+$/g, '');

    headers[name]=value;
  });

  return headers;
}

let server=net.createServer(sock=>{
  sock.once('data', buffer=>{
    let str=buffer.toString();
    let headers=parseHeader(str);

    if(headers['upgrade']!='websocket'){
      console.log('no upgrade');
      sock.end();
    }else if(headers['sec-websocket-version']!='13'){
      console.log('no 13');
      sock.end();
    }else{
      let key=headers['sec-websocket-key'];
      let uuid='258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
      let hash=crypto.createHash('sha1');

      hash.update(key+uuid);
      let key2=hash.digest('base64');

      sock.write(`HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection:upgrade\r\nSec-Websocket-Accept:${key2}\r\n\r\n`);
    }
  });

  sock.on('end', ()=>{

  });
});
server.listen(8080);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 可能有很多的同學(xué)有用 setInterval 控制 ajax 不斷向服務(wù)端請求最新數(shù)據(jù)的經(jīng)歷(輪詢)看下面的代碼:...
    船長___閱讀 15,299評論 0 8
  • WebSocket簡介 談到Web實時推送,就不得不說WebSocket。在WebSocket出現(xiàn)之前,很多網(wǎng)站為...
    吧啦啦小湯圓閱讀 8,331評論 15 75
  • WebSocket 機制 WebSocket 是 HTML5 一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更...
    勇敢的_心_閱讀 2,379評論 0 4
  • 一、對于正則判斷(包括基礎(chǔ)的手機號驗證、郵箱驗證、銀行卡驗證、密碼驗證等)進行簡單的封裝,在調(diào)用時可以同時對多個內(nèi)...
    romancemystery閱讀 664評論 0 0
  • 我有三個姑姑,就屬我二姑最像我奶奶。長的像,性格也像。 我二姑結(jié)婚的時候我依稀還有幾分印象,那時候我兩三歲吧。看著...
    南雅之簡閱讀 1,466評論 2 3

友情鏈接更多精彩內(nèi)容