在 Java 中以 DatagramPackets 发送文件

Sending files in DatagramPackets in Java

我正在尝试制作一个应用程序,它可以使用 DatagramSockets 和 DatagramPackets 分块发送文件(我必须这样做)。 数据包使用其他信息(片段数、片段索引等)进行编码。我面临的问题:

我有一个 CustomThread 运行ning,它等待数据包到达,然后通过先前在其实例化期间传递给 CustomThread 的 MainNotifier 对象通知控制器其到达。然后 MainNotifier 处理它。控制器是创建和启动线程的对象。现在我在这里的假设是,MainNotifier 中的处理函数仍然在 CustomThread 上 运行,因为它调用了它们,这可能导致一个数据包到达没有被捕获的状态,因为前一个正在处理。这是一个正确的假设还是完全错误的?如果是这样,我将如何解决它?在 controller/MainNotifier 中创建一个单独的线程来处理传入的包是否会减轻 CustomThread 的处理负担?

public void run(){
    while (open){
        byte[] buff = new byte[1472];
        DatagramPacket packet = new DatagramPacket(buff, buff.length);
        try {
            socket.receive(packet);
            mainNotifier.notifyReceivedMessage(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
    socket.close();
}

我贴出这么一小段代码,因为我相信我的假设是正确的,在这种情况下数据包的处理功能不是很重要。

是的,数据填充低级缓冲区的速度可能快于消耗和丢弃的速度。将数据传递到队列以供另一个线程处理可能会解决您眼前的问题。

然而,这不是唯一的方法UDP traffic can be lost

您的协议与 TFTP 的一些相似之处在于文件通过 UDP 以块的形式传输。您可能想查看该协议以获取有关重传的灵感。

我并不是建议您实施 TFTP。跳端口,服务端变成客户端的方式不太好

not all packets containing File fragments are received by the other side

这是UDP的设计特点。您不能期望所有数据包都被接收,因此您需要在您的代码中实施一个策略,要么监控数据包传递,要么允许数据包丢失。

既然你有一个文件(而且缺少它的部分听起来不是一件好事)我相信你将需要监控哪些数据包已经收到。你如何做到这一点取决于你想要的结果;但是,如果您使用 TCP,它会为您处理重新传输。

如果您试图通过转向 UDP 来击败 TCP 的性能,请记住您使用 TCP 性能较低的部分原因是 TCP 跟踪并为您重新传送丢失的数据包。