使用一个DatagramSocket将数据包单播到多个dst ip比使用多个DatagramSocket慢?

时间:2019-04-05 10:53:13

标签: java android udp

我的目的是在Android应用中通过以太网将Udp数据包发送到一堆设备,比如说有50个设备,我应该向每个设备发送4个数据包。

起初,我使用一个DatagramSocket实例在循环中发送数据包,作为结果,它阻塞了很长的时间(超过1000毫秒),以至于我对Kotlin进行了测试

class UdpSendActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_udp_send)

        Thread(::runTest1).start()
        Thread(::runTest2).start()
    }


    fun runTest1():Unit {
        val dstAddressList = List(50 ){
            Inet4Address.getByName("192.168.1.${10 + it}")
        }

        val srcSocket = DatagramSocket()
        val byteArray = ByteArray(500)

        val startMs = System.currentTimeMillis()
        for (dstAddress in dstAddressList) {
            val packet = DatagramPacket(byteArray, 0, byteArray.size, dstAddress, 55555)

            srcSocket.send(packet)
            srcSocket.send(packet)
            srcSocket.send(packet)
            srcSocket.send(packet)

        }
        val costMs = System.currentTimeMillis() - startMs
        Log.e("UdpSendActivity", "#A $costMs ms")
    }

    fun runTest2():Unit {
        val dstAddressList = List(50 ){
            Inet4Address.getByName("192.168.1.${10 + it}")
        }

//        val srcSocket = DatagramSocket()
        val byteArray = ByteArray(500)
        val startMs = System.currentTimeMillis()

        for (dstAddress in dstAddressList) {
            val packet = DatagramPacket(byteArray, 0, byteArray.size, dstAddress, 55555)
            // the diffrent line
            val srcSocket = DatagramSocket()
            srcSocket.send(packet)
            srcSocket.send(packet)
            srcSocket.send(packet)
            srcSocket.send(packet)
        }
        val costMs = System.currentTimeMillis() - startMs
        Log.e("UdpSendActivity", "#B $costMs ms")
    }
}

结果记录:

  

E / UdpSendActivity:#B 23毫秒
  E / UdpSendActivity:#A 1507毫秒

第一个测试仅使用一个DatagramSocket实例发送数据包,耗时1507毫秒; 第二个测试为每个dst地址创建一个新的DatagramSocket实例,它花费的时间更少,只有23 ms。

我很惊讶,想知道要花多少钱?

0 个答案:

没有答案
相关问题