我的目的是在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。
我很惊讶,想知道要花多少钱?