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

标签 android android-studio sockets udp udpclient

我已经阅读了许多不同的帖子和问题,在我看来,这应该相对容易解决。我设法使用一个套接字对象将 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(),
            data.length,
            InetAddress.getByName("0.0.0.0"),
            6670
        )
        sRec.send(udpPacket)

        data = "Packet2"
        udpPacket = DatagramPacket(
            data.toByteArray(),
            data.length,
            InetAddress.getByName("0.0.0.0"),
            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, 0, 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没有收到socket对象发送的消息s ,即使它们都绑定(bind)到相同的(地址,端口)。有人可以帮我理解我所缺少的。非常感谢您的时间和提前帮助。

最佳答案

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

关于android - 如何在 Android 应用程序中通过 UDP 套接字接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66355018/

相关文章:

android - 如何创建具有服务器数据库连接的 Android 应用程序

android - 如何从 Android Studio Bumblebee 隐藏缩放 Controller ?

sockets - 如何彻底关闭 Zeromq DEALER/ROUTER inproc 连接

android - 如何将我的自定义 ImageView 与 DataBinding 一起使用?

php - 在 Android 中将 Retrofit 发布到 Rest 服务器

java - onProgressUpdate 未运行

java - 我想在我的cardview+RecyclerView中显示标题、描述和价格,而它只显示标题

php - 默认套接字超时 [XAMPP HTTPS]

c - glibc 的套接字实现在哪里?

android - 使用 Espresso 测试 Google Android Places 自动完成功能