如何在Android应用程序中通过UPD套接字接收数据

问题描述

我已经阅读了许多不同的帖子和问题,在我看来,这应该相对容易解决。我设法使用一个套接字对象将 UDP 数据包发送到正确的(地址、端口),但只能使用相同的套接字对象读取消息。这种行为可以在我的代码以及相应的输出中看到:

    GlobalScope.launch {
        val messageStr = "Hello Android!"
        val s = DatagramSocket(null)
        s.reuseAddress = true
        s.broadcast = true
        s.bind(InetSocketAddress(6670))
        s.soTimeout = 1500
        var local = InetAddress.getByName("0.0.0.0")
        val msg_length = messageStr.length
        val messageSent = messageStr.toByteArray()
        val p = DatagramPacket(messageSent,msg_length,local,6670)
        s.send(p)

        val sRec = DatagramSocket(null)
        sRec.reuseAddress = true
        sRec.broadcast = true
        sRec.bind(InetSocketAddress(6670))
        Log.d("testUDP","SoTimeOut:${sRec.soTimeout}")
        sRec.soTimeout = 1500
        var data = "Packet0"
        var udpPacket = DatagramPacket(
            data.toByteArray(),data.length,InetAddress.getByName("0.0.0.0"),6670
        )
        sRec.send(udpPacket)

        data = "Packet1"
        udpPacket = DatagramPacket(
            data.toByteArray(),6670
        )
        sRec.send(udpPacket)

        data = "Packet2"
        udpPacket = DatagramPacket(
            data.toByteArray(),6670
        )
        sRec.send(udpPacket)

        var text: String
        val messageRec = ByteArray(1500)
        val pRec = DatagramPacket(messageRec,messageRec.size)

        var count = 0
        while(count < 3){
            try{
                sRec.receive(pRec)
                text = String(messageRec,pRec.length)
                Log.d("testUDP","message:$text")
            } catch (e: Exception){
                e.printstacktrace()
            }
            count +=1
        }

        s.close()
        sRec.close()
    }

D/testUDP: message:Packet0

D/testUDP: message:Packet1

D/testUDP: message:Packet2

如您所见,套接字对象 sRec 没有收到套接字对象 s 发送的消息,即使它们都绑定到相同的(地址、端口)。有人可以帮我理解我所缺少的。非常感谢您的时间和帮助。

解决方法

服务器和客户端应该在两个不同的线程上,以确保一个不会阻塞另一个。