如何知道我们是否收到过DatagramPacket的东西?

时间:2012-12-14 19:17:38

标签: java sockets networking udp datagram

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

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

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);

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

1 个答案:

答案 0 :(得分:3)

默认情况下,套接字上的

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

使用setSoTimeout(),然后抓住SocketTimeoutException