如何知道我们是否收到了带有 DatagramPacket 的东西?

Zel*_*elB 2 java sockets networking udp datagram

我正在实施一个客户端 - 服务器程序,并希望我的客户端在没有来自服务器的 ACK-Answer 等待 5 秒后,发回相同的数据包......

我是这样做的,所以请告诉我是否可以。

dp = new DatagramPacket(packet , packet.length , host , port);
        sock.send(dp);
        time = System.currentTimeMillis();
        while ((System.currentTimeMillis() - time < 5000) && ack_dp.getLength() == 0) {
            sock.receive(ack_dp);
        }

        if (ack_dp.getLength() == 0)
            sock.send(dp);
Run Code Online (Sandbox Code Playgroud)

所以我的程序将等待 5 秒的 ACK,如果他没有收到任何东西,他将重新发送相同的数据包。我用数据包长度检查他是否收到了一个确认..如果它保持为 0,那么他没有收到任何东西..如果它会比 0 长,那么在 while 序列之外并发送一个新的数据包..( ps: ack_dp 是 2bytes)

Nik*_*sov 5

receive()在套接字上默认会阻塞,所以你的循环在这里没有意义(即使套接字设置为非阻塞,在 99.99% 的情况下忙等待也是一个坏主意TM)。

使用setSoTimeout(), 和 catchSocketTimeoutException代替。