1、客户端与服务器连接成功后,都执行相同的业务逻辑,(任务队列中的任务都是相同的)。
首先判断是什么请求。
如果是登录请求,查询mysql,查询在线用户set集合,如果此用户已经在线了,返回客户端已经异地登录关闭连接。防止多机同时登录。
如果是上传下载文件请求,客户端开启线程使用异步的方式进行文件上传,支持多文件同时上传下载。客户端传给服务器自己的user对象,服务器判断set集合有没有这个用户,是否在线,如果不在线,认为此请求是网络攻击。如果此用户已经在线,此请求合法,客户端查询本地文件如果存在此文件名,则进行断点续传,否则进行文件上传。由于fastdfs不支持断点重传,upload函数只能返回是否上传成功,所以客户端不能直接上传文件到fastdfs,这样不能实现断点重传的功能。客户端和服务器进行tcp通信,服务器保存临时文件,传输完毕之后,服务器把临时文件上传到fastdfs,更新数据库的文件信息表,删除临时文件。
2、为什么要保持长连接?
因为服务器要时刻知晓客户端是否是登录状态,只有在登录状态下才可以进行文件传输。防止黑客编程直接访问进行文件上传,攻击服务器。
3、保存偏移量
客户端send函数只是把数据放入到缓冲区,由滑动窗口和拥塞窗口来决定何时发送,如果直接放入send就认为发送成功是不可取的。而且服务器接接收数据之后,要把数据写入临时文件,如果写入失败呢,如何保证数据的落盘。可以自己设计应用层协议,当服务器写入临时文件成功之后,服务器把文件的末尾偏移量发送给客户端做保存。