前端技术栈补全计划---websocket

本系列文章旨在总结前端技术栈中的一些通用技术
本文主要总结websockethtml

websocket

WebSocket以前

在WebSocket以前,http请求的主要模式是客户端发起请求,服务端负责接收,并返回数据。若是须要服务端将一些参数主动传递至客户端,下面是一些常见的方法。前端

  1. 一种比较常见的方式是服务端携带参数,访问某个指定的前端页面,例如后端主动访问http://www.params.com?want=param1;。params页面被访问时接收到了want=param1这个参数,其含义为,服务端想从客户端拿到param1这个字段的数据。前端就会发出对应http请求来知足服务端的需求
  2. 另外一种更加常见的方式就是轮询(polling),其本质就是利用定时器,不断像服务端发送请求,直到得到想要的数据node

    const polling = setInterval(() => {
        // 像服务器发出请求
        http.(url, options)
            .then((data) => {
                if () {
                    // 没有新消息,继续轮询
                    ... 
                } else {
                    // 拿到新消息,推出轮询
                    ...
                    polling.clearInterval();
                }
            });
    }, 500);

这两种方法,总的来讲都是妥协性实现,第一种方法对须要经过中间页面实现,不具有通用性。第二种方法则会浪费大量资源,给服务器带来没必要要的压力。还有其余不少实现方法,不一一列举了。web

WebSocket

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通讯——容许服务器主动发送信息给客户端。npm

关于网络协议的问题,本文很少讨论(由于笔者暂时也不懂,协议部分之后会放到别的文章里)。后端

WebSocket使用

与http

WebSocket的url与http最大的不一样就是协议不一样api

http的协议是
http://(未加密)和https://(加密)
WebSocket的协议是
ws://(未加密)和 wss://(加密)浏览器

服务端

本文只以最简单的node服务端为例。
新建文件夹wsTest服务器

// node端 ws依赖
npm install ws --save
// wsTest/server.js

const PORT = 3000;
const WebSocketServer = require('ws').Server;
const wss = new WebSocketServer({port: PORT});
    wss.on('connection', function (ws) {
        console.log('client connected');
        wss.send('websocket connect success');
        wss.on('message', function(evt) {
            console.log(evt);
        }
        wss.on('error', function(evt) {
            console.log(evt);
        }
        wss.on('close', function(evt) {
            console.log(evt);
        }
});

console.log(`server start ${PORT}`);

回到命令行,输入指令node server.js就能够启动服务器了websocket

前端
// index.html
// 本文件与服务端无关,不须要配置

<script>
  const ws = new WebSocket('ws://localhost:3000');
 
    ws.onopen = function (data) {
    };
    ws.onmessage = function (data) {
    };
    ws.onclose = function (data) {
    }
</script>

直接运行index.html,在控制台network中能够看到对应的WebSocket链接

WebSocket attr & method(前端)

(本文仅列举一些前端WebSocket经常使用attr,所有api可见官方文档)

attr

url ---string

WebSocket链接的目标地址

const ws = new WebSocket('ws://www.baidu.com');
ws.url       // 'ws://www.baidu.com';
readyState --- number

readyState表示WebSocket当前的链接状态

constant state code description
CONNECTING 0 链接还没开启
OPEN 1 链接已开启并准备好通讯
CLOSING 2 链接正在关闭过程当中
CLOSED 3 链接已经关闭,活着没法创建
onopen ---function

当链接已开启时触发onopen事件

onmessage --- function

当从服务端收到消息时触发onmessage事件

onerror --- function

链接抛出错误时触发onerror事件

onclose --- function

链接关闭后触发onclose事件

method

send(message)

Websocket.send(message)
用于向服务端发送一条消息

close()

Websocket.close()
用于客户端主动关闭WebSocket通讯

node端的WebSocketAPI此文不作介绍

暂时只作这么多介绍,更多详细内容和使用经验会会随着笔者不断学习应用逐步更新2333,但愿你们共同进步
websocket-Mozila官方文档

相关文章
相关标签/搜索