Skip to content

前端页面和ThingUE通信方式

通信原理

UE的云渲染使用WebRTC作为底层交互协议,实现了实时的音视频通信(SRTP)和数据交互(SCTP)。在云渲染中,客户端和服务器之间进行信令通信以建立和管理通信会话。例如建立连接、断开连接、媒体协商等。

通信方式

  • 通过内置服务通信

    通过ThingUE内部提供的全局接口函数直接和前端通信,适用于数据量小,且通信不频繁的情况,具体方式如下:

    • ThingUE端:

      • 新建message.js脚本文件并添加以下消息监听代码:

        javascript
        //订阅消息
        addEventListener('ToUEMessage', (data)=>{
            console.log('receive message: ', data);
        });
        
        //发送消息
        postMessage('send to web.');

        image

      • 在入口函数中引用message.js;

        image

      • 双击ThingUE根目录下的 server.bat 以启动ThingUE云渲染服务。

    • web端

      1. 使用内置html监听消息

        • 在浏览器中直接访问 127.0.0.1 即可打开ThingUE场景。
        • 通过 F12 打开 控制台 并在控制台中输入以下代码并执行:
          javascript
          //发送消息
          window.postMessage("send to ThingUE.");
        • 查看ThingUE日志文件或者控制台可以看到web端发送的消息。
      2. 使用自定义html监听消息

        • 通过以下代码创建html页面并打开即可加载ThingUE场景:
          javascript
          //html页面创建
          <!DOCTYPE html>
          <html lang="cn">
          <head>
              <title>ThingUE</title>
              <style>
                  body,
                  html {
                      height: 100%;
                      margin: 0;
                      padding: 0;
                      overflow: hidden;
                  }
          
                  iframe {
                      width: 100%;
                      height: 100%;
                      border: none;
                  }
              </style>
          </head>
          
          <body>
              <!-- id:创建iframe的id; src: ThingUE云渲染访问地址 -->
              <iframe id="player" src="http://127.0.0.1"></iframe>
              <script>
                  window.onmessage = async function (e) {
                      //监听ThingUE消息
                      console.log("receive message: ", e.data);
                  }
              </script>
          </body>
          </html>
        • 通过 F12 打开 控制台 并在控制台中输入以下代码发送消息到ThingUE:
          javascript
          //发送消息
          //'player'指的是iframe的id
          let player = document.getElementById('player');
          player.contentWindow.postMessage("send to ThingUE......", "*");
          
          //接受消息
          window.onmessage = async function (e) {
              console.log("receive message: ", e.data);
          }
  • 通过搭建websocket服务通信

    通过搭建一个简易的socket服务(服务最好在前端搭建,更加灵活,这里仅示例)和前端通信,适用于数据量大,通信频繁的情况。具体做法参考下面代码,webServer是通信服务类,在ThingUE中引用后,可通过前端订阅连接测试,也可通过websocket-test.com连接测试。

    • ThingUE端:

      • 新建文件socket.js并拷贝以下代码到脚本中实现一个简单socket服务:
        javascript
        const WebSocket = require('ws');
        class webServer {
            socket = null;
            webServer = null;
            constructor() {
                //port: 端口号; maxConnections:最大连接数
                this.webServer = new WebSocket.Server({ port: 8899, maxConnections: 100 });
            }
            /**
             * 连接成功后订阅消息
            */
            server(callback) {
                let that = this;
                this.webServer.on('connection', (socket) => {
                    that.socket = socket;
                    // 处理连接
                    console.log('新客户端已连接');
                    socket.on('message', (message) => {
                        // 处理接收到的消息
                        callback && callback(message);
                    });
                    socket.on('close', () => {
                        // 处理连接关闭
                        console.log('客户端已断开连接');
                    });
                });
            }
            /**
             * 发送消息
            */
            send(msg) {
                if (this.socket) {
                    this.socket.send(typeof (msg) === "object" ? JSON.stringify(msg) : msg);
                } else {
                    console.log("please link the service first.");
                }
            }
        }
        global.socket = new webServer();
        module.exports = webServer;
      • 引用socket并监听消息:
        javascript
        //接受消息
        socket.server((message) =>{
            console.log("receive message: ", message);
        });
        
        //发送消息
        socket.send("send to web.");
        image
    • web端

      • 创建websoket

        javascript
        <!DOCTYPE html>
        <html lang="cn">
        
        <head>
            <title>ThingUE</title>
            <style>
                body,
                html {
                    height: 100%;
                    margin: 0;
                    padding: 0;
                    overflow: hidden;
                }
        
                iframe {
                    width: 100%;
                    height: 100%;
                    border: none;
                }
            </style>
        </head>
        
        <body>
            <iframe id="player" src="http://127.0.0.1"></iframe>
            <script>
                //实例化socket
                this.socket = new WebSocket("ws://127.0.0.1:8899");
                // 连接建立时触发
                this.socket.onopen = function (event) {
                    console.log("WebSocket连接已建立");
                };
                // 接收到消息时触发
                this.socket.onmessage = function (event) {
                    console.log("接收到服务器的消息:", event.data);
                };
                let that = this;
                //按下任意键盘按钮发送消息到ThingUE
                document.addEventListener("keydown", function (event) {
                    that.socket.send("send to ThingUE......");
                });
            </script>
        </body>
        
        </html>
      • 通过按下任意键盘按钮发送消息到ThingUE。

京ICP备13053130号 京公网安备11010502050947号