文件上传和下载功能

1 需求

文件上传功能在IM系统里,一般都会涉及到的。那文件上传也分单聊和群聊两种情况。之前系统实现了单聊发送文件的情况,目前需要实现群聊里发送文件。群聊和单聊发送文件功能,对客户端来说流程可能差不多,单对服务器来说,差别就不是一点点了。

 

2 实现

2.1 现有系统实现

现有系统中,文件上传功能的实现如下:

1 客户端通过与消息服务器的长连接,发送文件请求到消息服务器,请求信息包括发送用户id、接收用户id、文件名称、文件大小、发送模式(离线,在线,现在实现的是离线模式)。

2 消息服务器接收到客户端的请求后,发送消息到文件服务器。

3 文件服务器根据请求,生成任务id。

4 文件服务器应答消息服务器请求,应答信息主要包括任务id、发送用户id等。

5 消息服务器应答客户端请求,应答信息主要包括任务id、文件服务器ip信息等。这里的文件服务器ip信息是消息服务器通过请求文件服务器获得。这个ip信息是在文件服务器的配置文件里配置的。

6 客户端拿到文件服务器ip信息,就连接文件服务器,拿着任务id信息发送登录请求到文件服务器。

7 客户端登录成功后,文件服务器向客户端拉取文件数据,并保存成文件。

8 文件服务器拉取完文件数据后,发送文件状态为完成状态到客户端。

9 客户端收到发送完成状态,发送增加离线文件请求到消息服务器。

10 消息服务器收到请求,发送请求到DB服务器,保存离线文件信息到数据库,信息包括发送用户id,接收用户id,文件名称,文件大小,任务id,文件服务器ip信息等。当接收用户在线时候,发送文件通知消息到接收用户。

 

 

在客户端收到文件通知消息或者拉取到有离线文件列表时候,就需要进行文件下载。现有系统,文件下载功能的实现如下:

1 客户端登录文件服务器,这里不用通过消息服务器获取文件服务器的地址,而是在离线文件信息里包括了。

2 客户端登录成功后,发送拉取文件数据请求。

3 当客户端拉取文件数据完成,文件服务器发送文件状态为完成状态到客户端。

4 客户端发送删除离线文件请求到消息服务器,消息服务器请求DB服务器更改文件状态。

2.2 问题

1 流程相对复杂。

2 任务id是根据文件关联,一次只能发送一个文件请求。

3 根据现有的文件上传和下载逻辑,当有多台文件服务器的时候,通过哪个上传的,还必须通过哪个下载。

4 文件上传完成后,客户端发送消息到消息服务器,再通过DB服务器保存文件信息到数据库。那如果客户端不发送,那么文件其实已经是上传成功了的。

5 发送增加或删除离线文件请求都是单向的,服务器没有给客户端做应答。这个不能保证数据一致性。

6 上传完成和下载完成的状态通知是没有必要的。服务器判断完成的标志是数据传输的大小是否为0,那这个在应答的时候传输为0的请求,那么客户端即知道文件传输完成了。

7 丢包判断,目前没有对丢包判断。即传输数据大小和包里的数据大小是否一致的判断。

 

2.3 改进方案

1 上传文件的时候,文件服务器地址,改为在登录服务器里配置获取。同时在有多台文件服务器时候,进行均衡处理。

2 任务id改为由客户端生成。

3 下载文件的时候,文件服务器地址也用登录时候返回的文件服务器地址。如果考虑负载情况,那在客户端登录文件服务器的时候,返回登录失败。如果客户端登录文件服务器失败,则再请求一次登录服务器,获取新的文件服务器地址。或者由文件服务器获取新的地址,在登录返回的时候一起返回到客户端。

4 上传完成和下载完成状态不单独发送,用请求或应答包里的大小为0作为判断依据。

5 增加和删除离线文件请求,改为服务器内部处理消息。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值