UDP上的视频文件包 - 增量读取和流

时间:2013-04-11 04:32:03

标签: java sockets networking udp datagram

我想使用Java中的UDP DatagramPacket将从磁盘读取的视频文件传输到接收器。

关键点如下:虽然要从磁盘读取要传输的文件,但我应该假设我不知道文件大小。需要逐步读取总文件,并且文件的数据报包应具有不同的大小。

简而言之,我应该假设我正在将一个实时视频流式传输到接收器,而不知道我将需要发送多少数据以及生成数据的速率。

现在,我有一个代码可以立即读取磁盘上的文件并转换为数据报包以使用UDP套接字进行传输。但是我不知道如何在不知道原始文件大小的情况下打包文件并逐步读取会模拟视频的实时流式传输。

使用Java实现这个想法的任何输入都非常有用。一旦我掌握了这个基本的东西,我就需要实现一个实时的文件传输协议。

发信人:

        File file = new File("/crazy.mp4");
        FileInputStream fis = new FileInputStream(file);
        DatagramPacket pack;


        int size = 0;
        byte[] buffer = new byte[((int) file.length())];
        ByteBuffer bb = ByteBuffer.allocate(4);
        bb.order(ByteOrder.BIG_ENDIAN);

        while (true) {
            size = fis.read(buffer);                
            pack = new DatagramPacket(buffer, buffer.length, address,
                    packet.getPort());
            socket.send(pack);
        }

接收器:

     File file = new File("/crazyRecv.mp4");
     FileOutputStream fos = new FileOutputStream(file);  
     DatagramPacket rpacket = new DatagramPacket(buffer, buffer.length);

        while (true) {
            socket.receive(rpacket);
            fos.write(rpacket.getData(), 0, rpacket.getLength());
        }

感谢。

1 个答案:

答案 0 :(得分:2)

此发送和接收UDP数据包的代码无法保证在客户端成功重新创建文件。

  1. UDP不可靠 - 没有TCP中的低级别确认和数据包重传机制,因此您必须实现此目的。数据包可能丢失,从未在客户端收到
  2. UDP不是顺序的 - 您不能只期望UDP数据包在客户端顺序接收。第一个数据包可能先到达最后一个数据包,最后一个数据包,然后破坏文件。 TCP保证顺序传递。
  3. 如果您仍想使用,则必须编写自己的应用程序级协议。例如

    1. 您发送的内容为“文件开始”的数据包
    2. 客户端为“File Start:Received”
    3. 发送一个ack数据包
    4. 如果您没有收到“File Start:Received”,那么您必须转到第1步
    5. 然后发送具有唯一ID“数据包1”+数据包数据
    6. 的数据包
    7. 客户端发送“Packet 1:Received”
    8. 的ack数据包
    9. 如果您没有收到“Packet 1:Received”,那么您必须转到第4步
    10. 对所有数据包执行步骤4 - 6
    11. 您发送的内容为“文件结束”的数据包
    12. 客户端发送“文件结束:已接收”
    13. 的确认包
    14. 如果您没有收到“文件结束:已收到”,则必须转到步骤8