WebSocket 学习之认识websocket
一:背景介绍
近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。
我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应用。在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:轮询。
轮询是最原始的实现实时Web应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。
轮询都是基于请求-应答模式,都不算是真正意义上的实时技术;它们的每一次请求、应答,都浪费了一定流量在相同的头部信息上,并且开发复杂度也较大。
伴随着HTML5推出的WebSocket,真正实现了Web的实时通信,使B/S模式具备了C/S模式的实时通信能力。WebSocket的工作流程是这 样的:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 TCP连接传输数据。因为WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询小 了很多。
WebSock的特点
建立在 TCP 协议之上,服务器端的实现比较容易。
与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
数据格式比较轻量,性能开销小,通信高效。
可以发送文本,也可以发送二进制数据。
没有同源限制,客户端可以与任意服务器通信。
协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
WebSocket 对象作为一个构造函数,用于新建 WebSocket 实例,执行完之后,客户端就会与服务端进行连接
下面看一个简单的例子:
var ws = new WebSocket('http://127.0.0.1:8003');ws.onopen = function (evt) {console.log('连接已打开!');ws.send('Hello WebSocket!!!');}ws.onmessage = function (message) {console.log('接收到信息:' + message.data);ws.close();}ws.onclose = function (evt) {consoel.log('连接已关闭!')}
二:WebSock 客户端API
1. 新建 WebSocket 实例
var ws = new WebSocket('http://127.0.0.1:8003');
执行上面语句之后,客户端就会与服务器进行连接。
2. webSocket.onopen
实例对象的onopen属性,用于指定连接成功后的回调函数。
ws.onopen = function () {ws.send('Hello Server!');}
如果要指定多个回调函数,可以使用addEventListener方法。
ws.addEventListener('open', function (event) {ws.send('Hello Server!');});
3. webSocket.onmessage
实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。
ws.onmessage = function(event) {var data = event.data;// 处理数据};ws.addEventListener("message", function(event) {var data = event.data;// 处理数据});
注意,服务器数据可能是文本,也可能是二进制数据(blob对象或Arraybuffer对象)。因此你还需要动态判断数据类型
ws.onmessage = function(event){if(typeof event.data === String) {console.log("Received data string");}if(event.data instanceof ArrayBuffer){var buffer = event.data;console.log("Received arraybuffer");}}
4. webSocket.send()
实例对象的send()方法用于向服务器发送数据。
// 发送文本的例子ws.send('your message');
// 发送 Blob 对象的例子var file = document .querySelector('input[type="file"]').files[0];ws.send(file);
5. webSocket.onerror
实例对象的onerror属性,用于指定报错时的回调函数。
socket.onerror = function(event) {// 这里写报错事件 };socket.addEventListener("error", function(event) {// 这里写监听的报错事件});
6. webSocket.onclose
实例对象的onclose属性,用于指定连接关闭后的回调函数。
ws.onclose = function(event) {var code = event.code;var reason = event.reason;var wasClean = event.wasClean;// 这里写关闭事件};ws.addEventListener("close", function(event) {var code = event.code;var reason = event.reason;var wasClean = event.wasClean;//这里写监听的关闭事件});
7. webSocket.readyState
readyState属性返回实例对象的当前状态,共有四种:
CONNECTING:值为0,表示正在连接
OPEN:值为1,表示连接成功,可以通信了
CLOSING:值为2,表示连接正在关闭
CLOSED:值为3,表示连接已经关闭,或者打开连接失败
switch (ws.readyState) {case WebSocket.CONNECTING:// do somethingbreak;case WebSocket.OPEN:// do somethingbreak;case WebSocket.CLOSING:// do somethingbreak;case WebSocket.CLOSED:// do somethingbreak;default:// this never happensbreak;}
webSocket.bufferedAmount
实例对象的bufferedAmount属性,表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束
var data = new ArrayBuffer(10000000);socket.send(data);if (socket.bufferedAmount === 0) {// 发送完毕} else {// 发送还没结束}
webSocket.onerror
实例对象的onerror属性,用于指定报错时的回调函数
socket.onerror = function(event) {// handle error event};socket.addEventListener("error", function(event) {// handle error event});
WebSocket 学习之认识websocket相关推荐
- WebSocket 学习
项目中之前已经使用过 websocket 进行一些和服务器的实时数据通信,但是对于协议本身并不十分了解,也是借此机会学习一下并分享出来. OSI 位置? 应用层,和 Http 协议是同级关系 为什么需 ...
- websocket学习和群聊实现
WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询.在此协议的基础上,可以实现前后端数据.多端数据,真正的实时响应.在学习WebSocket的过程中,实现了一个简化版群聊,过程和 ...
- websocket学习笔记
文章目录 websocket学习笔记 实现的方式 websocket学习笔记 WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供 ...
- ESP32 单片机学习笔记 - 08 - WebSocket客户端
前言,终于要到网络模型的最后一层,第四层,应用层,http.websocket的实践了. 文章目录 ESP32 单片机学习笔记 - 08 - WebSocket客户端 一.应用层协议 科普概念 二.编 ...
- WebSocket学习与使用
1.WebSocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议,其目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,使得服务器可以主动发送消息给浏览器.在HTML ...
- websocket 学习--简单使用,nodejs搭建websocket服务器,到模拟股票,到实现聊天室
websocket简介: WebSocket协议是 HTML5 开始提供的一种基于TCP的一种新的全双工通讯的网络通讯协议.它允许服务器主动发送信息给客户端. 和http协议的不同?? HTTP 协议 ...
- websocket学习总结记录
Websocket 1.基本概念 WebSocket是一种网络通信协议. websocket和http 的区别,http的缺陷,只能从客户端发起请求(单项请求)不能从服务器发起请求.如果服务器有连续性 ...
- 【WebSocket】WebSocket学习笔记
目录 什么是WebSocket? 为什么需要WebSocket WebSocket与HTTP的区别 WebSocket协议的原理 WebSocket的优缺点 WebSocket应用场景 WebSock ...
- H5学习系列之webSocket入门
Websocket 1.websocket是什么? WebSocket是为解决客户端与服务端实时通信而产生的技术.其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接, 此 ...
最新文章
- ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
- “中国式招标”的一些趣闻
- 解读MD07中可供货天数的计算
- HDU-5249 KPI(STL or 权值线段树)
- java炸弹游戏_java实现数字炸弹
- egg --- 初始化一个egg项目基本结构说明
- .net html5页面缓存,详解HTML5中的manifest缓存使用
- python将一个文件的内容写入另一个文件_Python3中如何将文件中两个关键词中的信息写入到另一文件?...
- 新漏洞 RAMpage 曝光:2012年后发布的所有的 Android 手机都危险!
- 夏令时 DST (Daylight Saving Time) java中的夏令时。
- WTL学习笔记(5)系统皮肤管理
- WinForm窗体美化
- 你在公司项目里面看过哪些操蛋的代码?
- 论文清单:一文梳理因果推理在自然语言处理中的应用(附链接)
- Word打开文件错误提示用文本恢复转换器打开文件
- 【亚伦博客】《蝙蝠侠前传2:黑暗骑士》里发生了什么
- CAD二次开发之选择集过滤
- 图像分类竞赛——添翼杯人工智能应用创新大赛——rank4解决方案
- 盗取QQ密码的顽固的IEXPLORE.EXE病毒
- 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法
热门文章
- 通过自适应UM(非锐化掩膜)算法进行图像增强(Image Enhancement via Adaptive Unsharp Masking)
- C++自学写着玩之switch
- oracle采购开票怎么退,购买方退货如何开票
- [ZJOI2016]大森林(LCT)
- R语言代码中的中文乱码和功能窗口下文件名乱码解决办法
- c语言,从“hello word“开始//1
- 蜗牛学院:你是码农,还是IT工程师?
- 7_6_Q题 Brackets 题解[POJ2955](区间DP)
- 026 [转载]冰血大哥的一篇学习计划
- 【献血小常识】------- 献血者所献血液检测结果和使用情况