# PeerTalk **Repository Path**: tf5488/peer-talk ## Basic Information - **Project Name**: PeerTalk - **Description**: 局域网 即时消息 与 端到端(直连)文件传输:同一网段内自动发现邻居,文字走 TCP 长连接,文件在同一条连接上顺序传输,不经过公网或中央服务器。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-30 - **Last Updated**: 2026-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PeerTalk 局域网 **即时消息** 与 **端到端(直连)文件传输**:同一网段内自动发现邻居,文字走 TCP 长连接,文件在同一条连接上顺序传输,不经过公网或中央服务器。 ## 功能 - **UDP 广播发现**:周期性宣告本机,超时自动剔除离线节点。 - **配对确认**:发起配对后,对方弹窗选择接受/拒绝;接受后进入聊天。 - **TCP P2P**:配对成功后可发消息/图片/文件;文件在消息头后紧跟原始字节,接收保存到本机目录。 - **TCP 存活校验(尽力而为)**: - 启用 TCP keepalive(`SO_KEEPALIVE`,并在 macOS/Linux 上尽量缩短探测间隔)以更快发现死连接。 - 当 UDP 发现表暂时缺失对端但本机仍持有活跃 TCP 会话时,允许发送路径走「TCP 会话 fallback」而不是直接提示离线。 - **断点续传**:文件传输支持 offset 续传;未完成发送任务会在聊天窗口顶部提示并可一键续传。 - **连接测速**:在已有 TCP 会话上做上行/下行吞吐测试,UI 显示实时速率与进度。 - **桌面界面**:PyQt5,在线搜索、配对弹窗、聊天窗口(文字/图片/文件/进度卡片)。 - **聊天记录交互**: - 文件/图片消息右键菜单支持 **打开文件夹**。 - 图片消息右键菜单支持 **复制**(复制图片到剪贴板)。 - **本地存储**:聊天记录与传输元数据写入 SQLite(用户目录下)。 ## 环境 - Python 3.10+(推荐 3.11) - Windows / macOS / Linux - PyQt5(见 `requirements.txt`) ## 运行 在仓库根目录执行: ```bash python -m peertalk ``` 首次运行请允许本机防火墙放行 **UDP 47820**(发现)与 **TCP 47821**(聊天/传文件)入站(或按需改为放行 `python.exe`)。 接收的文件默认保存到用户目录下 `PeerTalkDownloads/<对端编码>/`,文件名带随机前缀以防重名。 ## 架构说明 | 组件 | 说明 | |------|------| | `peertalk/discovery.py` | LAN 广播发现与在线表 | | `peertalk/node.py` | P2P TCP:握手、配对、`chat`、`file/image` + 二进制流 | | `peertalk/storage.py` | SQLite:会话与消息落盘 | | `peertalk/identity.py` | 本机唯一编码持久化 | | `peertalk/qt_app.py` | PyQt5 入口与后台网络线程 | | `peertalk/ui/*` | PyQt5 界面组件 | | `peertalk/config.py` | 默认端口等常量 | 发现报文与信令为 **单行 JSON**;文件/图片先一行 JSON(`type: file`,含 `name`、`size`、`transfer_id`、`kind`、`mime`),随后 **`size` 字节的原始数据**。 ## 限制(当前版本) - 同一连接上同一时间只做一件事:接收大文件时会独占该连接直到收完。 - 未做加密与身份强校验,仅适用于受信任的局域网。 - TCP keepalive 只能「更快发现连接不可达/已死」;若需严格确认“对端应用仍在工作”,需要额外的应用层心跳(当前未实现)。 ## 许可证 按项目需要自行补充。