# RCoder Agent Runner - 远程桌面服务 本目录包含 `rcoder-agent-runner` 容器的配置文件,提供完整的远程桌面解决方案,包括 VNC 远程桌面、本地输入法透传、音频流传输等功能。 ## 📋 目录 - [架构概览](#架构概览) - [服务端口](#服务端口) - [VNC 远程桌面](#vnc-远程桌面) - [本地输入法透传](#本地输入法透传) - [音频流传输](#音频流传输) - [前端集成指南](#前端集成指南) - [API 接口文档](#api-接口文档) --- ## 架构概览 ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ 用户浏览器 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ noVNC Canvas │ │ IME 隐藏输入框 │ │ Audio Player │ │ │ │ (VNC 画面) │ │ (输入法捕获) │ │ (音频播放) │ │ │ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │ │ │ │ │ │ │ │ ws://host:6080 │ ws://host:6091 │ ws://host:6089│ │ │ (VNC 协议) │ (文本输入) │ (Opus 音频) │ │ ▼ ▼ ▼ │ └────────────┬─────────────────────┬─────────────────────┬───────────────┘ │ │ │ ┌────────────┴─────────────────────┴─────────────────────┴───────────────┐ │ 容器内部 │ ├────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │ │ │ noVNC Proxy │ │ IME Server │ │ Audio Server │ │ x11vnc │ │ │ │ Port: 6080 │ │ Port: 6091 │ │ Port: 6089 │ │ Port: 5900 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ └────────────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ X11 Display (:0) │ │ │ │ XFCE4 桌面环境 │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────┘ ``` --- ## 服务端口 | 端口 | 服务 | 协议 | 说明 | |------|------|------|------| | **6080** | noVNC | WebSocket (VNC) | 远程桌面画面和键鼠输入 | | **6091** | IME Server | WebSocket (JSON) | 本地输入法文本透传 | | **6089** | Audio Server | WebSocket (Binary) | 音频流传输 (Opus 编码) | | **6090** | Audio HTTP | HTTP | 音频播放器静态页面 | | 5900 | x11vnc | VNC | 原始 VNC 协议(内部使用) | --- ## VNC 远程桌面 ### 功能说明 - **基于 noVNC**: 纯 Web VNC 客户端,无需安装插件 - **分辨率**: 默认 1280x800,可通过 URL 参数调整 - **自动连接**: 支持 `autoconnect=true` 参数 - **自适应缩放**: 支持 `resize=scale` 参数 ### 前端接入 #### 方式一:直接嵌入 iframe ```html ``` #### 方式二:使用 noVNC JavaScript API ```html
``` ### URL 参数 | 参数 | 说明 | 示例 | |------|------|------| | `autoconnect` | 自动连接 | `true` | | `resize` | 缩放模式 | `scale` / `remote` | | `quality` | 画面质量 | `0-9` (9 最高) | | `compression` | 压缩级别 | `0-9` (9 最高压缩) | --- ## 本地输入法透传 ### 功能说明 允许用户使用**宿主机的输入法**(如搜狗输入法、微软拼音等)直接输入到远程桌面,无需在远程桌面内切换输入法。 ### 工作原理 ``` 1. 用户点击 VNC 画面 → 焦点切换到隐藏输入框 2. 用户使用本地输入法输入(如输入 "zhongguo" 选择 "中国") 3. 前端捕获 compositionend 事件,获取 "中国" 4. 通过 WebSocket 发送到 IME Server 5. IME Server 使用 xdotool 将文本输入到远程桌面当前焦点窗口 ``` ### 前端接入 #### 方式一:使用内置脚本(推荐) 如果使用我们提供的 `vnc.html`,IME 透传已内置,无需额外配置。 #### 方式二:手动集成 ```html ``` ### WebSocket 协议 #### 发送消息格式 ```json { "type": "text", "text": "要输入的文本", "method": "xdotool" // 可选: "xdotool"(默认) 或 "clipboard" } ``` #### 响应消息格式 ```json // 成功 { "status": "ok" } // 失败 { "status": "error", "message": "错误信息" } // 心跳响应 { "type": "pong" } ``` #### 心跳保活 ```json // 发送 { "type": "ping" } // 响应 { "type": "pong" } ``` --- ## 音频流传输 ### 功能说明 将远程桌面的音频(如视频播放、系统提示音)通过 WebSocket 实时传输到浏览器播放。 ### 技术栈 - **采集**: PulseAudio 虚拟声卡 - **编码**: Opus (48kHz, 立体声) - **传输**: WebSocket (二进制) - **播放**: Web Audio API ### 前端接入 #### 方式一:嵌入音频播放器页面 ```html ``` #### 方式二:直接使用 pcmflux 客户端 ```html ``` ### WebSocket 协议 音频数据通过 WebSocket 以**二进制帧**传输,格式为 Opus 编码的音频包。 ```javascript const ws = new WebSocket('ws://容器IP:6089'); ws.binaryType = 'arraybuffer'; ws.onmessage = (event) => { const opusData = new Uint8Array(event.data); // 使用 Opus 解码器解码后播放 decodeAndPlay(opusData); }; ``` ### 注意事项 > [!IMPORTANT] > **浏览器安全限制**: 由于浏览器自动播放策略,音频播放必须由用户交互(如点击按钮)触发。 --- ## 前端集成指南 ### 完整示例 ```html