赞
踩
首先web端与服务端进行websocket连接,服务端给设备下发指令,设备给服务器上送文件,然后服务端通过websocket给web端上送,但是发现终端上送的小文件通过websocket给web端上送,但是大文件会导致websocket断开,无法上送。
对大文件而言 默认websocket上送的文件大小是8kb netty默认是64kb 网上相关的资料也少得很,说是修改什么配置,本人测试完全没什么毛用。
本人处理方案是通过code状态 根据状态
服务端websocket上送消息中添加code字段,标识此条消息处理完毕还是需要有其他操作。
比如,code=200表示处理完成,code=201表示需要进行后续处理。
后台对上送的文件进行大小进行判断,如果文件大于64000 表示文件大于8kb
返回code=202 tmpRedisFileUuid=… 将文件内容存在redis中,并设置过期时间,防止垃圾数据长时间存储占用内存问题。
前端根据code=202使用http接口获取redis中的内容。就可以解决此问题。
对大文件分片处理,如果文件内容过大,将文件拆分为很多小片上送,上送完成之后,给前端一个,前端判断如果状态为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)); }
如果此方案对你有用,欢迎点赞收藏,后续有更多问题,私信探讨
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。