头图

本文将介绍一款自制文本和文件传输工具,可实现局域网内文本/文件传输与共享。支持传输文本,可一键复制、粘贴,文本字数无限制,以缩略形式展示。支持传输文件,文件大小无限制。工作在局域网,含操作校验,安全可靠。

编写传输工具的初衷

在平时的学习或者工作过程中,或多或少会碰到如下场景:

  1. 在 A 设备复制的一段文字想发送到 B 设备上;
  2. 在 A 设备接收的一个文件想发送到 B 设备上。

诚然,现有的通讯软件/传输软件足以满足上述需求,但,仅针对上述两个需求而言,有些大材小用且不够方便。

  1. 临时性:无论是文本还是文件,在 B 设备接收后,记录便无需保留。因此,希望记录能够过期自动删除。
  2. 可折叠:主要针对文本,当 A 设备发送一大段文字时,B 设备只需能否获取到全部内容就行,而不需要预览或者说不关心全部内容,记录展示的信息能够区分不同记录足矣。屏幕空间有限,应在有限的屏幕内展示尽可能多的记录,直接展示全部内容反而影响查找其他记录。因此,记录应该是缩略的或者可折叠的。
  3. 免登录:为了发送一段字数不多的文字或者一个体积不大的一段文件而登录某软件通常是不值得的,麻烦且浪费时间。
  4. 体积限制:主要针对文件,通常,通讯软件对于待发送文件的大小是有限制的。
  5. 便捷简单:仅为上述两个场景而下载特定软件或者登录特定软件是不值得的。

基于上述场景和需求,就自己编写了一个文本/文件传输工具。

  • 支持传输文本,可一键复制、粘贴,文本字数无限制,以缩略形式展示;
  • 支持传输文件,文件大小无限制;
  • 工作在局域网,含操作校验,安全可靠;
  • 可自定义配置,如记录过期时间、文件大小限制;
  • 传输工具运行在 Windows/MacOS,处于同一局域网的设备(电脑、手机、平板等)可通过浏览器访问。
  • 快速启动与关闭,简单易用。

传输工具的使用

准备工作

如对正式版描述中的个别名词有些许疑惑,可跳转至简易版。以下正式和简易仅形容使用方式,而不是传输工具本身。

正式版:保证需要访问服务的设备与启动服务的设备处于同一局域网。注意,不要求所有设备处于同一局域网,这意味着可以跨局域网传输文件。

简易版:将需要访问服务的设备(包括启动 clipboard.exe 的设备)连接到同一个 WIFI,或者,其中一个设备开热点,其他设备都连接到这个热点。

启动与停止

对于 Windows 用户,可按文末所给方式获取到传输工具 clipboard.exe。分为 https 版和 http 版,http 版无一键粘贴功能。

对于 MacOS 用户,由于本人并无 MacOS 电脑,不方便调试,故未提供 MacOS 版,若您愿意配合调试,可在评论区留言。

在电脑上新建一个目录,不妨命名为 clipboard,将 clipboard.exe 移动到 clipboard 目录。

双击 clipboard.exe,服务便会启动并会自动打开 CMD 窗口,并列出访问地址,如下图所示。程序启动后,会在 clipboard.exe 同一目录下自动生成一个 data 目录,其中的文件和目录在程序运行时请勿修改,以防程序崩溃,尽管程序带有一定自恢复功能。

图1 CMD 窗口

如果想关闭服务,点击 CMD 窗口右上角的 × 或者按 Ctrl + C 即可。

访问与使用

对于本机(指启动 clipboard.exe 的设备),访问列出的任意一个地址即可。按住 Ctrl 键,鼠标左键单击地址可快速访问。

对于其他设备:

  • 正式版:应访问与当前设备处于同一局域网的网卡对应的地址。地址前面的实际是相应的网卡名称。
  • 简易版:访问 WLAN 对应的地址。

若使用 https 版,访问地址,应该会出现警告,这是因为自行签发的 TLS 证书不被浏览器信任,属正常现象,具体细节见后文 ⌈传输工具的实现⌋ 的 ⌈HTTPS⌋ 部分。

电脑端警告如下图所示。

图2 电脑端首次访问时的警告

移动端警告如下图所示。

图3 移动端首次访问时的警告

电脑端可点击 ⌈高级⌋,继续访问。移动端可点击 ⌈继续浏览⌋。

https 版启动后,CMD 会出现如下报错,属正常现象,不影响使用。

http: TLS handshake error from xxx: remote error: tls: unknown certificate

若觉得警告和报错不妥,可采用 http 版,http 版无此警告和报错,但 http 版无一键粘贴功能,根据自身需求选择。

在访问服务前,需要先输入校验码继续进行校验,以防处于局域网的其他人未经允许便使用服务,校验码默认为 zijie1024。

图4 校验码

校验通过会自动跳转到如下图所示页面,下图所示页面包含本工具的所有内容。页面右下角有“回到顶部”的按钮,当页面列表项较多时,可点击该按钮快速回到顶部。

图5 传输工具主体功能

由于本传输工具并无复杂的操作逻辑,故对于具体的使用不作介绍,见名知义。

自定义配置

以下列出了本传输工具的部分配置,目前暂不能自定义,均采用默认配置。

相关目录和文件:

  • data:存放程序运行所产生的所有数据。
  • data/record:存放记录的文件。
  • data/file:存放已上传的所有文件。
  • data/work:存放临时文件,包括但不限于文件分片。

