Java: Что произойдет, если UDP-пакет прибудет между вызовами socket.receive ()? - PullRequest
0 голосов
/ 07 декабря 2018

Для моего сетевого Java-приложения я написал потокобезопасную неблокирующую оболочку ввода-вывода поверх системного уровня DatagramSocket.Однако я чего-то не понимаю.Что произойдет, если новый пакет поступит во время выполнения callback.onDataReceived()?Пакет сброшен?Он добавляется в очередь на уровне ОС и «принимается» на следующей итерации цикла?Если да, максимальный размер этой очереди?

    /*
     * Receiving thread
     */
    rxThread = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            byte[] incomingBuffer = new byte[DataConstants.NUM_BYTES_IN_DATAGRAM_PACKET_BUF];

            while (!Thread.currentThread().isInterrupted())
            {
                DatagramPacket incomingPacket = new DatagramPacket(incomingBuffer, incomingBuffer.length);
                try
                {
                    basicSocket.receive(incomingPacket);

                    callback.onDataReceived(
                            DatatypeUtil.getNBytes(incomingPacket.getData(), incomingPacket.getLength()),
                            incomingPacket.getAddress());
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    });

1 Ответ

0 голосов
/ 07 декабря 2018

Вы правы в том, что происходит буферизация на уровне ОС, вы можете управлять размером буферов, используя методы API DatagramSocket.setRecieveBufferSize () и DatagramSocket.getRecieveBufferSize () .

Но

Также возможно потерять некоторые пакеты, так как ваши UDP-пакеты могут быть отброшены, если буфер переполнится или пакеты будут потеряны при передаче.Ведь UDP - это протокол без установления соединения.Если вам нужно убедиться, что все ваши пакеты безопасны и не повреждены, вы можете переключиться на TCP.

Возвращаясь к вашему вопросу, если так получится, что для выполнения callback.onDataReceived() потребуется немного больше времени,отправитель перекачивает пакеты, и ваши буферы UDP заполняются, тогда вы можете начать терять пакеты

...