无名商城论坛

搜索
查看: 429|回复: 0

[其他技术] 【HC】Java NIO 框架 Netty 之美:搭建文件上传

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 18:41:31 | 显示全部楼层 |阅读模式
我们知道通过网络传输数据时候只是传递二进制流,比如客户端通过网络 socket 给服务器端发送数据时候,客户端把要发送的数据对象序列化为二进制后,通过 socket 连接直接发送给了服务器,服务器则要负责解决半包和粘包问题(参考:Java NIO 框架 Netty 之美:粘包与半包问题),同理客户端上传一个文件时候,也是把磁盘文件转换为了二进制流通过 socket 连接发送给文件服务器,那么服务器端则也要解决半包和粘包问题,也就是服务器要能知道一个文件的边界(读取到那个字节时候才是一个完整的文件),常用的解决半包粘包的问题有三种:包定长、分隔符、自定义帧(header+body),本文简单的使用 header+body 的变体
首先是 4 个字节用来记录文件的长度,然后使用 128 字节用来存放文件名称,然后接下来的 fileLength 个字节是文件的具体内容。另外本文搭建的简单文件上传服务器支持同一个链接传递多个文件
到这里位置我们设计了一个简单的包协议,客户端上传在链接建立完毕后只需要先向 socket 写入一个 4 字节的 int 类型的数据来代表要上传文件的大小,然后传递 128 字节的字符串来代表文件的名字,最后从磁盘读取文件流并依次写入到 socket 就可以了。如果要上传多个文件则重复上述过程。

下面我们来看看文件服务器这边需要做什么设计:首先服务器端需要写一个文件解码器,这个解码器的工作是根据上面指定的协议,解析出一个文件,然后传递解析的文件到业务 handler,业务 handler 则对文件进行落盘处理或者保存文件到其他存储。这里有一个点需要注意是服务器等整个文件在内存里面接受完毕后在一次性写入磁盘,还是接受一部分就写入磁盘,后面接受的数据在追加到磁盘文件中。本文我们简单的使用前者进行处理。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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