一:背景介绍

近年来,随着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的特点

  1. 建立在 TCP 协议之上,服务器端的实现比较容易。

  2. 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

  3. 数据格式比较轻量,性能开销小,通信高效。

  4. 可以发送文本,也可以发送二进制数据。

  5. 没有同源限制,客户端可以与任意服务器通信。

  6. 协议标识符是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属性返回实例对象的当前状态,共有四种:

  1. CONNECTING:值为0,表示正在连接

  2. OPEN:值为1,表示连接成功,可以通信了

  3. CLOSING:值为2,表示连接正在关闭

  4. 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;}
  1. webSocket.bufferedAmount
    实例对象的bufferedAmount属性,表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束

var data = new ArrayBuffer(10000000);socket.send(data);if (socket.bufferedAmount === 0) {// 发送完毕} else {// 发送还没结束}
  1. webSocket.onerror
    实例对象的onerror属性,用于指定报错时的回调函数

socket.onerror = function(event) {// handle error event};socket.addEventListener("error", function(event) {// handle error event});

WebSocket 学习之认识websocket相关推荐

  1. WebSocket 学习

    项目中之前已经使用过 websocket 进行一些和服务器的实时数据通信,但是对于协议本身并不十分了解,也是借此机会学习一下并分享出来. OSI 位置? 应用层,和 Http 协议是同级关系 为什么需 ...

  2. websocket学习和群聊实现

    WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询.在此协议的基础上,可以实现前后端数据.多端数据,真正的实时响应.在学习WebSocket的过程中,实现了一个简化版群聊,过程和 ...

  3. websocket学习笔记

    文章目录 websocket学习笔记 实现的方式 websocket学习笔记 WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供 ...

  4. ESP32 单片机学习笔记 - 08 - WebSocket客户端

    前言,终于要到网络模型的最后一层,第四层,应用层,http.websocket的实践了. 文章目录 ESP32 单片机学习笔记 - 08 - WebSocket客户端 一.应用层协议 科普概念 二.编 ...

  5. WebSocket学习与使用

    1.WebSocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议,其目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,使得服务器可以主动发送消息给浏览器.在HTML ...

  6. websocket 学习--简单使用,nodejs搭建websocket服务器,到模拟股票,到实现聊天室

    websocket简介: WebSocket协议是 HTML5 开始提供的一种基于TCP的一种新的全双工通讯的网络通讯协议.它允许服务器主动发送信息给客户端. 和http协议的不同?? HTTP 协议 ...

  7. websocket学习总结记录

    Websocket 1.基本概念 WebSocket是一种网络通信协议. websocket和http 的区别,http的缺陷,只能从客户端发起请求(单项请求)不能从服务器发起请求.如果服务器有连续性 ...

  8. 【WebSocket】WebSocket学习笔记

    目录 什么是WebSocket? 为什么需要WebSocket WebSocket与HTTP的区别 WebSocket协议的原理 WebSocket的优缺点 WebSocket应用场景 WebSock ...

  9. H5学习系列之webSocket入门

    Websocket 1.websocket是什么? WebSocket是为解决客户端与服务端实时通信而产生的技术.其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接, 此 ...

最新文章

  1. ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
  2. “中国式招标”的一些趣闻
  3. 解读MD07中可供货天数的计算
  4. HDU-5249 KPI(STL or 权值线段树)
  5. java炸弹游戏_java实现数字炸弹
  6. egg --- 初始化一个egg项目基本结构说明
  7. .net html5页面缓存,详解HTML5中的manifest缓存使用
  8. python将一个文件的内容写入另一个文件_Python3中如何将文件中两个关键词中的信息写入到另一文件?...
  9. 新漏洞 RAMpage 曝光:2012年后发布的所有的 Android 手机都危险!
  10. 夏令时 DST (Daylight Saving Time) java中的夏令时。
  11. WTL学习笔记(5)系统皮肤管理
  12. WinForm窗体美化
  13. 你在公司项目里面看过哪些操蛋的代码?
  14. 论文清单:一文梳理因果推理在自然语言处理中的应用(附链接)
  15. Word打开文件错误提示用文本恢复转换器打开文件
  16. 【亚伦博客】《蝙蝠侠前传2:黑暗骑士》里发生了什么
  17. CAD二次开发之选择集过滤
  18. 图像分类竞赛——添翼杯人工智能应用创新大赛——rank4解决方案
  19. 盗取QQ密码的顽固的IEXPLORE.EXE病毒
  20. 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法

热门文章

  1. 通过自适应UM(非锐化掩膜)算法进行图像增强(Image Enhancement via Adaptive Unsharp Masking)
  2. C++自学写着玩之switch
  3. oracle采购开票怎么退,购买方退货如何开票
  4. [ZJOI2016]大森林(LCT)
  5. R语言代码中的中文乱码和功能窗口下文件名乱码解决办法
  6. c语言,从“hello word“开始//1
  7. 蜗牛学院:你是码农,还是IT工程师?
  8. 7_6_Q题 Brackets 题解[POJ2955](区间DP)
  9. 026 [转载]冰血大哥的一篇学习计划
  10. 【献血小常识】------- 献血者所献血液检测结果和使用情况