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

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

目录
相关文章
|
1月前
|
计算机视觉 Python
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
这篇文章是关于如何使用Flask框架结合OpenCV库,通过电脑摄像头实现视频流在网页上的实时显示,并提供了单摄像头和多摄像头的实现方法。
86 2
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
|
1月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
139 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
1月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
150 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
24天前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
21 1
|
1月前
|
移动开发 监控 安全
HTML5 WebSocket详解
**WebSocket** 是一种协议,支持浏览器与服务器间的双向全双工通信。不同于传统的 HTTP 模式,WebSocket 建立持久连接,使服务器能主动向客户端推送数据。本文详细解析 WebSocket 的工作原理、优缺点及应用场景,并提供客户端和服务器端的代码示例。WebSocket 适合实时聊天、在线游戏、数据监控等场景,能显著提升用户体验和应用性能,但需注意其实现复杂性和安全性问题。
|
2月前
|
前端开发 程序员
【前端web入门第二天】01 html语法实现列表与表格_合并单元格
本文介绍了HTML中的列表与表格的使用方法。列表包括无序列表(`<ul>`嵌套`<li>`)、有序列表(`<ol>`嵌套`<li>`)和定义列表(`<dl>`嵌套`<dt>`和`<dd>`)。
61 19
|
1月前
|
文件存储 Python
Flask学习笔记(一):Flask Web框架
本文介绍了Flask Web框架的基本概念、安装方法、初始化参数、程序编写、静态文件显示和配置信息加载等基础知识。
27 0
|
2月前
|
前端开发 Windows
【前端web入门第一天】02 HTML图片标签 超链接标签 音频标签 视频标签
本文档详细介绍了HTML中的图片、超链接、音频和视频标签的使用方法。首先讲解了`<img>`标签的基本用法及其属性,包括如何使用相对路径和绝对路径。接着介绍了`<a>`标签,用于创建超链接,并展示了如何设置目标页面打开方式。最后,文档还涵盖了如何在网页中嵌入音频和视频文件,包括简化写法及常用属性。
51 13
|
2月前
|
前端开发 程序员 C++
【前端web入门第一天】01 开发环境、HTML基本语法文本标签
本文档详细介绍了HTML文本标签的基础知识。首先指导如何准备开发环境,包括安装VSCode及常用插件;接着全面解析HTML的基本结构与标签语法,涵盖从基本骨架搭建到注释的使用,以及标题、段落、换行和平行线、文本格式化等标签的具体应用,适合初学者循序渐进地掌握HTML。
|
3月前
|
Java 数据安全/隐私保护 安全
掌握Struts 2动态方法调用,让你的Web开发如虎添翼,轻松应对复杂业务需求!
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活性而广受青睐。其动态方法调用(DMI)特性允许在不修改配置文件的情况下动态调用Action类中的方法,相比传统方法调用(需在`struts.xml`中为每个方法创建单独的`<action>`),DMI简化了配置并提升了灵活性、可维护性和扩展性。本文通过对比DMI与传统方法调用,展示如何利用DMI简化开发流程,并强调了在使用DMI时需注意的安全性和访问控制问题。
45 0

热门文章

最新文章