网站首页 > 技术文章 正文
一、为什么要学 WebSocket?
websocket 是 HTML5 提供的一种长链接双向通讯协议,使得客户端和服务器之间的数据交换更简单,允许服务端主动向客户端推送数据,并且客户端与服务端只需连接一次,就可以保持长久连接,并进行数据通信。
websocket 与 http 区别:
- http 链接分为长链接、短链接,短链接是发送一个请求,返回一个响应,长链接是在一定周期内保持链接。但是 websocket 只需连接一次就可以保持长链接,不需要的时候可以手动断开。
- http 通信中,客户端是主动的,服务端是被动的。但是 websocket,服务端可以主动向客户端推送数据。
- http 通过轮询建立的长链接,多次建立 request / response 会产生冗余的头部信息。
ajax 轮询与 websocket 通信原理如图:
websocket 就是为了解决客户端发起多个 http 请求到服务器资源,浏览器必须要经过长时间的,轮询问题而生的,实现多路复用。它最大特点就是服务器可以主动向客户端推送信息。
二、WebSocket 对象
2.1、创建对象:
let ws = new WebSocket( url , [ protocol ] )
url:指定连接的后台服务地址。
protocol:指定可接受的子协议,是可选参数。
2.2、对象属性
readyState:表示连接状态,是一个只读属性。
使用语法:ws.readyState
返回的值有4个,分别表示的意义:
- 0 - 未建立连接
- 1 - 已建立连接,可正常通信
- 2 - 连接正在进行关闭
- 3 - 连接已经关闭或断开,无法通信
bufferedAmount:已被放入等待传输队列,但是还没有发出的 UTF-8 文本字节数,也是只读属性。
2.3、对象事件
onopen - 连接时触发,用于指定连接成功后的回调函数。
使用语法:
// 方法一 :只可以指定一个回调函数
ws.onopen = function(){
}
//方法二 :可以指定多个回调函数
ws.addEventListener('open',function(){
})
onclose - 关闭时触发,指定连接关闭时回调函数。
使用语法:与 onopen 完全一致。
onmessage - 客户端接收服务端数据时触发,指定回调函数。
使用语法:
// 方法一:
ws.inmessage = function(event){
let data = event.data
//服务器传给客户端的数据
}
// 方法二:
ws.addEventListener('inmessage', function(event){
let data = event.data
//服务器传给客户端的数据
})
onerror - 通信发生错误时触发,并指定回调函数。
使用语法:
//方法一
ws.onerror = function(){
//错误处理
}
//方法二
ws.addEventListener('error',function(){
//错误处理
})
2.3、对象事件
send - 用于向服务器发送数据。
使用语法:
ws.send( data )
data :是发给服务器的数据,这个数据可以是字符串、数组、json、Blob 对象或 ArrayBuffer 对象等。
如发送 Blob 对象例子:
var file = document.querySelector('input='file'').files[0]
ws.send(file)
close - 关闭连接
使用语法:
ws.close()
猜你喜欢
- 2024-10-13 websocket-sharp:.NET平台上的WebSocket客户端与服务器开源库
- 2024-10-13 dart系列之:实时通讯,在浏览器中使用WebSockets
- 2024-10-13 WebSocket菜鸟教程二(websocketpp教程)
- 2024-10-13 建立一个加密货币的教程(一)(制作加密货币)
- 2024-10-13 WebSocket 对象简介(websocket相关技术)
- 2024-10-13 netty系列之:使用netty搭建websocket客户端
- 2024-10-13 聊聊分布式下的WebSocket解决方案
- 2024-10-13 OkHttp 实现 WebSocket 真的太好用了,聊聊长连接如何保活
- 2024-10-13 WebSocket基础讲解(1)(websocketclient)
- 2024-10-13 利用WebSocket跨站劫持(CSWH)漏洞接管帐户
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)