HTML5之websocket

  • 初识websocket
  • websocket的应用:构造函数、常量、属性、方法
  • websocket应用示例

 一、初识websocket

1.1Websocket是一种网络协议,是在HTTP基础上做出一些优化的协议,与HTTP无直接关系。WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。

 

1.2HTTP协议相关回顾:

HTTP(超文本传输协议):规定了web浏览器如何从web服务器获取文档和向web服务器提交表单内容,以及web服务器如何响应这些请求和提交返回给浏览器。

HTTP的第一个版本叫做HTTP/0.9是一种为互联网原始数据传输服务的简单协议。由RFC1945[6]定义的HTTP/1.0进一步完善了这个协议。它允许消息以类MIME消息的格式传送,它包括传输数据的辕信息和对请求/响应语义的修饰。

HTTP/1.0没有充分考虑到分层代理,缓存,以及持久连接和虚拟主机的需求的影响。

HTTP/1.1版本对1.0版本做了优化,开始支持长连接和缓存。

 

1.3为什么需要webSocket?

因为HTTP协议有一个缺陷:通信只能由客户端发起。服务器端不能时实发送最新数据给客户端,如果遇到客户端需要时实获取服务器上的最新数据,就需要使用Ajax轮训来请求最新数据。这种实现方案显然要消耗大量的网络请求资源,对于客户端的定时器触发轮训也是比较大的性能消耗,而服务器还需要处理很多多余的网络请求。

通过webSocket可以建立一个连接只需要一次握手,然后,浏览器和服务器之间就可以直接进行数据交互。这就意味着服务器可以时实向客户端发送数据,而不需要重复的通过客户端来请求。

 

1.4websocket请求报文:

Request Headers(请求头

Accept-Encoding:gzip,deflate,sdch(接受编码格式

Accept-Language:zh-CN,zh,q=0.8(接受语言

Cache-Control:no-cache(缓存控制:无缓冲

Connection:Upgrade(连接

Host:echo.websocket.org(请求的服务器地址:服务器域名/IP 端口

Origin:file://(请求发起端

Pragma:no-cache(报文指令

Sec-WebSocket-Extenslons:permessage-deflate;client_max_window_bits(用户定义的字符串,用来区分同RUL下,不同服务所需要的协议

Sec-WebSocket-key:8DtPaH9DH2Qsw6BK0q6FCw==(随机字符串,服务器端使用这个数据构造出一个SHA-1的信息摘要。把“Sec-WebSocket-key”加上一个特殊字符串,然后计算SHA-1摘要,之后进行BASE-64编码,将结果作为“Sec-WebSocket-Accept”头的值,返回给客户端。这样操作,可以尽量避免普通HTTP请求被误认为Websocket协议

Sec-WebSocket-Version:13(表示支持的WebSocket版本,RFC645要求使用的版本是13,之前草案的版本均应当弃用

Upgrade:websocket(表示希望升级到WebSocket协议

User-Agent:Mozilla/5.0...(用户代理

 

1.5WebSocket特点:

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

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

  (c)数据格式比较轻量,性能开销小,通信高效。

  (d)可以发送文本,也可以发送二进制数据。

  (e)没有同源限制,客户端可以与任意服务器通信。(就是说可以通过websocket实现跨域)

  (f)协议标识符为ws(如果加密为wss)服务器网址就是url

 

1.6浏览器兼容性:

Chrome

Firefox

IE>=10

Sarafi>=6

Android>=4.4

iOS>=8

 二、websocket的应用

这里有一篇不错的教程:https://www.cnblogs.com/jingmoxukong/p/7755643.html

2.1WebSocket客户端API

var Socket = new WebSocket(url, [protocol]);

URL:指定连接的URL。

protocol:可选,指定可接受的子协议。

 

2.2WebSocket的属性:

WebSocket.binaryType:使用二进制的数据类型连接。

WebSocket.bufferedAmount:未发送至服务器的字节数。

WebSocket.extensions:服务器选择的扩展。

WebSocket.onclose:指定连接关闭的回调函数。

WebSocket.onerror:用于指定连接失败后的回调函数。

WebSocket.onmessag:指定当从服务器接受到信息时的回调函数。

WebSocket.onopen:指定连接成功后的回调函数。

WebSocket.readyState:当前连接状态。

WebSocket.url:WebSocket的绝对路径。

 

2.3WebSocket的方法:

WebSocket.close(code,reason):关闭当前连接

  参数code:一个数字状态码,他解释了连接关闭的原因。如果没有传递这个参数,默认使用1005。关于状态码可以了解:https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes

  参数reason:返回关闭原因,字符串类型,UTF-8编码的字符串不能超过123个字节。

WebSocket.send(data):向服务器发送数据

  参数data:可以是USVString(文本字符串)、ArrayBuffer(数组对象发送的底层二进制数据)、Blob类型(将Blob中的原始数据以二进制传输)、ArrayBufferView(二进制帧的形式发送任何JavaScript类数组对象)。

 

2.4简单的使用websocket

 1 var socket = new WebSocket('ws://echo.websocket.org/');
 2 //ws://echo.websocket.org/ 官方开发测试接口,向它发送什么数据它返回什么数据
 3 socket.onopen = function(){ //连接成功触发
 4     socket.send('hello');
 5 }
 6 socket.onmessage = function(e){ //接收到服务器响应触发
 7     console.log('message');
 8     console.log(e);
 9     console.log(e.data);
10     socket.close(); //关闭连接
11 }
12 socket.onlose = function(e){ //关闭连接后触发
13     console.log('close');
14     console.log(e);
15 }
16 socket.onerror = function(){ //出现错误时触发
17     console.log('erre');
18 }

2.5websocket.readyState当前连接状态与WebSocket常量

WebSocket.CONNECTING = 0;(正在连接中)

WebSocket.OPEN = 1;(已经连接并且可以通讯)

WebSocket.CLOSING = 2;(连接正在关闭)

WebSocket.CLOSED = 3;(连接已关闭或者没有连接成功)

 

(关于示例应用,有时间再来补充)

 

posted @ 2019-08-09 10:35  他乡踏雪  阅读(796)  评论(0编辑  收藏  举报