💬 手机写,电脑贴。 在手机上输入文本,一键推送到 Windows 电脑并自动写入剪贴板,像「隔空复制」一样自然。
TextSync 是一款轻量级、极速的跨平台文本同步工具,目的是彻底替代"用微信给自己发消息来中转文字"的繁琐流程。
以下为已编译好的可执行文件,可直接下载使用:
| 文件 | 平台 | 大小 | 说明 |
|---|---|---|---|
TextSync-app-release.apk |
Android | ~17MB | 适用于 arm64-v8a 设备(覆盖 95% 现代手机) |
TextSyncDesktop.exe |
Windows | ~215KB | 需要安装 .NET 8.0 桌面运行时 |
⚠️ TextSyncDesktop.exe为框架依赖发布,首次使用需安装 .NET 8.0 桌面运行时(约 50MB,仅需安装一次)- 双击即可运行,无需任何配置即可局域网使用
工作方式:
- 📱 在 Android 手机 App 中输入或粘贴文本
- 🚀 点击「推送到电脑」按钮
- 💻 文本即刻到达 Windows 电脑并自动写入系统剪贴板
- 📋 在任意应用中按
Ctrl + V即可粘贴使用
| 特性 | 说明 |
|---|---|
| ⚡ 局域网直连优先 | 同一 WiFi 下通过 TCP 直连,延迟 < 10ms |
| 🌐 公网中转兜底 | 局域网不可用时自动切换 WebSocket 公网通道 |
| 🔒 安全认证 | Token + 时间戳防重放 + SHA-256 checksum 三重防护 |
| 📝 笔记管理 | 支持多条笔记的创建、编辑、搜索、排序 |
| 🎯 选中文字推送 | 可在笔记中选中部分文字精准推送 |
| 📋 推送历史 | 完整记录每次推送的时间、方式、状态 |
| 🌙 深色模式 | 支持跟随系统或手动切换深色/浅色主题 |
| 🔄 自动重试 | 推送失败自动重试 3 次,保证送达率 ≥ 99.5% |
┌──────────────┐ ┌──────────────────┐
│ Android App │ │ Windows Client │
│ (Flutter) │ │ (.NET WPF) │
└──────┬───────┘ └────────┬─────────┘
│ │
│ ┌── 优先:局域网直连 ──┐
│ │ TCP Socket :8899 │
│ └─────────────────────┘
│ │
│ ┌── 备用:公网中转 ────┐
└───►│ Relay Server │◄──────────┘
│ WebSocket :4398 │
└─────────────────────┘
双轨路由策略:
- 手机端点击发送 → 尝试局域网 TCP 直连(2s 超时)
- 连通 → 极速传输(< 10ms)
- 超时 → 自动切换公网 WebSocket 中转(~300ms)
TextSync/
├── android/ # 📱 Android 端 (Flutter)
│ ├── lib/
│ │ ├── main.dart # 应用入口
│ │ ├── app.dart # MaterialApp 配置 + 路由
│ │ ├── models/ # 数据模型
│ │ │ ├── note.dart # 笔记模型
│ │ │ ├── push_record.dart # 推送历史模型
│ │ │ └── sync_message.dart # 通信协议模型
│ │ ├── services/ # 服务层
│ │ │ ├── auth_service.dart # 安全认证
│ │ │ ├── push_service.dart # 推送抽象接口
│ │ │ ├── tcp_push_service.dart # 局域网 TCP 推送
│ │ │ ├── websocket_push_service.dart # 公网 WebSocket 推送
│ │ │ ├── settings_service.dart # 设置持久化
│ │ │ └── database_service.dart # SQLite 数据库
│ │ ├── providers/ # 状态管理 (Provider)
│ │ ├── pages/ # 页面
│ │ │ ├── home_page.dart # 主页壳(侧边栏)
│ │ │ ├── note_list_page.dart # 笔记列表
│ │ │ ├── note_edit_page.dart # 笔记编辑
│ │ │ ├── push_history_page.dart# 推送历史
│ │ │ └── settings_page.dart # 设置页
│ │ ├── widgets/ # 可复用组件
│ │ └── utils/ # 工具函数
│ └── test/ # 单元测试
│
├── desktop/ # 💻 Windows 端 (.NET WPF)
│ ├── App.xaml / App.xaml.cs # 应用入口 + 单实例
│ ├── MainWindow.xaml / .cs # 主窗口
│ ├── SettingsWindow.xaml / .cs # 设置窗口
│ ├── Models/
│ │ ├── SyncMessage.cs # 通信协议模型
│ │ └── AppSettings.cs # 设置模型
│ ├── Services/
│ │ ├── TcpListenerService.cs # TCP 监听 (LAN)
│ │ ├── WebSocketClientService.cs # WebSocket 客户端 (WAN)
│ │ ├── ClipboardService.cs # 剪贴板写入
│ │ ├── SecurityService.cs # 安全校验
│ │ ├── NotificationService.cs # 桌面通知
│ │ └── StartupService.cs # 开机自启
│ ├── ViewModels/ # MVVM ViewModel
│ └── Helpers/ # 常量 + 托盘图标
│
├── server/ # 🌐 中转服务器 (ASP.NET Core)
│ ├── Program.cs # 应用入口 + 路由
│ ├── appsettings.json # 服务器配置
│ ├── Models/
│ │ └── PushRequest.cs # 推送请求模型
│ ├── Services/
│ │ ├── WebSocketManager.cs # WebSocket 连接池
│ │ └── AuthService.cs # 服务端认证
│ └── Middleware/
│ └── RequestValidationMiddleware.cs # 请求验证中间件
│
├── SOP.md # 开发标准作业程序
├── README.md # 本文件
└── LICENSE # MIT 许可证
| 端 | 环境 | 版本 |
|---|---|---|
| Android | Flutter SDK | ≥ 3.1.0 |
| Android | Dart SDK | ≥ 3.1.0 |
| Windows | .NET SDK | ≥ 8.0 |
| Server | .NET Runtime | ≥ 8.0 |
# 进入 Android 项目目录
cd android
# 获取依赖
flutter pub get
# 构建分 ABI 的 release APK(精简+混淆)
flutter build apk --release --split-per-abi --obfuscate --split-debug-info=debug-info
# 产物位于: build/app/outputs/flutter-apk/
# app-arm64-v8a-release.apk ~17MB(推荐,覆盖 95% 设备)
# app-armeabi-v7a-release.apk ~15MB(兼容老旧设备)
# app-x86_64-release.apk ~19MB(模拟器用)
⚠️ 此 EXE 为框架依赖发布,需要安装 .NET 8.0 桌面运行时(约 50MB,仅需安装一次)。
# 进入桌面端项目目录
cd desktop
# 发布单文件 EXE(框架依赖,仅 ~215KB)
dotnet publish -c Release --no-self-contained -p:PublishSingleFile=true \
-p:DebugType=none -o ./publish
# 产物位于: desktop/publish/TextSyncDesktop.exe如果你需要公网中转功能,需要部署一台服务器:
# 1. 进入服务端目录
cd server
# 2. 配置 appsettings.json(设置你的 Token)
# 3. 发布
dotnet publish -c Release -r linux-x64 --self-contained true -o ./publish
# 4. 将 publish 目录上传到你的 Linux 服务器
# 5. 运行
./TextSyncServer提示: 局域网直连模式不需要中转服务器。只有在手机和电脑不同网络时才需要。
- 在手机端安装 APK,在电脑端运行 EXE
- 打开手机端「设置」
- 填写统一的 Token(通信密码) — 手机和电脑必须一致
- (可选)填写中转服务器地址(如使用公网功能)
- (可选)填写电脑局域网 IP(用于局域网直连,路由器建议绑定固定 IP)
所有网络传输使用 JSON 格式:
{
"token": "YOUR_SECRET_TOKEN",
"timestamp": 1717574400000,
"type": "text",
"content": "要同步的文本内容",
"checksum": "sha256-of-content"
}| 字段 | 说明 |
|---|---|
token |
通信密钥,三端必须一致 |
timestamp |
Unix 毫秒时间戳,防重放攻击 |
type |
消息类型(当前仅 text) |
content |
实际同步的文本内容 |
checksum |
SHA-256(content) 十六进制字符串 |
- 框架: Flutter 3.x (Dart)
- 状态管理: Provider
- 本地存储: sqflite (SQLite)
- 主题: Material Design 3
- 框架: .NET 8.0 WPF
- 架构: MVVM
- 剪贴板: System.Windows.Clipboard(带重试机制)
- 托盘: System.Windows.Forms.NotifyIcon
- 框架: ASP.NET Core 8.0 Minimal API
- WebSocket: 原生 System.Net.WebSockets
- 部署: 单二进制文件 + 零外部依赖
本项目基于 MIT License 开源,你可以自由地使用、修改和分发。
TextSync — 让文字在设备间自由流动。