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
相关产品推荐
相关产品推荐

