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')
})

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

目录
相关文章
|
2月前
|
存储 移动开发 大数据
HTML5 Web IndexedDB 数据库详解
IndexedDB 是一种高效的浏览器存储方案,允许在本地存储大量结构化数据,支持索引和事务,适用于需要离线和大数据处理的应用。它由数据库、对象仓库等组成,通过键值对存储数据,确保数据一致性和完整性。本介绍展示了如何创建、读取、更新和删除数据,以及事务和错误处理的最佳实践。
|
29天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
37 6
|
29天前
|
前端开发 JavaScript UED
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势,包括样式表优化、DOM操作减少、图像优化等技术,并分析了电商网站的具体案例,强调了技术演进对Web性能的深远影响。
38 5
|
2月前
|
计算机视觉 Python
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
这篇文章是关于如何使用Flask框架结合OpenCV库,通过电脑摄像头实现视频流在网页上的实时显示,并提供了单摄像头和多摄像头的实现方法。
126 2
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
|
2月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
176 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
2月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
184 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
1月前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
37 1
|
2月前
|
存储 移动开发 数据库
HTML5 Web IndexedDB 数据库常用数据存储类型
IndexedDB 支持多种数据存储类型,满足复杂数据结构的存储需求。它包括基本数据类型(如 Number、String、Boolean、Date)、对象(简单和嵌套对象)、数组、Blob(用于二进制数据如图像和视频)、ArrayBuffer 和 Typed Arrays(处理二进制数据)、结构化克隆(支持 Map 和 Set 等复杂对象),以及 JSON 数据。尽管不直接支持非序列化数据(如函数和 DOM 节点),但可以通过转换实现存储。开发者应根据具体需求选择合适的数据类型,以优化性能和使用体验。
|
2月前
|
移动开发 JavaScript 前端开发
HTML5 Web Workers详解
HTML5 Web Workers 允许在后台线程中运行 JavaScript,实现复杂计算而不影响用户界面,提升应用性能。其主要特性包括并行处理、异步通信、独立作用域及多数据类型支持。通过创建和使用 Worker 文件,如 `worker.js`,可执行后台任务,并与主线程通过消息传递机制通信。适用于数据处理、图像处理、复杂计算及网络请求并行等场景。需要注意的是,Web Workers 在浏览器兼容性、安全性限制、调试及资源消耗方面需特别关注。合理利用 Web Workers 可显著增强 Web 应用的流畅度和响应速度。
|
2月前
|
移动开发 监控 安全
HTML5 WebSocket详解
**WebSocket** 是一种协议,支持浏览器与服务器间的双向全双工通信。不同于传统的 HTTP 模式,WebSocket 建立持久连接,使服务器能主动向客户端推送数据。本文详细解析 WebSocket 的工作原理、优缺点及应用场景,并提供客户端和服务器端的代码示例。WebSocket 适合实时聊天、在线游戏、数据监控等场景,能显著提升用户体验和应用性能,但需注意其实现复杂性和安全性问题。