通过TCP套接字接收.mp4(C ++ / Java)

时间:2015-02-15 19:50:02

标签: java android c++ file sockets

我正在开展一个项目,该项目需要从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。 多么浪费一天就浪费了,哈哈。

0 个答案:

没有答案