我正在开展一个项目,该项目需要从Java(Android)服务器向C ++(Visual Studio)客户端传输MP4视频。
如果我使用Java客户端,一切正常,但是对于C ++客户端,我收到的文件比文件发送的大1个字节。结果,该文件显然不会打开。我不知道问题是在这个额外的位上还是有其他错误。
这是我的C ++客户端的相关代码:
FILE *myFile=std::fopen("scan.mp4","wb");
char *recVideoBuffer=new char[videoSize];//videoSize previously received
int written;
totalBytesRcvd = 0;
while (totalBytesRcvd < videoSize)
{
if ((bytesRcvd = recv(sock, recVideoBuffer, videoSize, 0)) <= 0)
DieWithError("recv() failed or connection closed prematurely");
totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */
if ((written = fwrite(recVideoBuffer, 1, bytesRcvd, myFile)) != bytesRcvd)
DieWithError("fwrite() failed");
printf("Filesize: %d\nReceived: %d\Written %d\nTotal Received: %d\n\n", videoSize, bytesRcvd, written, totalBytesRcvd);
}
fclose(myFile);
closesocket(sock);
Java Server:
File source = new File (VIDEO_FILE);
byte byteArray[] = new byte [(int)source.length()];
BufferedInputStream bStream = new BufferedInputStream(new FileInputStream(source));
bStream.read(byteArray, 0, byteArray.length);
OutputStream outStream = s.getOutputStream();
outStream.write(byteArray, 0, byteArray.length);
outStream.flush();
outStream.close();
bStream.close();
s.close();
server.close();
关于问题可能是什么以及如何解决问题的任何想法? 我环顾四周,发现了一些相关的问题,但这些问题要么没有答案要么没有答案......
感谢。
修改:
我试过发送一个&#39; abcde&#39; .asc文件,客户端只收到abcd&#39;。在这种情况下,两个文件都是5字节大。
===
我查看了MP4文件的字节值。
收到的一个字节在开头有2个额外字节0a
,并且缺少最后一个2B。手动更改这些值可使视频正常播放。
0a
来自哪里?显然,由于那些2B,最后2个没有写......
解决
真的很愚蠢......我会使用println()
发送视频大小,recv()
无法完全阅读,显然离开那些{{}套接字上的1}}字节,准备好由下一个0a
接收文件字节。
这就解释了为什么一切都与Java客户端一起工作,因为我会使用recv()
阅读videoSize。
多么浪费一天就浪费了,哈哈。