WebSocket协议-基础篇
本篇文章主要讲述以下几点:
- WebSocket协议出现的背景
- WebSocket与HTTP
- WebSocket API
WebSocket协议出现的背景
我们在上网过程中经常用到的是HTTP和HTTPS协议,HTTP协议和HTTPS协议通信过程通常是客户端通过浏览器发出一个请求,服务器接受请求后进行处理并返回结果给客户端,客户端处理结果。
这种机制对于信息变化不是特别频繁的应用可以良好支撑,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在移动互联网蓬勃发展的趋势下,高并发与用户实时响应是Web应用经常面临的问题,比如金融证券的实时信息、社交网络的实时消息推送等。
WebSocket出现前我们实现推送技术,用的都是轮询,在特定的时间间隔,浏览器自动发出请求,将服务器的消息主动的拉回来,这种情况下,我们需要不断的向服务器发送请求,并且HTTP 请求 的header非常长,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽和服务器资源,并且服务器不能主动向客户端推送数据。在这种情况下需要一种高效节能的双向通信机制来保证数据的实时传输,于是基于HTML5规范的WebSocket应运而生。
WebSocket与HTTP
了解WebSocket的出现背景后,应该对WebSocket有了一些认知。一句话概括:
WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。
WebSocket与TCP,HTTP的关系
WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,调用的WebSocket的send函数在实现中最终都是通过TCP的系统接口进行传输的。WebSocket和Http协议一样都属于应用层的协议,WebSocket在建立握手连接时,数据是通过http协议传输的,但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。具体关系如下:

WebSocket与HTTP轮询
HTTP实现实时推送用到的轮询,轮询分两种:长轮询和短轮询(传统轮询)
短轮询:浏览器定时向服务器发送请求,服务器收到请求不管是否有数据到达都直接响应 请求,隔特定时间,浏览器又会发送相同的请求到服务器, 获取数据响应,如图:

缺点:数据交互的实时性较低,服务端到浏览器端的数据反馈效率低
长轮询:浏览器发起请求到服务器,服务器一直保持连接打开,直到有数据可发送。发送完数据之后,浏览器关闭连接,随即又发起一个到服务器的新请求。这一过程在页面打开期间一直持续不断。如图:

缺点:服务器没有数据到达时,http连接会停留一段时间,造成服务器资源浪费,数据交互的实时性也很低
无论是长轮询还是短轮询,浏览器都要先发起对服务器的连接,才能接收数据,并且实时交互性很低。
然而,WebSocket的出现解决了轮询实时交互性和全双工的问题。
在JavaScript中创建了WebSocket后,会有一个HTTP请求发送到服务器以发起连接。取得服务器响应后,建立的连接使用HTTP升级,从HTTP协议交换为WebSocket协议。即,使用标准的HTTP服务器无法实现WebSocket,只有支持这种协议的专门服务器才能正常工作。
WebSocket使用了自定义的协议,未加密的连接不再是http://,而是ws://,默认端口为80,加密的连接也不是https://,而是wss://,默认端口为443。
WebSocket模式客户端与服务器请求响应模式如图:

WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。
WebSocket与HTTP轮询对比得出的结论:
WebSocket是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
WebSocket API
上面讲述了WebSocket比HTTP轮询好,下面介绍一下WebSocket API,使用之后才能在控制台的NetWork中查看原理和运行机制。
创建WebSocket实例
要创建WebSocket,先实例一个WebSocket对象并传入要连接的URL:
var socket = new WebSocket('http://localhost:8000');
执行上面语句后,浏览器会马上尝试创建连接,与XHR类似,WebSocket也有一个表示当前状态的readyState属性。不过,这个属性的值与XHR不相同, socket.readyState值如下:
- 0:正在建立连接, WebSocket.OPENING
- 1:已经建立连接, WebSocket.OPEN
- 2:正在关闭连接, WebSocket.CLOSING
- 3:已经关闭连接, WebSocket.CLOSE
WebSocket没有readystatechange事件,不过,有其他事件对应着不同的状态,readyState的值永远从0开始。
示例如下:
var socket = new WebSocket('ws://localhost:8000'); //正在建立连接
console.log("[readyState]-" + socket.readyState); //0 //连接建立成功回调
socket.onopen = function() {
console.log('Connection established.')
console.log("[readyState]-" + socket.readyState); //1
//发送消息
// socket.send('hello world');
}; //连接失败回调
socket.onerror = function() {
console.log("[readyState]-" + socket.readyState);//
console.log('Connection error.')
}; //连接关闭回调
socket.onclose = function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
console.log("[readyState]-" + socket.readyState);//
console.log('Connection closed.')
console.log(code, reason, wasClean)
};
要关闭WebSocket连接,可以在任何时候调用close方法。
socket.close();
调用了close()之后,readyState的值立即变为2(正在关闭),关闭连接后就会变成3。
发送和接收数据
WebSocket连接建立之后,可以通过连接发送和接收数据。
使用send()方法像服务器发送数据,如下:
var socket = new WebSocket('ws://localhost:8000');
socket.send('hello world');
当服务器向客户端发来消息时,WebSocket对象会触发message事件。这个message事件与其他传递消息的协议类似,也是把返回的数据保存在event.data属性中。
socket.onmessage = function(event) {
var data = event.data;
//处理数据
};
其他事件
WebSocket对象还有其他三个事件,在连接生命周期的不同阶段触发。
- open:成功建立连接时触发。
- error:发生错误时触发,连接断开。
- close: 连接关闭时触发。
ar socket = new WebSocket('ws://localhost:8000');
socket.onopen = function() {
console.log('Connection established.')
};
socket.onerror = function() {
console.log('Connection error.')
};
socket.onclose = function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
console.log('Connection closed.')
};
这三个事件中,只有close事件的event对象有额外信息,这个事件的事件对象有三个额外的属性:wasClean、code和reason。
其中wasClean是一个布尔值,表示连接是否已经明确的关闭;
code是服务器返回的数值状态码;
reason是一个字符串,包含服务器发回的信息。
。
。
WebSocket协议-基础篇的更多相关文章
- WebSocket协议-原理篇
本篇文章主要讲述以下几点: WebSocket的原理与机制 WebSocket与Socket.io WebSocket兼容性 WebSocket的原理与机制 WebSocket协议分为两部分:握手和数 ...
- HTTP协议基础篇(帮助理解)
用uml 来描述一个功能是怎样按照时间的顺序完成的 实际的需求(配置网站/配置虚拟主机) 步骤 (1) 打开 apache/conf/httpd.conf 文件 (2)找到hosts文件 c:/win ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- bt协议详解 基础篇(下)
bt协议详解 基础篇(下) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待. 1 ...
- bt协议详解 基础篇(上)
bt协议详解 基础篇(上) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待. 1 ...
- netty(4)高级篇-Websocket协议开发
一.HTTP协议的弊端 将HTTP协议的主要弊端总结如下: (1) 半双工协议:可以在客户端和服务端2个方向上传输,但是不能同时传输.同一时刻,只能在一个方向上传输. (2) HTTP消息冗长:相比于 ...
- 转战物联网·基础篇09-选择MQTT协议还是CoAP协议
前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境. XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...
- Websocket协议之php实现
前面学习了HTML5中websocket的握手协议.打开和关闭连接等基础内容,最近用php实现了与浏览器websocket的双向通信.在学习概念的时候觉得看懂了的内容,真正在实践过程中还是会遇到各种问 ...
- HTML5的Websocket(理论篇 I)
HTML5的Websocket(理论篇 I) ** 先请来TA的邻居:** http:无状态.基于tcp请求/响应模式的应用层协议 (A:哎呀,上次你请我吃饭了么? B:我想想, 上次请你吃了么) t ...
随机推荐
- POJ2976Dropping tests(分数规划)
传送门 题目大意:n个二元组a[i],b[i],去掉k个,求sigma a[i]/ sigma b[i]的最大值 代码: #include<iostream> #include<cs ...
- 最小费用最大流 学习笔记&&Luogu P3381 【模板】最小费用最大流
题目描述 给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 题目链接 思路 最大流是没有问题的,关键是同时保证最小费用,因此,就可以把 ...
- Paper | No-reference Quality Assessment of Deblocked Images
目录 故事背景 本文方法(DBIQ) 发表在2016年Neurocomputing. 摘要 JPEG is the most commonly used image compression stand ...
- macbook pro更换键盘的排线
以下是拆机图解 很简单的 有点动手能力的都可以更换 另外附加淘宝上的链接 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.68a12e8dYAiQIx ...
- MySchool题目
题目: 1.查询所有学生记录,包含年级名称2.查询S1年级下的学生记录 一.项目目录 二.com.myschool.dao 2.1 BaseDao package com.myschool.dao; ...
- 1+x 证书 Web 前端开发 CSS3 专项练习
官方QQ群 1+x 证书 Web 前端开发 CSS3 专项练习 http://blog.zh66.club/index.php/archives/196/
- 2019.11.21 做OJ题的反思
1.利用二分法查找数组元素(适用于有序数组) #include<stdio.h> int BinarySearch(int a[],int n,int key); ]; int main( ...
- Linux查找文件夹下包含某字符的所有文件
Linux grep 命令用于查找文件里符合条件的字符串.grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示 ...
- SQL Server 通过“with as”方法查询树型结构
一.with as 公用表表达式 类似VIEW,但是不并没有创建对象,WITH AS 公用表表达式不创建对象,只能被后随的SELECT语句,其作用: 1. 实现递归查询(树形结构) 2. 可以在一个 ...
- 一个简单的利用 WebClient 异步下载的示例(一)
继上一篇文章 一个简单的利用 HttpClient 异步下载的示例 ,我们知道不管是 HttpClient,还算 WebClient,都不建议每次调用都 new HttpClient,或 new We ...