Java DatagramSocket 无法接收所有数据包

Posted

技术标签:

【中文标题】Java DatagramSocket 无法接收所有数据包【英文标题】:Java DatagramSocket can't receive all packets 【发布时间】:2019-05-18 08:51:14 【问题描述】:

我编写了一个非常简单的 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 上运行时,一切正常。没有丢包。

【问题讨论】:

【参考方案1】:

经过多次尝试,我发现当我更改包平台时问题就消失了。所以我猜这个问题是由打包工具(带有应用程序插件的gradle,Kotlin插件)或特定jdk版本的一些未知错误引起的。

【讨论】:

以上是关于Java DatagramSocket 无法接收所有数据包的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中同时使用 Datagramsocket 发送和接收 - 只是发送?

12.7-全栈Java笔记:Java网络编程

DatagramSocket类 会发生线程阻塞的方法

Java-API DatagramSocket 数据报套接字 类

DatagramSocket receive() 没有接收到任何数据

java中用DatagramSocket收发双方的数据数量不一致,怎么保证不丢数据?