nodejs + websocket (socket.io)

为何须要 WebSocket?

由于个人对观点明白不是很深,笔墨表达能力不强,假如有关HTTP等方面形貌不正确,迎接改正,感谢人人

首次打仗 WebSocket 的人,都邑问一样的题目:我们已经有了 HTTP 协定,为何还须要另一个协定?它能带来什么长处?

答案很简朴,由于 HTTP 协定有一个瑕玷:通讯只能由客户端提议

举例来说:我们想相识本日的天色,只能是客户端向效劳器发出要求,效劳器返回查询效果。HTTP 协定做不到效劳器主意向客户端推送信息。

这类单向要求的特性,必定了假如效劳器有一连的状况变化,客户端要获知就异常贫苦。我们只能运用“轮询”:设置定时器每隔一段时刻,就发出一个”讯问”(简朴明白为ajax要求),相识效劳器有无新的信息。最典范的场景就是聊天室。

—- 参考了阮一峰先生的文章: WebSocket 教程

轮询要求的瑕玷:

  1. 不停地链接,断开,链接,断开要求,糟蹋许多效劳器资本
  2. 糟蹋带宽
  3. 挪动端糟蹋流量

websocket的长处:

  1. 没有同源限定,客户端能够与恣意效劳器通讯,不涉及到跨域的题目。
  2. 双向通讯,效劳器能够向客户端主动发送数据。
  3. 数据格式比较轻量,机能开支小,通讯高效。

websocket为何高效

一般的http通讯是基于字符的通讯(超文本), websocket一开始是文本协定, 当链接竖立后变成二进制协定, 数据无需转换,因而效率高。

socket.io的运用

socket.io是一个封装后的库,原生 websocket 比较复杂,须要本身处置惩罚要求头,设置延续链接等等。因而运用socket.io

装置

npm i socket.io -D
socket主要有两个要领:
sock.emit('name', data) 主动发送数据
sock.on('name', function(data){ })` 吸收数据

1.效劳端

    // server.js
    const http = require('http')
    const io = require('socket.io')
    
    let server = http.createServer((req, res)=>{})
    server.listen(8080)
    
    // 竖立ws  websocket简称ws
    let wsServer = io.listen(server);
    
    wsServer.on('connection', sock=>{
    
      sock.on('aaa', function(a,b){         // name -> 'aaa' 要与前台的 name 保持一致
        console.log(a)
        console.log(b)
        console.log(arguments)
      })     // 'aaa'事宜名与前台的一致
    
      setInterval(function(){
        sock.emit('bbb', '效劳器发来的数据')  // name -> 'bbb' 要与前台的 name 保持一致
      }, 2000)
    })

2. 客户端

<!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">

  <script src='http://localhost:8080/socket.io/socket.io.js'></script> 
  <!-- 
    有人猎奇 XXX/socket.io/socket.io.js 文件,为何我的目次里没有啊,这个是从你的/node_modules/下猎取的。
    当向背景发送要求后,socket会推断req.url,做一个类似于下面的处置惩罚,读取 socket-io.js:
    if(req.url == '/socket.io/socket.io.js'){ 
        fs.readFile('node_modules/socket.io-client/dist/socket-io.js')   
    }
   
    固然我们也能够直接将socket-io.js复制出来,直接用script援用,然则假如socket更新后我们的代码能够不是最新版,会涌现一些题目。
    因而不发起如许运用:<script src='./socket.io.js'></script> 
  -->
  <script>
    let sock = io.connect('ws://localhost:8080/')    // 这里是 ws 协定,不是 http 协定

    // sock.emit
    // sock.on

    sock.emit('aaa', 'maruihua', 5 )

    sock.on('bbb', data => console.log(data))
  </script>
</head>
<body>
</body>
</html>

上面的代码直接复制下来就可以运用。怎样运转nodejs效劳我就不再讲了啊。
怎样,是否是迥殊简朴
妈妈再也不必忧郁我的进修了~

    原文作者:aaamrh
    原文地址: https://segmentfault.com/a/1190000019332250
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