一个 Android 使用 DatagramSocket 发送 UDP 的问题? https://stackoverflow.com/q/55533832/5105007

2019-04-07 21:32:33 +08:00
 raiz

https://stackoverflow.com/q/55533832/5105007

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")
    }
}

log:

E/UdpSendActivity: #B 23 ms
E/UdpSendActivity: #A 1507 ms

两个测试的区别在于使用一个 DatagramSocket 发送给所有的目的地址 还是 每个目的地址创建一个新的 DatagramSocket 来发送,日志显示前者速度非常慢。

4075 次点击
所在节点    Android
2 条回复
inoizyz
2019-04-08 15:14:22 +08:00
每次循环都使用一个新的 socket 那就不用管之前那个 socket 的状态,可以直接用吧?如果用旧的,那上一个包没发完会扔掉重新开始发当前的包吗,DatagramSocket.send 是同步的吧?
raiz
2019-04-08 15:46:26 +08:00
@inoizyz 同步方法来着,阻塞着

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/552764

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX