浏览器和服务器建立WebSockets双向交互通信

WebSocket对象用于创建与服务器的WebSocket连接,以及在该连接上发送和接收数据 。

推荐一个在线webSocket测试的工具 http://www.idcd.com/tool/socket 。socket服务器连接地址 ws://www.idcd.com:8866

var webSocket = new WebSocket(url, protocols);

参数说明

url

连接的URL,这应该是WebSocket服务器响应的URL。wss://为安全连接,ws://连接用于本地连接。

protocols

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

WebSocket连接

var webSocket= new WebSocket("wss://www.idcd.com/socketserver", "protocolOne");
var webSocket= new WebSocket("ws://www.idcd.com/socketserver", ["protocolOne", "protocolTwo"]);

返回一个新创建的WebSocket对象。

属性

WebSocket.readyState

只读属性,返回当前WebSocket连接的状态

状态描述
CONNECTING0表示正在连接
OPEN1表示连接成功
CLOSING2表示连接正在关闭
CLOSED3表示连接已经关闭或者连接失败
var readyState = webSocket.readyState;

WebSocket.url

只读属性返回的绝对URL

var url = webSocket.url;

WebSocket.protocol

只读属性,返回子服务器协议的名称; 这是创建WebSocket对象时参数中指定的字符串之一,如果未建立连接,则为空字符串。

var protocol = webSocket.protocol;

WebSocket.onopen

打开连接时要调用的事件侦听器

webSocket.onopen = function(event) {
  console.log("WebSocket is open now.");
};

WebSocket.onmessage

从服务器收到消息时要调用的事件侦听器。

webSocket.onmessage = function(event) {
  console.debug("WebSocket message received:", event);
};

WebSocket.onerror

发生错误时将调用事件侦听器。

webSocket.onerror = function(event) {
  console.error("WebSocket error observed:", event);
};

WebSocket.onclose

连接关闭时要调用的事件侦听器。

webSocket.onclose = function(event) {
  console.log("WebSocket is closed now.");
};

WebSocket.extensions

只读属性,服务器选择的扩展名。

var extensions = webSocket.extensions;

WebSocket.bufferedAmount

只读属性,排队数据的字节数。

var bufferedAmount = webSocket.bufferedAmount;

WebSocket.binaryType

连接使用的二进制数据类型。

var binaryType = webSocket.binaryType;

方法

WebSocket.close([code[, reason]])

关闭连接。

WebSocket.close();

参数

code可选的
指示状态代码的数字值,用于解释为什么关闭连接。如果未指定此参数,则默认值为1005。
reason可选的
易于理解的字符串,用于说明连接为何关闭。该字符串不得超过123个字节的UTF-8文本(非字符)。

抛出异常

INVALID_ACCESS_ERR :code指定了无效的。
SYNTAX_ERR :该reason字符串过长或包含不成替代品

指示状态码

状态码 名称 描述
0–999 保留段, 未使用.
1000 CLOSE_NORMAL 正常关闭; 无论为何目的而创建, 该链接都已成功完成任务.
1001 CLOSE_GOING_AWAY 终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开.
1002 CLOSE_PROTOCOL_ERROR 由于协议错误而中断连接.
1003 CLOSE_UNSUPPORTED 由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收到了二进制数据).
1004 保留. 其意义可能会在未来定义.
1005 CLOSE_NO_STATUS 保留. 表示没有收到预期的状态码.
1006 CLOSE_ABNORMAL 保留. 用于期望收到状态码时连接非正常关闭 (也就是说, 没有发送关闭帧).
1007 Unsupported Data 由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据).
1008 Policy Violation 由于收到不符合约定的数据而断开连接. 这是一个通用状态码, 用于不适合使用 1003 和 1009 状态码的场景.
1009 CLOSE_TOO_LARGE 由于收到过大的数据帧而断开连接.
1010 Missing Extension 客户端期望服务器商定一个或多个拓展, 但服务器没有处理, 因此客户端断开连接.
1011 Internal Error 客户端由于遇到没有预料的情况阻止其完成请求, 因此服务端断开连接.
1012 Service Restart 服务器由于重启而断开连接. [Ref]
1013 Try Again Later 服务器由于临时原因断开连接, 如服务器过载因此断开一部分客户端连接. [Ref]
1014 由 WebSocket 标准保留以便未来使用.
1015 TLS Handshake 保留. 表示连接由于无法完成 TLS 握手而关闭 (例如无法验证服务器证书).
1016–1999 由 WebSocket 标准保留以便未来使用.
2000–2999 由 WebSocket 拓展保留使用.
3000–3999 可以由库或框架使用. 不应由应用使用. 可以在 IANA 注册, 先到先得.
4000–4999 可以由应用使用.

WebSocket.send(data)

使要发送的数据入队。

webSocket.send("Hello server!");

参数

数据发送到服务器,可以是以下类型:

USVString文本字符串,字符串以UTF-8格式添加到缓冲区。
ArrayBuffer您可以发送类型化数组对象使用的基础二进制数据。
Blob指定一个值Blob会使Blob的原始数据进入二进制帧。
ArrayBufferView您可以将任何JavaScript类型的数组对象作为二进制帧发送。

抛出异常

INVALID_STATE_ERR : 当前没有连接OPEN。
SYNTAX_ERR : 数据是具有未配对代理的字符串。

Event 事件监听

使用addEventListener()或通过将事件侦听器分配给此接口的属性来侦听这些事件。

事件名称

close当与服务器的连接关闭时触发,也可以使用onclose属性。
error当WebSocket由于错误而关闭与的连接(例如无法发送某些数据)时触发,也可使用onerror属性。
message接收数据时触发,也可使用onmessage属性。
open与服务器的连接打开时触发,也可使用onopen。

使用示例

// 创建一个WebSocket连接对象.
var webSocket = new WebSocket('ws://localhost:8080');

// 监听 打开连接时
webSocket.addEventListener('open', function (event) {
    webSocket.send('Hello Server!');
});

// 监听 收到消息时
webSocket.addEventListener('message', function (event) {
    webSocket.log('Message from server ', event.data);
});