【Web】关于使用WebSocket传输文件的讨论
本帖最后由 云宝黛锡 于 2023-1-11 12:56 编辑前言:希望心情好的前辈看看我的代码,觉得哪里写的不好告诉我让我进步。
### 一、对于传输文件这件事的建模
> 如图一(文件传输示意图)
1. 为了将目标文件从发送方传输到接收方,需要将其切分为许多文件片段。
2. 传输过程应当是一个片段一个片段这样发。中途如果网络出问题,可以知道哪些片段已经成功发送、接下来还需要发送哪些片段。
3. 传输开始前接收方应当在本地创建相同大小的空文件,然后在收到片段后写入内容。
### 二、在上述建模的思路下实现的这个小网盘
1. 服务端介绍
1. 服务端由一百多行python实现,可以查询路径下有哪些文件,在特定路径上传文件,以及下载特定文件。
2. 其中上传文件功能使用WebSocket实现,是本次讨论的关注点。
2. 客户端和服务端上传文件步骤
> 如图二(泳道图)
### 三、对于上述小网盘怎么能做得更好的疑问
##### 疑问一
- 上述传输过程中,发送者在发出上一个片段之后,到被索要下一个片段之前,并未传输任何数据,这应该属于是浪费时间。如何把这个过程改一下,使得发送者可以一个接一个地传输片段,而不必等待接收者索要下一个片段?
##### 疑问二
- 如果有多个传输者,向同一个接收者上传文件,这个系统瓶颈在哪里?
##### (更新)疑问三
- 一个片段多大合适?
### 四、如何运行这个代码
1. 安装python
2. pip install tornado (如果你不希望装奇奇怪怪的软件包污染环境,请使用venv之类的东西)
3. 下载附件“网盘.zip”并解压缩
4. 在解压得到的文件夹中执行 "python server.py"
5. 在浏览器中访问 "http://localhost/app/filestation/"
6. 在网页中进行上传操作
7. 在文件夹“网盘/mount_point1”中检查是否上传成功
### 五、对前述两个疑问的思考
- 首先,应当在接收者这边实现一个队列,让新来的文件排队;
- 其次,写文件和监听WebSocket的程序应当分开,写文件的程序应当是队列的消费者,监听WebSocket消息的程序应当是生产者。
- 这样一来,又产生一个新的疑问:发送者这边由于只管一股脑的发送片段,没有确认上传进度的逻辑。在传输出现问题的时候怎么重传?我认为由于WebSocket能发现自己传输出问题了,所以发送者这边应该做好异常处理就行。
- 但是接收者这边,就有可能存在“同一个文件的后续片段先于之前片段到达”的问题,所以在写文件时需要注意在正确的位置写入。
- 最后就是瓶颈在哪里的问题,我想这就和其它的Web服务瓶颈在哪里是同一个问题了。大概要做压测来找吧。
嗯... 我不是很专业(只写过公司的局域网内互助使用的小软件),但是从我的了解来看
WebSocket 协议并没有限制发送的最大长度,协议本身会替你给数据做分段。
针对第一个疑问,客户端怎么才能不等sv通知就直接发下一段。
我想是干脆接着发下去,直到服务器通知 error,请从哪里开始重发(
嘛..没学过算法和优化,还是不在这丢人了( 陈布衣 发表于 2023-1-12 21:24
嗯... 我不是很专业(只写过公司的局域网内互助使用的小软件),但是从我的了解来看
WebSocket 协议并没有 ...
害,照你这么说发帖的人最丢人。你做了什么小软件? 云宝黛锡 发表于 2023-1-13 11:04
害,照你这么说发帖的人最丢人。你做了什么小软件?
我之前做的是用 .NET Framework 写的打印设计软件,
每个实例都监听同一个端口,HTTP协议,等着另外一边发一个打印任务。
工作需要,摸鱼的时候做的,每个工位的打印机分配的纸张类型和工作内容都不一样。
以前需要用特定的打印机的时候,先用QQ发文件过去,然后需要那个位置上的人或者自己过去操作原始的打印机软件。
现在只需要在自己电脑上发送任务内容到目标机器,打印机直接开始工作(同时自己走过去拿打印成品),不需要干扰那个工位上的人。
类似于普通的网络打印机,但是我们这个工作内容比较特别,需要加点别的东西进去(x轴y轴偏移、浓度自动校正)
原来的打印软件就是类似 BarTender 那种( 其实用websocket做文件传输到最后也是http-like,发现转来转去还是写成了一个请求一个应答
页:
[1]