WebSocket连接

在这里插入图片描述
在这里插入图片描述


场景介绍

WebSocket时一种网络通信协议,它允许客户端和服务器之间建立一个持久的连接,并在该连接上进行全双工通信,连接之后客户端和服务器端可以同时主动发送数据,这是WebSocket和传统的HTTP协议最大的区别,HTTP以单向通信为主,客户端发起请求,服务器端响应数据,一次传输之后,连接会断开。一般情况下,HTTP适用于一次性数据获取(如网页内容加载),Websocket适用于实时性要求高的场景下(如在线聊天、实时游戏),以避免频繁建立连接提升用户体验。

该模块给第三方应用提供webSocket客户端和服务端能力,实现客户端与服务端的双向连接,目前服务端仅支持智慧屏使用。

客户端:使用WebSocket建立服务器与客户端的双向连接,需要先通过createWebSocket()方法创建WebSocket对象,然后通过connect()方法连接到服务器。当连接成功后,客户端会收到open事件的回调,之后客户端就可以通过send()方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到message事件的回调。当客户端想要取消此连接时,通过调用close()方法主动断开连接后,客户端会收到close事件的回调。若在上述任一过程中发生错误,客户端会收到error事件的回调。

服务端:(目前服务端仅支持智慧屏使用)使用WebSocket建立服务器与客户端的双向连接,需要先通过createWebSocketServer()方法创建WebSocketServer对象,然后通过start()方法启动服务器,监听客户端申请建链的消息。当连接成功后,服务端会收到connect事件的回调,之后服务端可以通过send()方法与客户端进行通信,可以通过listAllConnections()方法列举出当前与服务端建链的所有客户端信息。当客户端给服务端发消息时,服务端会收到messageReceive事件回调。当服务端想断开某个与客户端的连接时,可以通过调用close()方法主动断开与某个客户端的连接,之后服务端会收到close事件的回调。当服务端想停止service时,可以调用stop()方法。若在上述任一过程中发生错误,服务端会收到error事件的回调。

websocket支持心跳检测机制,在客户端和服务端建立WebSocket连接之后,每间隔30秒客户端会发送Ping帧给服务器,服务器收到后应立即回复Pong帧,且不支持开发者关闭该机制。

client端开发步骤

  1. 导入webSocket以及错误码模块。
import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
  1. 创建WebSocket连接,返回一个WebSocket对象。
let defaultIpAddress = "ws://";
let ws = webSocket.createWebSocket();
  1. 订阅WebSocket的打开、消息接收、关闭、Error事件(可选),当收到on(‘open’)事件时,可以通过send()方法与服务器进行通信,当收到服务器的bye消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接。。
ws.on('open', (err: BusinessError, value: Object) => {
  console.log("on open, status:" + JSON.stringify(value));
  // 当收到on('open')事件时,可以通过send()方法与服务器进行通信。
  ws.send("Hello, server!", (err: BusinessError, value: boolean) => {
    if (!err) {
      console.log("Message send successfully");
    } else {
      console.error("Failed to send the message. Err:" + JSON.stringify(err));
    }
  });
});
ws.on('message', (err: BusinessError, value: string | ArrayBuffer) => {
  console.log("on message, message:" + value);
  // 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接。
  if (value === 'bye') {
    ws.close((err: BusinessError, value: boolean) => {
      if (!err) {
        console.log("Connection closed successfully");
      } else {
        console.error("Failed to close the connection. Err: " + JSON.stringify(err));
      }
    });
  }
});
ws.on('close', (err: BusinessError, value: webSocket.CloseResult) => {
  console.log("on close, code is " + value.code + ", reason is " + value.reason);
});
ws.on('error', (err: BusinessError) => {
  console.error("on error, error:" + JSON.stringify(err));
});
  1. 根据URL地址,发起WebSocket连接。
ws.connect(defaultIpAddress, (err: BusinessError, value: boolean) => {
  if (!err) {
    console.log("Connected successfully");
  } else {
    console.error("Connection failed. Err:" + JSON.stringify(err));
  }
});

server端开发步骤

  1. 导入webSocket以及错误码模块。
import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
  1. 创建WebSocketServer对象。
let localServer: webSocket.WebSocketServer;
localServer = webSocket.createWebSocketServer();
  1. 订阅WebSocketServer的客户端连接事件、消息接收事件、关闭事件、Error事件(可选),在收到客户端连接事件后,服务端可以通过send()方法与客户端进行通信,当收到客户端的"bye"消息时(此消息字段仅为示意,具体字段需要与客户端协商),主动断开连接。
订阅WebSocketServer的客户端连接事件、消息接收事件、关闭事件、Error事件(可选),在收到客户端连接事件后,服务端可以通过send()方法与客户端进行通信,当收到客户端的"bye"消息时(此消息字段仅为示意,具体字段需要与客户端协商),主动断开连接。
  1. 配置config参数启动server端服务。
let config: webSocket.WebSocketServerConfig = {
  // 监听端口。
  serverPort: 8080,
  maxConcurrentClientsNumber: 10,
  maxConnectionsForOneClient: 10,
}
localServer.start(config).then((success: boolean) => {
  if (success) {
    console.info('webSocket server start success');
  } else {
    console.error('websocket server start failed');
  }
}).catch((error: BusinessError) => {
  console.error(`Failed to start. Code: ${error.code}, message: ${error.message}`);
});
  1. 服务端监听所有客户端连接状态(可选)。
