客户端 API

浏览器对 WebSocket 协议的处理,无非就是三件事。

  • 建立连接和断开连接
  • 发送数据和接收数据
  • 处理错误

构造函数 WebSocket

WebSocket对象作为一个构造函数,用于新建WebSocket实例。

  1. var ws = new WebSocket('ws://localhost:8080');

执行上面语句之后,客户端就会与服务器进行连接。

webSocket.readyState

readyState属性返回实例对象的当前状态,共有四种。

  • CONNECTING:值为0,表示正在连接。
  • OPEN:值为1,表示连接成功,可以通信了。
  • CLOSING:值为2,表示连接正在关闭。
  • CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

下面是一个示例。

  1. switch (ws.readyState) {
  2. case WebSocket.CONNECTING:
  3. // do something
  4. break;
  5. case WebSocket.OPEN:
  6. // do something
  7. break;
  8. case WebSocket.CLOSING:
  9. // do something
  10. break;
  11. case WebSocket.CLOSED:
  12. // do something
  13. break;
  14. default:
  15. // this never happens
  16. break;
  17. }

webSocket.onopen

实例对象的onopen属性,用于指定连接成功后的回调函数。

  1. ws.onopen = function () {
  2. ws.send('Hello Server!');
  3. }

如果要指定多个回调函数,可以使用addEventListener方法。

  1. ws.addEventListener('open', function (event) {
  2. ws.send('Hello Server!');
  3. });

webSocket.onclose

实例对象的onclose属性,用于指定连接关闭后的回调函数。

  1. ws.onclose = function(event) {
  2. var code = event.code;
  3. var reason = event.reason;
  4. var wasClean = event.wasClean;
  5. // handle close event
  6. };
  7. ws.addEventListener("close", function(event) {
  8. var code = event.code;
  9. var reason = event.reason;
  10. var wasClean = event.wasClean;
  11. // handle close event
  12. });

webSocket.onmessage

实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。

  1. ws.onmessage = function(event) {
  2. var data = event.data;
  3. // 处理数据
  4. };
  5. ws.addEventListener("message", function(event) {
  6. var data = event.data;
  7. // 处理数据
  8. });

注意,服务器数据可能是文本,也可能是二进制数据(blob对象或Arraybuffer对象)。

  1. ws.onmessage = function(event){
  2. if(typeOf event.data === String) {
  3. console.log("Received data string");
  4. }
  5. if(event.data instanceof ArrayBuffer){
  6. var buffer = event.data;
  7. console.log("Received arraybuffer");
  8. }
  9. }

除了动态判断收到的数据类型,也可以使用binaryType属性,显式指定收到的二进制数据类型。

  1. // 收到的是 blob 数据
  2. ws.binaryType = "blob";
  3. ws.onmessage = function(e) {
  4. console.log(e.data.size);
  5. };
  6. // 收到的是 ArrayBuffer 数据
  7. ws.binaryType = "arraybuffer";
  8. ws.onmessage = function(e) {
  9. console.log(e.data.byteLength);
  10. };

webSocket.send()

实例对象的send()方法用于向服务器发送数据。

发送文本的例子。

  1. ws.send('your message');

发送 Blob 对象的例子。

  1. var file = document
  2. .querySelector('input[type="file"]')
  3. .files[0];
  4. ws.send(file);

发送 ArrayBuffer 对象的例子。

  1. // Sending canvas ImageData as ArrayBuffer
  2. var img = canvas_context.getImageData(0, 0, 400, 320);
  3. var binary = new Uint8Array(img.data.length);
  4. for (var i = 0; i < img.data.length; i++) {
  5. binary[i] = img.data[i];
  6. }
  7. ws.send(binary.buffer);

webSocket.bufferedAmount

实例对象的bufferedAmount属性,表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束。

  1. var data = new ArrayBuffer(10000000);
  2. socket.send(data);
  3. if (socket.bufferedAmount === 0) {
  4. // 发送完毕
  5. } else {
  6. // 发送还没结束
  7. }

webSocket.onerror

实例对象的onerror属性,用于指定报错时的回调函数。

  1. socket.onerror = function(event) {
  2. // handle error event
  3. };
  4. socket.addEventListener("error", function(event) {
  5. // handle error event
  6. });