WebSocket简介

1.定义

    

Websocket协议是一个持久化协议,建立在Tcp协议之上,无论是客户还是服务器,任何一端都可以执行主动关闭,通常情况是,客户执行主动关闭。


2.与Http协议的比较

协议 Http协议 Websocket协议

简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
(1)建立在 TCP 协议之上,服务器端的实现比较容易。

2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
(3)数据格式比较轻量,性能开销小,通信高效。

4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
(4)可以发送文本,也可以发送二进制数据。

5、支持B/S及C/S模式。
(5)没有同源限制,客户端可以与任意服务器通信。


(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
ws:对应的是http请求

wss:对应的是https请求

WebSocket简介

3.Websocket请求与响应 

   3.1请求

WebSocket简介

Sec-WebSocket-Protocol:
一个Base64 encode的值,这个是浏览器随机生成的,用于验证是不是websocket服务器。
Sec-WebSocket-Version:
告诉服务器所使用的 Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。。不过现在现在已经确认为13。

Upgrade:

    更新http协议为websocket协议

3.2响应

WebSocket简介

sec-websocket-accept
这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。

3.3错误情况

  如果服务器还是http服务器而非websocket服务器,将会创建websocket连接失败。

  WebSocket简介


4.详细介绍

 

WebSocket构造函数接受一个必需和一个可选参数:
WebSocket WebSocket(
  in DOMString url,
  in optional DOMString protocols
);


WebSocket WebSocket(
  in DOMString url,
  in optional DOMString[] protocols
);
url
要连接的URL; 这应该是WebSocket服务器将响应的URL。
protocols 可选的
无论是单个协议字符串还是协议字符串数组。这些字符串用于指示子协议,以便单个服务器可以实现多个WebSocket子协议(例如,您可能希望一个服务器能够根据指定处理不同类型的交互protocol)。如果您不指定协议字符串,则假定为空字符串。
构造函数可以抛出异常:
SECURITY_ERR
正在尝试连接的端口正在被阻止。
方法概述
void close(in optional unsigned long code, in optional DOMString reason);
void send(in DOMString data);
属性
属性
类型
描述
binaryType
指示连接传输的二进制数据类型的字符串。如果Blob正在使用DOM 对象,则应该是“blob”,如果正在使用对象,则应该是“arraybuffer” ArrayBuffer
bufferedAmount
unsigned long
已使用呼叫排队send()但尚未传输到网络的数据的字节数。一旦发送了所有排队的数据,该值就会重置为零。连接关闭时,该值不会重置为零; 如果你继续打电话send(),这将继续攀升。只读
extensions
服务器选择的扩展名。这当前只是由连接协商的空字符串或扩展列表。
onclose
在WebSocket连接readyState更改时调用事件侦听器CLOSED。监听者收到一个CloseEvent名为“close”的消息。
onerror
发生错误时要调用的事件侦听器。这是一个名为“error”的简单事件。
onmessage
从服务器收到消息时要调用的事件侦听器。监听者收到一个MessageEvent指定的“消息”。
onopen
在WebSocket连接readyState更改时调用事件侦听器OPEN; 这表示连接已准备好发送和接收数据。这个事件是一个简单的,名称为“open”的事件。
protocol
一个字符串,指示服务器选择的子协议的名称; 这将是protocols创建WebSocket对象时在参数中指定的字符串之一。
readyState
unsigned short
连接的当前状态; 这是就绪状态常量之一只读。
url
由构造函数解析的URL。这永远是一个绝对的URL。只读。
常量
就绪状态常量
这些常量由readyState属性用来描述WebSocket连接的状态。
不变
描述
CONNECTING
0
连接尚未打开。
OPEN
1
连接已打开并准备好进行通信。
CLOSING
2
连接正在关闭。
CLOSED
3
连接已关闭或无法打开。
方法
关()
关闭WebSocket连接或连接尝试(如果有的话)。如果连接已经存在CLOSED,这个方法什么也不做。
void close( 在可选的无符号短代码中, 在可选的DOMString原因中);
参数
code 可选的
指示状态代码的数字值,说明连接关闭的原因。如果未指定此参数,则假定默认值为1005。查看页面上的状态代码列表以CloseEvent获取允许的值。
reason 可选的
一个可读的字符串,解释连接关闭的原因。该字符串不得超过123个字节的UTF-8文本(不是字符)。
抛出异常
INVALID_ACCESS_ERR
code指定了无效。
SYNTAX_ERR
reason字符串过长或包含不成替代品。
注意:在Gecko中,此方法在Gecko 8.0(Firefox 8.0 / Thunderbird 8.0 / SeaMonkey 2.5)之前不支持任何参数。
发送()
通过WebSocket连接将要传输的指定数据排入服务器,将值增加bufferedAmount包含数据所需的字节数。如果数据无法发送(例如,因为需要缓冲但缓冲区已满),则套接字会自动关闭。
WebSocket简介
参数
data
要发送到服务器的数据。它可能是以下类型之一:
一个文本字符串。该字符串以UTF-8格式添加到缓冲区,并且值bufferedAmount增加了表示UTF-8字符串所需的字节数。
您可以发送由类型化数组对象使用的底层二进制数据; 其二进制数据内容在缓冲区中排队,将值增加bufferedAmount必要的字节数。
指定Blob将blob的原始数据排入二进制帧中传输。该值将bufferedAmount增加该原始数据的字节大小。
您可以将任何JavaScript类型的数组对象作为二进制框架发送; 其二进制数据内容在缓冲区中排队,将值增加bufferedAmount必要的字节数。
抛出异常
INVALID_STATE_ERR
该连接目前不是OPEN
SYNTAX_ERR
数据是具有不成对代理的字符串。
注意: Gecko的send()方法实现与Gecko 6.0中的规范有所不同; Gecko返回一个boolean指示连接是否仍然打开(以及扩展,数据已成功排队或传输); 这在Gecko 8.0中得到了纠正。
从Gecko 11.0开始,支持ArrayBuffer被实现,但不支持Blob数据类型。
WebSocket简介