校验码:默认为 zijie1024。

记录过期时间:默认为 24 小时。

服务启动的端口:默认为 8080。

文件大小限制:默认无限制。

文本消息字数:默认无限制。

文件分片大小:默认为 10MB。

传输工具的实现

如果对本传输工具是如何实现的感兴趣或者想编写一个类似功能的工具,可参考本部分内容。忽略本部分内容不影响使用。由于是预览版,本文仅对实现作简要阐述,如需详细的实现过程,可在评论区留言,待正式版完成后,视需求情况更新。

项目架构

本传输工具是一个基于 B/S 架构的 Web 项目,前端使用传统的 HTML、CSS、JS 实现,后端可采用 Java、Go、JS(NodeJS)等语言搭建服务处理请求。

文件传输

采用分片上传,支持断点续传、秒传。

前端:计算文件 hash、分片上传文件。文件 hash 的计算较为耗时,可采用多线程完成(Web Workers)。出于减轻服务器压力、避免浏览器卡顿等考虑,可手动限制并发请求数量。对于 HTTP/1.1,浏览器对并发请求的数量限制通常为6 个,HTTP/2 和 HTTP/3 支持多路复用,消除了传统意义上的并发请求数量限制,但,手动限制并发请求数量仍是有益的。

后端:暂存上传的分片、合并分片。将上传的分片暂存到临时目录,待全部分片上传完毕后,按照约定顺序将分片合并。

断点续传、秒传:计算完文件 hash 后,先发送请求询问服务器哪些分片已上传,然后仅上传未上传的分片(断点续传)。当文件已上传时,无未上传的分片,可做到秒传。

同步显示

当一个设备发送文本/文件完毕后,希望其他设备能够及时显示记录,有两种可选方案:

  • 客户端拉取:客户端定时向服务端发送请求拉取数据(短轮询)。
  • 服务端推送:服务端收到新的数据后,主动将数据推送给客户端。

对于客户端拉取,实现简单,服务端每当收到数据请求,便将最新的数据响应给客户端,但是,无论数据是否有更改都会发送请求,每次请求都会返回全部数据,可能会造成不必要的浪费。

对于服务端推送,实现更为复杂,但是,服务端可以实时且细粒度地将数据的修改推送给客户端。服务端推送可采用 WebSocket 实现,WebSocket 是一种全双工通信协议,通过建立持久连接,双方可实时进行数据传输。

本传输工具采用 WebSocket 来实现各设备同步显示。由于某些原因,WS 连接可能会意外断开,为保证连接的稳定性与可靠性,引入心跳检测机制,使用 WebScoket 定时向服务端发送心跳数据包,若发送失败或者服务端无响应,则进行重连操作,为避免无限重连,可设置重连次数限制。

HTTPS

本传输工具提供粘贴功能,粘贴功能可通过如下方式实现:

// 方式一(已弃用)
document.execCommand('paste')
// 方式二
navigator.clipboard.readText()

粘贴功能需要读取剪切板,涉及用户隐私,目前仅在安全上下文(HTTPS)中可用。所以,为了实现粘贴功能,需要采用 HTTPS。开启 HTTPS 需要两个文件:key 和 crt,key 是密钥,crt 是 TLS 证书。

TLS 证书可分为两类。一类是向权威机构申请的 TLS 证书,这类证书会被浏览器信任。一类是自签名的 TLS 证书,这类证书不被浏览器信任,会弹出警告,如前文所示。权威机构的 TLS 证书通常是收费的,且通常不支持通过 IP地址申请。对于一个简单的本地服务而言,使用自签名的 TLS 证书足矣,尽管浏览器会提示不安全。自签名证书可用 OpenSSL 生成。

对于本传输工具而言,如果不实现粘贴功能的话,完全可以使用 HTTP。

身份校验

由于处于同一局域网的设备均可以访问本传输工具启动的服务,所以,有必要加一层身份校验。本传输工具采用 JWT 进行身份校验。客户端输入校验码,后端对校验码进行校验,校验通过则返回 Token,此后客户端的每次请求都必须携带该 Token,后端会对 Token 进行校验。

传输工具的展望

所谓展望,就是,因为这样或那样的原因,暂不准备实现的功能。如果您对其中某些功能有需求或者有其他功能有需求,可在评论区留言,会根据各位的需求按期望程度逐个实现。

自定义配置

将程序的某些设置抽取出来,可在配置文件中进行配置,比如文件过期时间、文件上传大小限制等。

设备直传

显示所有已连接的设备,可直接选择任意一台设备并向其传输文件,省去文件上传完成后手动点击下载的操作。

房间隔离

可创建房间并设置房间密码,加入房间需验证密码。在房间内发送的文本/文件仅加入房间的设备可见。

END

以上就是本文的全部内容,由于是预览版,功能尚不完善,如在使用过程中遇到任何问题,欢迎留言,如您有相应解决方案,欢迎一并提出。

如果觉得本文对您有一点点帮助,欢迎点赞、转发加关注,这会对我有非常大的帮助,如果有任何问题,欢迎在评论区留言,咱们下期见!

文章文档:公众号 字节幺零二四 回复关键字即可获取本文最新内容(含附件),关键字放在公众号的本文中。

视频地址:https://www.bilibili.com/video/BV1pGtUeTEfn


字节幺零二四
9 声望5 粉丝

talk is cheap, show me you code!