1、背景

很多网站为了实现推送技术,所用的技术都是Ajax轮询。轮询是在特定的的时间间隔由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。HTML5新增的一些新协议WebSocket,可以提供在单个TCP连接上提供全双工,双向通信,能够节省服务器资源和带宽,并且能够实时进行通信。

2、WebSocket介绍

传统的http也是一种协议,WebSocket是一种协议,使用http服务器无法实现WebSocket,

2.1.浏览器支持情况

基本主流浏览器都支持

2.2.优点

相对于http有如下好处:

1.客户端与服务器只建立一个TCP连接,可以使用更少的连接。

2.WebSocket服务器端可以主动推送数据到客户端,更灵活高效。

3.更轻量级的协议头,减少数据传送量。

对比轮训机制

3、WebSocket用法

我们了解WebSocket是什么,有哪些优点后,怎么使用呢?

3.1.WebSocket创建

WebSocket使用了自定义协议,url模式与http略有不同,未加密的连接是ws://,加密的连接是wss://,WebSocket实例使用new WebSocket()方法来创建,

var ws = new WebSocket(url, [protocol] );

第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。

3.2.WebSocket属性

当创建ws对象后,readyState为ws实例状态,共4种状态

0 表示连接尚未建立。

1 表示连接已建立,可以进行通信。

2 表示连接正在进行关闭。

3 表示连接已经关闭或者连接不能打开。

Tips:在发送报文之前要判断状态,断开也应该有重连机制。

3.3.WebSocket事件

在创建ws实例对象后,会拥有以下几个事件,根据不同状态可在事件回调写方法。

ws.onopen 连接建立时触发

ws.onmessage 客户端接收服务端数据时触发

ws.onerror 通信发生错误时触发

ws.onclose 连接关闭时触发

ws.onmessage = (res) => {

console.log(res.data);

};

ws.onopen = () => {

console.log('OPEN...');

};

ws.onclose=()=>{

console.log('CLOSE...');

}

3.4.WebSocket方法

ws.send() 使用连接发送数据(只能发送纯文本数据)

ws.close() 关闭连接

4、Demo演示

了解WebSocket的一些API之后,趁热打铁,做一个小案例跑一下。

4.1.Node服务器端

WebSocket协议与Node一起用非常好,原因有以下两点:

1.WebSocket客户端基于事件编程与Node中自定义事件差不多。

2.WebSocket实现客户端与服务器端长连接,Node基本事件驱动的方式十分适合高并发连接

创建一个webSocket.js如下:

const WebSocketServer = require('ws').Server;

const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', function (ws) {

console.log('client connected');

ws.on('message', function (message) {

ws.send('我收到了' + message);

});

});

打开windows命令窗口运行

4.2.HTML客户端

新建一个index.html页面

webSocket小Demo

发送报文

const ws = new WebSocket('ws://localhost:8080');

ws.onmessage = (res) => {

console.log(res);

};

ws.onopen = () => {

console.log('OPEN...');

};

ws.onclose = () => {

console.log('CLOSE...');

}

function sendMsg() {

let msg = document.getElementById('msg').value;

ws.send(msg);

}

打开浏览器依次输入字符1,2,3,每次输入完点击发送报体,可见在ws.onmessage事件中res.data中返回来我们发的报文

5、问题与总结

以上只是简单的介绍了下WebSocket的API与简单用法,在处理高并发,长连接这些需求上,例如聊天室,可能WebSocket的http请求更加合适高效。

但在使用WebSocket过程中发现容易断开连接等问题,所以在每次发送报文前要判断是否断开,当多次发送报文时,由于服务器端返回数据量不同,返回客户端前后顺序也不同,所以需要在客户端收到上一个报文返回数据后再发送下一个报文,为了避免回调嵌套过多,通过Promise ,async ,await等同步方式解决。关于WebSocket就写这么多,如有不足,欢迎多多指正!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

