как узнать, получили мы что-то с DatagramPacket или нет?

Я реализую клиент-серверную программу и хотел, чтобы мой клиент, подождав 5 секунд без ACK-ответа с сервера, отправил обратно тот же пакет...

Я сделал это так, поэтому, пожалуйста, скажите мне, все ли в порядке ..

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

поэтому моя программа будет ждать ACK 5 секунд, если он ничего не получит, он повторно отправит тот же пакет. Я проверяю, получил ли он акк или нет с длиной пакета.. если он остается 0, то он ничего не получил.. если он будет длиннее 0, то из while-последовательности и отправить новый пакет.. ( пс: ack_dp 2 байта)


person ZelelB    schedule 14.12.2012    source источник


Ответы (1)


receive() в сокете будет по умолчанию блокироваться, поэтому ваш цикл здесь не имеет смысла (даже если сокет был установлен в неблокирующий режим, это Плохая идеяTM — ждать-занятость в 99,99% случаев). случаи).

Используйте setSoTimeout() и вместо этого поймайте SocketTimeoutException.

person Nikolai Fetissov    schedule 14.12.2012
comment
это относится и к сокетам UDP? Я не был уверен в этом, блокируются ли приемные сокеты UDP, если они ничего не получают. - person ZelelB; 14.12.2012
comment
Да, блокирует. Пожалуйста, прочтите прекрасное руководство - docs.oracle.com/javase/1.4.2/docs/api/java/net/ - person Nikolai Fetissov; 14.12.2012
comment
а как посмотреть пуст мой пакет или нет? все в порядке с package_name.getLength()? - person ZelelB; 15.12.2012
comment
Вы получаете исключение, если тайм-аут истекает без ввода данных в сокет. И можно отправлять пустые дейтаграммы UDP - они не пустые по проводу, а хотя бы 28 байт - 20 байт на IP-заголовок и 8 байт на UDP-заголовок. - person Nikolai Fetissov; 15.12.2012
comment
Oracle переместил документы, что привело к неработающим ссылкам. Обновление ссылки @NikolaiNFetissov для публичного приема недействительных данных (DatagramPacket p) docs.oracle.com/javase/7/docs/api/java/net/ - person Abhijeet; 01.02.2016