我编写了一个非常简单的 kotlin 程序来从客户端接收图像。关键部分如下。
while (running) {
try {
buf = ByteArray(buffSize)
packet = DatagramPacket(buf, buf.size)
socket.receive(packet)
// put packet data in blockingQueue, use thread to consume the queue
queue.offer(arrayOf(buf.clone(), packet!!.address, packet!!.port, packet!!.length))
} catch (e: Exception) {
e.printStackTrace()
}
}
当该程序运行Surface Pro时,它无法接收客户端发送给它的所有数据包。例如客户端发送 1000 个数据包,它收到 900 个数据包,然后卡在 socket.receive() 处。 Surface Pro上同时运行的Wireshark显示1000个数据包全部收到。
当程序在mac pro上运行时,就可以了。没有丢包。
最佳答案
经过多次尝试,我发现当我更改软件包平台时,问题就消失了。所以我猜测这个问题是由打包工具(带有应用程序插件的gradle,Kotlin插件)引起的,或者是特定jdk版本的一些未知错误引起的。
关于Java DatagramSocket 无法接收所有数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56197400/