技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 285|回复: 3
收起左侧

【Web】关于使用WebSocket传输文件的讨论

[复制链接]

1

主题

3

回帖

5079

积分

用户组: 技术宅的结界VIP成员

UID
7776
精华
1
威望
3 点
宅币
5064 个
贡献
0 次
宅之契约
0 份
在线时间
10 小时
注册时间
2022-4-7
发表于 2023-1-10 11:33:19 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

x
本帖最后由 云宝黛锡 于 2023-1-11 12:56 编辑

前言:希望心情好的前辈看看我的代码,觉得哪里写的不好告诉我让我进步。

一、对于传输文件这件事的建模

如图一(文件传输示意图)

文件传输示意图.png

  1. 为了将目标文件从发送方传输到接收方,需要将其切分为许多文件片段。
  2. 传输过程应当是一个片段一个片段这样发。中途如果网络出问题,可以知道哪些片段已经成功发送、接下来还需要发送哪些片段。
  3. 传输开始前接收方应当在本地创建相同大小的空文件,然后在收到片段后写入内容。

二、在上述建模的思路下实现的这个小网盘

  1. 服务端介绍

    1. 服务端由一百多行python实现,可以查询路径下有哪些文件,在特定路径上传文件,以及下载特定文件。
    2. 其中上传文件功能使用WebSocket实现,是本次讨论的关注点。
  2. 客户端和服务端上传文件步骤

如图二(泳道图)

泳道图.png

三、对于上述小网盘怎么能做得更好的疑问

疑问一
  • 上述传输过程中,发送者在发出上一个片段之后,到被索要下一个片段之前,并未传输任何数据,这应该属于是浪费时间。如何把这个过程改一下,使得发送者可以一个接一个地传输片段,而不必等待接收者索要下一个片段?
疑问二
  • 如果有多个传输者,向同一个接收者上传文件,这个系统瓶颈在哪里?
(更新)疑问三
  • 一个片段多大合适?

四、如何运行这个代码

  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服务瓶颈在哪里是同一个问题了。大概要做压测来找吧。

网盘.zip

83.1 KB, 下载次数: 3

回复

使用道具 举报

12

主题

26

回帖

608

积分

用户组: 大·技术宅

UID
5148
精华
3
威望
7 点
宅币
511 个
贡献
30 次
宅之契约
0 份
在线时间
49 小时
注册时间
2019-7-17
发表于 2023-1-12 21:24:06 | 显示全部楼层
嗯... 我不是很专业(只写过公司的局域网内互助使用的小软件),但是从我的了解来看
WebSocket 协议并没有限制发送的最大长度,协议本身会替你给数据做分段。

针对第一个疑问,客户端怎么才能不等sv通知就直接发下一段。
我想是干脆接着发下去,直到服务器通知 error,请从哪里开始重发(
嘛..没学过算法和优化,还是不在这丢人了(

1

主题

3

回帖

5079

积分

用户组: 技术宅的结界VIP成员

UID
7776
精华
1
威望
3 点
宅币
5064 个
贡献
0 次
宅之契约
0 份
在线时间
10 小时
注册时间
2022-4-7
 楼主| 发表于 2023-1-13 11:04:12 | 显示全部楼层
陈布衣 发表于 2023-1-12 21:24
嗯... 我不是很专业(只写过公司的局域网内互助使用的小软件),但是从我的了解来看
WebSocket 协议并没有 ...

害,照你这么说发帖的人最丢人。你做了什么小软件?

12

主题

26

回帖

608

积分

用户组: 大·技术宅

UID
5148
精华
3
威望
7 点
宅币
511 个
贡献
30 次
宅之契约
0 份
在线时间
49 小时
注册时间
2019-7-17
发表于 2023-1-13 20:10:39 | 显示全部楼层
云宝黛锡 发表于 2023-1-13 11:04
害,照你这么说发帖的人最丢人。你做了什么小软件?

我之前做的是用 .NET Framework 写的打印设计软件,
每个实例都监听同一个端口,HTTP协议,等着另外一边发一个打印任务。
工作需要,摸鱼的时候做的,每个工位的打印机分配的纸张类型和工作内容都不一样。
以前需要用特定的打印机的时候,先用QQ发文件过去,然后需要那个位置上的人或者自己过去操作原始的打印机软件。
现在只需要在自己电脑上发送任务内容到目标机器,打印机直接开始工作(同时自己走过去拿打印成品),不需要干扰那个工位上的人。
类似于普通的网络打印机,但是我们这个工作内容比较特别,需要加点别的东西进去(x轴y轴偏移、浓度自动校正)

原来的打印软件就是类似 BarTender 那种(

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2023-2-5 21:41 , Processed in 0.034799 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表