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