websocket上传大文件导致连接端开,上送失败解决方案

出现原因,

首先web端与服务端进行websocket连接,服务端给设备下发指令,设备给服务器上送文件,然后服务端通过websocket给web端上送,但是发现终端上送的小文件通过websocket给web端上送,但是大文件会导致websocket断开,无法上送。

解决方案

解决方案1

对大文件而言 默认websocket上送的文件大小是8kb netty默认是64kb 网上相关的资料也少得很,说是修改什么配置,本人测试完全没什么毛用。

本人处理方案是通过code状态 根据状态

服务端websocket上送消息中添加code字段,标识此条消息处理完毕还是需要有其他操作。
比如,code=200表示处理完成,code=201表示需要进行后续处理。

后台对上送的文件进行大小进行判断,如果文件大于64000 表示文件大于8kb
返回code=202 tmpRedisFileUuid=… 将文件内容存在redis中,并设置过期时间,防止垃圾数据长时间存储占用内存问题。
前端根据code=202使用http接口获取redis中的内容。就可以解决此问题。

解决方案2

对大文件分片处理,如果文件内容过大,将文件拆分为很多小片上送,上送完成之后,给前端一个,前端判断如果状态为202就使用一个变量接收每次上送的内容,并将内容拼接,直到上送的code是一个正确的,将完整内容复制给指定变量。
简单核心demo

 InputStream inputStream = file.getInputStream();
                    long fileSize = file.getSize();
                    long tempSize = 0;
                    if (fileSize > 2048) {
                        byte[] bytes = new byte[2048];
                        int read = inputStream.read(bytes);
                        tempSize = fileSize - 2048;
                        while (read != -1) {
                            String UTF_8 = new String(bytes, StandardCharsets.UTF_8);
                            log.info("------{}", UTF_8);
                            msg.setText(new String(bytes, StandardCharsets.UTF_8));
                            session.getBasicRemote().sendText(JSON.toJSONString(msg, true));
                            if (tempSize < 2048) {
                                tempSize = tempSize - 2048;
                                bytes = new byte[(int) tempSize];
                            }
                            read = inputStream.read(bytes);
                            tempSize = tempSize - 2048;
                        }
                    } else {
                        session.getBasicRemote().sendText(JSON.toJSONString(msg, true));
                    }

如果此方案对你有用,欢迎点赞收藏,后续有更多问题,私信探讨

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值