RT,我去年夏天的时候分布式系统课写了个 python 小程序,可以在一个局域网的电脑之间传输字符串和比较小的文件,目标是替代 U 盘和手工抄写字符串。
实现逻辑是用 Zeroconf + 一次性随机码来搜索目标及握手,再用 UDP 传输数据。
刚开始写的时候我想调用一个简单的多线程 http 服务器 + 接收端的 curl 或者 wget 来接收文件,但碍于课程要求(需要直接使用 socket)选择了手工 UDP 这种拉跨的方案。
我想让这个程序尽量的轻,本身不会占用太多内存和 CPU。
现在这套方案有如下问题:
- 传输速度上不去
因为每台电脑的发 UDP 包的速度是固定的,而 UDP 包一个也不大,所以速度也很惨不忍睹。小的字符串还好,大一点的文件真的不如用 U 盘。临时的解决办法是增大 UDP 包大小。 - 过大的 UDP 包会造成兼容性问题
已知 macOS 无法用过大的 UDP 包。 - 数据完整性欠佳
UDP 包是没有顺序的,在理想情况下发送端按什么顺序发出去的包,接收端也会以同样的顺序收到,并写入文件即可。但现实是如果文件大小达到了 50M 左右的时候有几个 UDP 包的顺序会变,导致接收到的文件损坏。临时的解决办法是在每个包之间人为的加入一点间隔,但这种不治本的办法确实不行,文件损坏的问题还是有。
我目前有 2 个方案:
- 魔改当前 UDP 操作,加上多线程,手工给每个 UDP 包标号。接收端整个 buffer 按标号排序后写入文件。
问题是这个 buffer 的大小控制不好容易把内存挤爆,尤其是文件过大的时候,而且自己造轮子非常麻烦而且质量不行。 - 把现有的 UDP 协议换成 http 服务器 + curl 的操作
现在的问题是:
- UDP 多线程传输文件有现成的库么?别的语言也可以
- 轻量又多线程的 HTTP 服务器推荐?
这个东西如果成了,我还想把它做到各个发行版里,写在简历上好看一点