Open tdwu opened 5 years ago
版本:github中最新的FastDFS_Client的代码
异常: 2019-06-27 18:02:05.866 ERROR 13096 --- [io-16120-exec-3] c.g.t.f.d.proto.AbstractFdfsCommand : receive conent errorjava.io.IOException: 你的主机中的软件中止了一个已建立的连接。 2019-06-27 18:02:05.867 INFO 13096 --- [io-16120-exec-3] c.g.t.f.domain.conn.ConnectionManager : 删除连接:com.github.tobato.fastdfs.domain.conn.DefaultConnection@2d62534a 2019-06-27 18:02:05.869 ERROR 13096 --- [io-16120-exec-3] c.p.p.file.router.show.FileViewResolver : 客户端连接服务端出现了io异常:socket io exception occured while receive content
com.github.tobato.fastdfs.exception.FdfsIOException: 客户端连接服务端出现了io异常:socket io exception occured while receive content at com.github.tobato.fastdfs.domain.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:53) ~[classes/:na] at com.github.tobato.fastdfs.domain.conn.ConnectionManager.execute(ConnectionManager.java:97) ~[classes/:na] at com.github.tobato.fastdfs.domain.conn.ConnectionManager.executeFdfsCmd(ConnectionManager.java:81) ~[classes/:na] at com.github.tobato.fastdfs.service.DefaultGenerateStorageClient.downloadFile(DefaultGenerateStorageClient.java:133) ~[classes/:na] at com.pm.project.file.router.show.view.FastDFSFileView.render(FastDFSFileView.java:44) ~[classes/:na] at com.pm.project.file.router.show.FileViewResolver.show(FileViewResolver.java:71) ~[classes/:na]
每次都出现吗
对,只要调用这个,进行断点下载就会出现
/**
我理解得对不对:在线视频业务,每个视频文件切分为100K大小?
试试先把文件下载以后再写入到response,比如
DownloadByteArray callback = new DownloadByteArray();
// 下载部分文件
byte[] content = storageClient.downloadFile(path.getGroup(),
path.getPath(), 2, 8, callback);
然后再把content写入到 response
存为一个完整文件的。没有分段存储。
快进播放时,会通过http向服务器重新发起请求,里面有range头,说从多少个字节开始读取(跳过流的前面部分)。 所以我调用了 storageClient.downloadFile(path.getGroup(),path.getPath(), 2, 8, callback);方法。 我这个场景是不是调用这个方法?
如果先下载再返回,会有额外的io开销,所以想直接流copy。
另外,你有没有client的协议文档。我有时间想实现基于nio模式的client。 基于大量io的开销场景,WebFlux+NIO的模式很有帮助。
如果没有,后面可能会基于nginx的fastd module,再包装一层给java使用。
想请教下您有没有 断点续传的代码 可以给参考一下吗
存为一个完整文件的。没有分段存储。
快进播放时,会通过http向服务器重新发起请求,里面有range头,说从多少个字节开始读取(跳过流的前面部分)。 所以我调用了 storageClient.downloadFile(path.getGroup(),path.getPath(), 2, 8, callback);方法。 我这个场景是不是调用这个方法?
如果先下载再返回,会有额外的io开销,所以想直接流copy。
另外,你有没有client的协议文档。我有时间想实现基于nio模式的client。 基于大量io的开销场景,WebFlux+NIO的模式很有帮助。
如果没有,后面可能会基于nginx的fastd module,再包装一层给java使用。
我用这种方式也会报这个错
public Flux<DataBuffer> getDownloadDataByClient(DownloadRangeInfo downloadRangeInfo) {
return storageClient.downloadFile(downloadRangeInfo.getGroup(), downloadRangeInfo.getPath(), downloadRangeInfo.getStart(), downloadRangeInfo.getLength(),
inputStream -> DataBufferUtils.readInputStream(() -> inputStream, new DefaultDataBufferFactory(), 1024));
}
2019-10-29 15:15:58.680 ERROR [dfs-jpa-test,e4aa5360ca482932,e4aa5360ca482932,true] 7284 --- [ctor-http-nio-4] c.g.t.f.d.proto.AbstractFdfsCommand : receive conent error
java.io.IOException: recv cmd: 92 is not correct, expect cmd: 100
at com.github.tobato.fastdfs.domain.proto.ProtoHead.validateResponseHead(ProtoHead.java:123) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.domain.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:106) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.domain.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:50) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.domain.conn.ConnectionManager.execute(ConnectionManager.java:81) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.domain.conn.ConnectionManager.executeFdfsCmd(ConnectionManager.java:65) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.service.DefaultGenerateStorageClient.downloadFile(DefaultGenerateStorageClient.java:133) ~[fastdfs-client-1.26.7.jar:1.26.7]
2019-10-29 15:15:58.694 ERROR [dfs-jpa-test,e4aa5360ca482932,e4aa5360ca482932,true] 7284 --- [ctor-http-nio-4] c.g.t.f.domain.conn.ConnectionManager : execute fdfs command error
com.github.tobato.fastdfs.exception.FdfsIOException: 客户端连接服务端出现了io异常:socket io exception occured while receive content
at com.github.tobato.fastdfs.domain.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:53) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.domain.conn.ConnectionManager.execute(ConnectionManager.java:81) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.domain.conn.ConnectionManager.executeFdfsCmd(ConnectionManager.java:65) ~[fastdfs-client-1.26.7.jar:1.26.7]
at com.github.tobato.fastdfs.service.DefaultGenerateStorageClient.downloadFile(DefaultGenerateStorageClient.java:133) ~[fastdfs-client-1.26.7.jar:1.26.7]
您好,请问一下,这个问题现在解决了吗,解决方式是什么,storageClient.downloadFile(path.getGroup(), path.getPath(), 2, 8, callback)这个分段下载的2和8又是怎么获取的
下载和浏览我走的nginx方式,主要2个原因: 1 图片缩放,如果自己来实现效果可能没nginx好 2 nginx是响应式 nio的方式,如果你的程序不是响应式的,下载大文件的时候可能会出问题。
所以直接没找解决方式,换方式了。
您好,请问一下,这个问题现在解决了吗,解决方式是什么,storageClient.downloadFile(path.getGroup(), path.getPath(), 2, 8, callback)这个分段下载的2和8又是怎么获取的
2是数据读取起始位置,8是下载数据长度,这个可以根据请求头中的ranger计算出来 nio的方式我做出来了,但是存在一个问题,下载文件的时候会从common-pool中拿到同一个连接,导致前一个下载直接报错中断 @tobato
业务:存放小视屏,用户拖动快进,文件大小100000byte。
计算好fileOffset=2000和fileSize=100000-2000,调用下载接口 日志:客户端连接服务端出现了io异常:socket io exception occured while receive content (不拖动,正常下载浏览播放,则无问题)。 代码: storageClient.downloadFile(groupName, path, position, sysFile.getSize() - position, inputStream -> { log.info("开始下载:" + position); fileRender.render(request, response, inputStream); log.info("完成下载"); return inputStream; });