let connections: webSocket.WebSocketConnection[] = [];
try {
  connections = await localServer.listAllConnections();
  if (connections.length === 0) {
    console.info('client list is empty');
  } else {
    console.error(`client list cnt: ${connections.length}, client connections list is: ${connections}`);
  }
} catch (error) {
  console.error(`Failed to listAllConnections. Code: ${error.code}, message: ${error.message}`);
}
  1. 需要关闭WebSocketServer端服务器时,可以通过stop()停止服务。
localServer.stop().then((success: boolean) => {
  if (success) {
    console.info('server stop service successfully');
  } else {
    console.error('server stop service failed');
  }
});

客户端完整示例

示例:

import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';


let defaultIpAddress = "ws://";
let ws = webSocket.createWebSocket();
ws.on('open', (err: BusinessError, value: Object) => {
  console.log("on open, status:" + JSON.stringify(value));
  // 当收到on('open')事件时,可以通过send()方法与服务器进行通信。
  ws.send("Hello, server!", (err: BusinessError, value: boolean) => {
    if (!err) {
      console.log("Message send successfully");
    } else {
      console.error("Failed to send the message. Err:" + JSON.stringify(err));
    }
  });
});
ws.on('message', (err: BusinessError, value: string | ArrayBuffer) => {
  console.log("on message, message:" + value);
  // 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接。
  if (value === 'bye') {
    ws.close((err: BusinessError, value: boolean) => {
      if (!err) {
        console.log("Connection closed successfully");
      } else {
        console.error("Failed to close the connection. Err: " + JSON.stringify(err));
      }
    });
  }
});
ws.on('close', (err: BusinessError, value: webSocket.CloseResult) => {
  console.log("on close, code is " + value.code + ", reason is " + value.reason);
});
ws.on('error', (err: BusinessError) => {
  console.error("on error, error:" + JSON.stringify(err));
});
ws.connect(defaultIpAddress, (err: BusinessError, value: boolean) => {
  if (!err) {
    console.log("Connected successfully");
  } else {
    console.error("Connection failed. Err:" + JSON.stringify(err));
  }
});

server端完整示例

  1. 导入需要的webSocket模块。

  2. 创建一个WebSocketServer对象。

  3. (可选)订阅WebSocketServer的客户端连接事件、消息接收事件、关闭事件、Error事件。

  4. 配置config参数,通过start()启动server端服务。

  5. 通过WebSocketServer收发消息、监听事件等。

  6. 使用完WebSocketServer端服务器后,通过stop()停止服务。

示例:

import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';


let connections: webSocket.WebSocketConnection[] = [];
let localServer: webSocket.WebSocketServer;
let config: webSocket.WebSocketServerConfig = {
  // 监听端口。
  serverPort: 8080,
  maxConcurrentClientsNumber: 10,
  maxConnectionsForOneClient: 10,
}


localServer = webSocket.createWebSocketServer();


localServer.on('connect', async (connection: webSocket.WebSocketConnection) => {
  console.info(`New client connected! Client ip: ${connection.clientIP}, Client port: ${connection.clientPort}`);
  // 当收到on('connect')事件时,可以通过send()方法与客户端进行通信。
  localServer.send("Hello, I'm server!", connection).then((success: boolean) => {
    if (success) {
      console.info('message send successfully');
    } else {
      console.error('message send failed');
    }
  }).catch((error: BusinessError) => {
    console.error(`message send failed, Code: ${error.code}, message: ${error.message}`);
  });


  try {
    connections = await localServer.listAllConnections();
    if (connections.length === 0) {
      console.info('client list is empty');
    } else {
      console.info(`client list cnt: ${connections.length}, client connections list is: ${connections}`);
    }
  } catch (error) {
    console.error(`Failed to listAllConnections. Code: ${error.code}, message: ${error.message}`);
  }
});


localServer.on('messageReceive', (message: webSocket.WebSocketMessage) => {
  try{
    console.info(`on message received, client: ${message.clientConnection}, data: ${message.data}`);
    // 当收到客户端的"bye"消息时(此消息字段仅为示意,具体字段需要与客户端协商),主动断开连接。
    if (message.data === 'bye') {
      localServer.close(message.clientConnection).then((success: boolean) => {
        if (success) {
          console.info('close client successfully');
        } else {
          console.error('close client failed');
        }
      });
    }
  } catch (error) {
    console.error(`on messageReceive failed. Code: ${error.code}, message: ${error.message}`);
  }
});


localServer.on('close', (clientConnection: webSocket.WebSocketConnection, closeReason: webSocket.CloseResult) => {
  console.info(`client close, client: ${clientConnection}, closeReason: Code: ${closeReason.code}, reason: ${closeReason.reason}`);
});


localServer.on('error', (error: BusinessError) => {
  console.error(`error. Code: ${error.code}, message: ${error.message}`);
});


localServer.start(config).then((success: boolean) => {
  if (success) {
    console.info('webSocket server start success');
  } else {
    console.error('websocket server start failed');
  }
}).catch((error: BusinessError) => {
  console.error(`Failed to start. Code: ${error.code}, message: ${error.message}`);
});


localServer.stop().then((success: boolean) => {
  if (success) {
    console.info('server stop service successfully');
  } else {
    console.error('server stop service failed');
  }
});

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RZer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值