客户端简单示例

  1. var ws = new WebSocket("wss://echo.websocket.org");
  2. ws.onopen = function(evt) {
  3. console.log("Connection open ...");
  4. ws.send("Hello WebSockets!");
  5. };
  6. ws.onmessage = function(evt) {
  7. console.log( "Received Message: " + evt.data);
  8. ws.close();
  9. };
  10. ws.onclose = function(evt) {
  11. console.log("Connection closed.");
  12. };

客户端的 API

WebSocket 构造函数

  • WebSocket 对象作为一个构造函数,用于新建 WebSocket 实例
    1. // 新建一个本地的 WebSocket 实例
    2. let 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 = () => {
    2. ws.send('Hello Server!')
    3. }
    4. // 或者
    5. ws.onopen = function() {
    6. ws.send('Hello Server!')
    7. }
  • 指定多个回调函数,可以使用 addEventListener 方法

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

    WebSocket.onclose

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

    1. ws.onclose = function(event) {
    2. let code = event.code;
    3. let reason = event.reason;
    4. let wasClean = event.wasClean;
    5. }
    6. // 或
    7. ws.addEventListener('close', (event) => {
    8. let code = event.code;
    9. let reason = event.reason;
    10. let wasClean = event.wasClean;
    11. })

    WebSocket.onmessage

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

    1. ws.onmessage = (event) {
    2. let data = event.data;
    3. // 处理数据
    4. }
    5. // 或
    6. ws.addEventListener('message', (event) {
    7. let data = event.data;
    8. // 处理数据
    9. })

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

  1. ws.onmessage = function(event){
  2. // 类型转换(文本转换)
  3. if(typeof event.data === String) {
  4. console.log("Received data string");
  5. }
  6. // 类型转换(二进制数组转换)
  7. if(event.data instanceof ArrayBuffer){
  8. var buffer = event.data;
  9. console.log("Received arraybuffer");
  10. }
  11. }

除了动态判断收到的数据类型,也可以使用 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 属性,表示还有多少字节的二进制数据没有发送出去,用来判断发送是否结束 ```javascript var data = new ArrayBuffer(10000000); socket.send(data);

if (socket.bufferedAmount === 0) { // 发送完毕 } else { // 发送还没结束 }

  1. <a name="A6FIQ"></a>
  2. ## WebSocket.onerror
  3. - 实例对象的 `onerror` 属性,用于指定报错时的回调函数
  4. ```javascript
  5. socket.onerror = function(event) {
  6. // handle error event
  7. };
  8. socket.addEventListener("error", function(event) {
  9. // handle error event
  10. });