java:如果udp数据包在对socket.receive()的调用之间到达,会发生什么?

yx2lnoni  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(231)

对于我的网络化java应用程序,我在系统级datagramsocket上编写了一个线程安全、无阻塞的i/o Package 器。但是,我有点困惑。如果一个新的包进来了怎么办 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();
                }
            }
        }
    });
7uhlpewt

7uhlpewt1#

如果发生的操作系统级缓冲正确,可以使用api方法datagramsocket.setReceiveBufferSize()和datagramsocket.getReceiveBufferSize()操纵缓冲区的大小。
但是
也有可能丢失一些数据包,因为如果缓冲区溢出或数据包在传输过程中丢失,udp数据包可能会丢失。毕竟udp是一个无连接的协议。如果您确实需要确保您的所有数据包都是安全和完整的,您可以切换到tcp。
回到你的问题上来,如果真是这样 callback.onDataReceived() 执行时间稍长,发送方正在泵送数据包,而udp缓冲区已满,则可能会开始丢失数据包

相关问题