You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Socket视频传输文件损坏问题排查求助

问题分析与解决方案

嘿,我一眼就瞅出问题所在了——你的服务端写入逻辑有漏洞,这直接导致了视频文件传输后损坏!

核心问题

看你的服务端代码:

while (fis.read(buffer) != -1) {
    dos.write(buffer);
}

这里的fis.read(buffer)会返回实际读取到的字节数,但你每次都直接把整个1MB的buffer全部写入输出流。举个实际场景:当文件读到最后一段时,可能只剩500KB的数据,这时候buffer里前500KB是新读取的视频数据,后500KB却是上一次读取残留的旧数据。你把整个buffer发出去,就会把这些多余的垃圾数据也传给客户端,视频文件自然就损坏了。

修正后的服务端代码

把写入逻辑改成只发送实际读取到的字节数,同时别忘了最后flush缓冲区:

DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream());
FileInputStream fis = new FileInputStream(videoFile);
byte[] buffer = new byte[1024 * 1024];
int bytesRead; // 存储实际读取的字节数
while ((bytesRead = fis.read(buffer)) != -1) {
    dos.write(buffer, 0, bytesRead); // 只写入有效数据
}
fis.close();
dos.flush(); // 确保缓冲区所有数据都发送完毕
dos.close();

额外注意事项

  • 确认你之前传递的fileSize和视频文件的实际大小完全一致,如果大小不匹配,客户端会提前终止读取或者读取到多余数据,同样会导致文件损坏。
  • 客户端的逻辑是没问题的,它严格按照文件大小控制读取量,并且只写入实际读取到的字节,只要服务端修正后,应该就能正常传输了。

内容的提问来源于stack exchange,提问作者Nik Gun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:59:41