本节主要介绍如何使用数据通道与云端运行的应用直接进行通信。当业务需要建立客户端与云端应用通信,传输相关启动参数、指令、消息或其他数据时,例如透传微信名和头像信息至云端应用,可以使用数据通道能力。
时序图
步骤说明
1.
业
务云端应用创建 UDP 服务,监听一个本地 UDP 端口(localhost 127.0.0.1
端口范围建议为 10000 - 20000),并开始等待接收 UDP 包。2. 业务客户端调用 TCGSDK.start() 接口启动云渲染应用,SDK 完成应用连接后会触发回调 onConnectSuccess(),建议业务客户端在这之后创建数据通道。
3. 业务客户端调用 TCGSDK.createCustomDataChannel() 接口创建透传通道,接口里的目标端口参数应为 步骤1 中云端应用监听的端口,如果创建失败则重复本步骤直到创建成功。
4.
数
据通道创建成功后,业务客户端可以调用 sendMessage() 发送业务自定义的数据包,云端应用 UDP 服务收到请求,解析出 UDP 来源地址。5. 云端应用向 步骤4 拿到的 UDP 来源地址发送自定义数据包,数据包将通过创建好的数据通道回传,业务客户端可以在回调 onMessage() 接口中处理回传的数据包。
示例代码
let timer = null;const { sendMessage, code } = await TCGSDK.createCustomDataChannel({destPort: xxxx, // destPort 端口范围建议为 10000-20000onMessage: (res) => {console.log('CustomDataChannel onMessage', res);// 收到该回调后,表示云端应用已成功拉起并成功向web 端发送数据,可以 clearInterval,之后正常发送数据// clearInterval(timer);},});// code 为 0 表示 web 端与云端数据通道已建立成功,但可能此时云端应用并未完全拉起(应用不能收发数据),web 端可以通过 setTimeout/setInterval/轮询等形式发送初始数据,直到云端应用正常回包。if (code === 0) {// 发送自定义数据sendMessage('test');// timer = setInterval(() => {// sendMessage('test');// }, 5000);} else {// 考虑重新创建数据通道}
int main() {int udp_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);if (udp_socket_fd == -1) {printf("socket failed!\\n");return -1;}// 设置目的 IP 地址struct sockaddr_in bind_addr = { 0 };bind_addr.sin_family = AF_INET;bind_addr.sin_port = htons(xxxx); // htons(xxxx) 中的端口范围建议为 10000-20000bind_addr.sin_addr.s_addr = inet_addr("0.0.0.0"); // 绑定 IP// 绑定端口int ret = bind(udp_socket_fd, (struct sockaddr *)&bind_addr, sizeof(bind_addr));if (ret < 0) {perror("bind fail:");close(udp_socket_fd);return -1;}// 开始等待客户端消息struct sockaddr_in upstream_addr = { 0 }; // 用来存放云渲染代理的地址int len = sizeof(upstream_addr);char buf[1024] = { 0 }; // 接收消息缓冲区while (true) {ret = recvfrom(udp_socket_fd, buf, sizeof(buf), 0, (struct sockaddr *)&upstream_addr, &len);if (ret == -1) {break;}// buf 为前端发来的消息 "test"// 后续可以用 upstream_addr 回传消息给前端const char* response = "response";sendto(udp_socket_fd, response, strlen(response), 0, (struct sockaddr *)&upstream_addr, sizeof(upstream_addr));}return 0;}
常见问题
数据通道创建成功,业务前端发送数据成功,但没有收到云端应用回复的数据?
TCGSDK.createCustomDataChannel() 接口调用成功表示业务前端与云端数据通道已建立成功,但可能此时云端应用并未完全拉起,业务前端可以通过 timeout/interval/轮询等形式发送自定义数据,确保云端应用成功拉起后正常接收到业务前端发送的自定义数据。只要数据通道创建成功,默认数据能发送成功。
在onMessage 回调中确定收到云端应用数据,可以取消轮询,之后正常发送数据。
可以收发的数据类型有哪些?
sendMessage()
接口支持 string | ArrayBuffer 数据类型。数据包传输大小是否有限制?
服务对传输数据包大小没有限制,但是需要注意 UDP 最大包长是 64KB,建议包大小应该小于 MTU 1500。如果包体过大,建议通过分包形式传输,如果太多数据上行容易导致拥塞影响体验。