HTML学习笔记(九) Web Socket

简介: HTML学习笔记(九) Web Socket

WebSocket 是一个建立在 TCP 之上进行全双工通讯的应用层协议


我们知道,HTTP 协议采用的是请求/响应模式,服务端是不能主动向客户端推送数据的


若要实现推送功能,一般都是采用 Ajax 轮询,但这样频繁的请求会给服务端带来极大的压力


WebSocket 协议就是为了解决这种类似的场景而出现的,它允许服务端可以主动向客户端推送数据


浏览器和服务器通过一次握手,就能在两者之间创建持续性的连接,进行双向数据传输,直至任意一方将其关闭


目前,基于 SHA 加密方式的握手协议是使用最为广泛的,具体的过程如下:


  • 浏览器向服务器发起一个 HTTP 请求,但是这个请求与普通的请求不同,它会附加一些头部信息
  • 服务器解析头部信息,返回一个响应,这样就能建立起 WebSocket 连接


一个典型的客户端请求如下:

GET ws://localhost:5000 HTTP/1.1
Host: localhost
Origin: http://localhost:5000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: 随机字符串
Sec-WebSocket-Version: 13


  • Connection:必须设置为 Upgrade,表示客户端希望升级协议
  • Upgrade:必须设置为 websocket,表示希望将协议升级为 Websocket
  • Sec-WebSocket-Key:随机字符串,与响应中 Sec-WebSocket-Accept 的值做对比验证


一个典型的服务端响应如下:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 根据 Sec-WebSocket-Key 计算得到
Sec-WebSocket-Location: ws://localhost:5000


  • Connection:如果值为 Upgrade,表示服务端同意升级协议
  • Upgrade:如果值为 websocket,表示同意将协议升级为 Websocket
  • Sec-WebSocket-Accept:经过服务器确认并加密的 Sec-WebSocket-Key


在理解了原理之后,我们下面再来看一下具体要怎么使用 WebSocket


在客户端浏览器中,可以通过构造函数 WebSocket() 创建一个对象


其中,参数 url 用于指定连接地址,参数 protocol 用于指定可接受的子协议


WebSocket(url, [protocol])

构造函数返回一个 WebSocket 对象,该对象常用的属性和方法如下:


readyState:只读属性,表示连接状态


0 表示连接尚未建立,1 表示连接已经建立,可以进行通信

2 表示连接正在关闭,3 表示连接已经关闭,或者不能打开


bufferedAmount:只读属性,在缓存中等待传输的字节数


onopen:指定 open 事件的监听函数,在连接建立时触发


onmessage:指定 message 事件的监听函数,在收到数据时触发


onerror:指定 error 事件的监听函数,在发生错误时触发


onclose:指定 close 事件的监听函数,在连接关闭时触发


send():发送数据

close():关闭连接

var ws = new WebSocket('ws://localhost:5000')
ws.onopen = function(event) { 
    console.log('open')
}
ws.onmessage = function(event) {
    console.log('message', event.data)
    ws.send('Goodbye')
    ws.close()
}
ws.onclose = function(event) {
  console.log('close')
}; 
ws.onerror = function(event) {
  console.log('error')
}

而对于服务器而言,WebSocket 只是一种协议而已,不同的语言和不同的框架会有不同的实现

下面我们以 Node.js 为例,写一个简单的 Demo

var express = require('express')
var expressWs = require('express-ws')
var app = express()
expressWs(app)
app.ws('/', function (ws, req){
    // ws:  WebSocket 实例
    // req:Request 实例
    ws.send('Hello')
    ws.on('message', function (msg) {
        console.log(msg)
    })
})
var server = app.listen(5000, '127.0.0.1', function() {
    console.log('server running at http://127.0.0.1:5000')
})

文章知识点与官方知识档案匹配,可进一步学习相关知识

目录
相关文章
|
3月前
|
XML 移动开发 前端开发
HTML5简介(什么是网页、什么是 HTML、Web标准)
网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。
37 0
|
4月前
|
Java Docker 容器
美团大牛精心整理SpringBoot学习笔记,从Web入门到系统架构
近期慢慢复工,为了准备面试,各路码友们都开始磨拳擦脚,背面试题、知识点。小编最近得一良友赠送了一份关于SpringBoot的学习笔记,简直不要好用,理论解析言简意赅,每一步操作都有图片展示。这么好的东西肯定不能私藏,为了感谢大家在2019年里的支持,我现在将这份笔记赠送给大家,祝大家前程似锦,Offer不断!
|
8天前
|
前端开发 搜索推荐 数据安全/隐私保护
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
18 1
|
8天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
26天前
|
移动开发 监控 数据可视化
组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态)
组态软件之万维组态、web组态、html组态、vue2/vue3组态,组态在工业自动化领域越来越重要,但由于市面上组态软件费用昂贵、集成复杂,使用技术门槛高,万维组态就应运而生;万维组态是一款功能强大的基于Web的可视化组态编辑器,采用标准HTML5技术,使用Vue2和Vue3语言,基于B/S架构进行开发,支持WEB端显示;支持快速集成,集成简单方便;支持在浏览器端完成便捷的人机交互,简单的拖拽即可完成可视化页面的设计;可快速构建和部署可扩展的SCADA、HMI、仪表板或LoT系统;
组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态)
|
1月前
|
移动开发 前端开发 HTML5
Web前端全栈HTML5通向大神之路
本套课程共三大阶段,六大部分,是WEB前端、混合开发与全栈开发必须要掌握的技能,从基础到实践,是从编程小白成长为全栈大神的最佳教程!
41 3
Web前端全栈HTML5通向大神之路
|
1月前
|
前端开发
web前端-HTML-div语法
web前端-HTML-div语法
|
2月前
|
Web App开发
某教程学习笔记(一):04、HTML基础
某教程学习笔记(一):04、HTML基础
13 0
|
3月前
|
前端开发 Linux 编译器
web开发:HTML详解
web开发:HTML详解
45 0
|
3月前
|
前端开发 JavaScript 定位技术
web版拳皇,使用html,css,js来制作一款拳皇游戏
web版拳皇,使用html,css,js来制作一款拳皇游戏
36 0