html写个用户协议,五分钟学会HTML5的WebSocket协议相关推荐

  1. 五分钟学会HTML5!(二)

    html5开发与旧式浏览器的兼容 我们已经讨论了HTML5许多很酷的新功能,包括新的语义元素.为画图而生的canvas标签,以及音频与视频支持. 你可能会想:这些东西是很好,但当用户的浏览器不兼容HT ...

  2. 五分钟学会HTML5!(一)

    摘要: 毫无疑问,对于开发人员而言,HTML5已是一个热点话题.如果你需要快速了解HTML5的功能的基本原理,阅读本文是你最好的选择.本文来自The Code Project的付费搜索位置,由Solu ...

  3. 五分钟学会企业的OpenStack(T版)——简介及安装方式

    五分钟学会企业的OpenStack(T版)--简介及安装方式 前言 一.OpenStack简介 二.OpenStack安装方式(T版)系列 前言 花了几天写完了OpenStack(T版)的系列文章,希 ...

  4. 老滚5初始化python失败_五分钟学会怎么用python做一个简单的贪吃蛇

    Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发.我们今天将利用它来制作一款大家基本都玩过的小游戏--贪吃蛇. 一.需要导入的包 import pygame ...

  5. 五分钟学会用Simulink模型生成HDL代码

    五分钟学会用Simulink模型生成HDL代码 1 核心步骤 2 视频展示 3 生成HDL代码的注意事项 3.1 HDL支持的库和模块 3.2 设置simulink模型为可生成 hdl 的模式 3.3 ...

  6. 五分钟学会python函数_五分钟带你搞懂python 迭代器与生成器

    前言 大家周末好,今天给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法.对于获取数据的方法而言,我们会一种就 ...

  7. 五分钟学会Playwright录制脚本的方法以及语法难点

     这篇文章系统地介绍了上手Playwright的方法,但是录制脚本部分讲解不够详尽,今天我在这里重点的介绍一下Playwright 录制脚本的方法来丰满我的Playwright系列技术文章. Play ...

  8. 五分钟学会python_关于五分钟学Python系列视频

    Up主记得我们父母辈考大学的时候,外语,尤其是英语,是一个非常火爆的专业.那个时候会英语的人相对比较少,因此能掌握流利的英文听说读写的学生可以算是稀缺人才.现在虽然英语专业人才仍然有很大市场,但是整体 ...

  9. html实现websocket协议,HTML5实现WebSocket协议原理浅析

    WebSocket协议的目的是为了工作于现有的网络基础设施.作为这一设计原则的一部分,WebSocket连接的协议规范定义了一个HTTP连接作为其开始生命周期,进而保证其与pre-WebSocket世 ...

最新文章

  1. [大话数据结构-读书笔记] 栈
  2. autowired 静态方法使用_关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...
  3. JavaScript(一)——快速入门
  4. wxpython日期控件_使用wxpython控件在面板中的位置
  5. Labelimg讲解
  6. faster RCNN
  7. 现在90后程序员有必要考证吗?
  8. muduo库net源码分析一(网络编程本质)
  9. 怎么设置ppt页面的长度和宽度_ppt页面尺寸_ppt尺寸大小的设置方法步骤详解
  10. 13天Java进阶笔记-day11-网络编程和NIO
  11. 卡农c语言编程,c调卡农钢琴曲谱_卡农C大调钢琴谱(五线谱)
  12. 张正友畸变矫正C++代码
  13. 打印机驱动无法安装到计算机是,打印机驱动在电脑哪个位置 打印机驱动安装不上怎么办【详解】...
  14. 服务器部署jdk,tomcat环境及腾讯云域名解析
  15. 从共享文件夹到本地磁盘
  16. 上市公司年报可读性:财务报告可读性管理层讨论与分析可读性(2001-2021年)
  17. mui/uniapp真机开发投屏显示
  18. ACwing 311. 月之谜 数位dp
  19. Xp Vmware上如何安装苹果系统Mac os X (与VT无关)
  20. 亮宁机器人套件_mBot木果创客豪华升级套件——解锁更多玩法!

热门文章

  1. php动态+trait,详解PHP神奇又有用的Trait
  2. 淮海工学院计算机宿舍住b几,淮海工学院本部2009-操作系统试卷B
  3. 往邮箱里发python怎么发_Python 超简单的邮件发送方法
  4. mongodb 备份mysql_MongoDB备份与恢复
  5. 回老家还是继续北上广?
  6. 如何才能学好单片机?​
  7. ubuntu18安装DC2016
  8. goupby 两个值 结果变了_一道问题引出的python中可变数据类型与不可变数据类型...
  9. mathematica在linux上运行,Mathematicamatlab的linux版的安装
  10. bzoj4195(并查集+离散化)