在 Android 13 中实现 mDNS 的步骤指导

在 Android 13 中,使用 mDNS(多播DNS)可以帮助你的应用发现网络上的服务。本文将指导你如何在 Android 应用中实现 mDNS,适合刚入行的小白。我们将通过一个简单的流程图和代码示例来帮助你理解。

一、实现步骤

以下是实现 mDNS 的基本步骤:

步骤 描述
1. 添加依赖 build.gradle 文件中添加 mDNS 相关库
2. 创建服务 编写代码注册需要被发现的服务
3. 发现服务 编写代码去发现网络中的服务
4. 处理结果 处理发现的服务的结果,更新 UI 或执行相应操作

二、每一步的具体实现

1. 添加依赖

在你的 app/build.gradle 中添加 mDNS 的依赖。使用以下代码:

dependencies {
    implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0'
    implementation 'javax.jmdns:jmdns:3.5.5'
}

这段代码会导入 Kotlin 和 mDNS 相关的库。

2. 创建服务

创建一个类来注册 mDNS 服务。下面是 MdnsService 类的代码示例:

import javax.jmdns.JmDNS
import javax.jmdns.ServiceInfo
import java.io.IOException
import java.net.InetAddress

class MdnsService {
    private lateinit var jmdns: JmDNS

    // 启动 JmDNS
    fun startService(serviceName: String, serviceType: String, port: Int) {
        try {
            val inetAddress = InetAddress.getLocalHost()
            jmdns = JmDNS.create(inetAddress)

            val serviceInfo = ServiceInfo(serviceType, serviceName, port, "path=index.html".toByteArray(), null)
            jmdns.registerService(serviceInfo)

            println("Service registered: $serviceName")
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    // 停止服务
    fun stopService() {
        if (::jmdns.isInitialized) {
            jmdns.unregisterAllServices()
            jmdns.close()
            println("Service unregistered")
        }
    }
}
代码解释:
  • startService:启动 mDNS 服务并注册,使用 JmDNS.create 方法创建一个服务进程,并使用 registerService 注册具体的服务信息。
  • stopService:停止服务并关闭 jmdns 实例。

3. 发现服务

创建另一个类来发现服务,例如 MdnsDiscovery

import javax.jmdns.JmDNS
import javax.jmdns.ServiceEvent
import javax.jmdns.ServiceListener

class MdnsDiscovery {
    private lateinit var jmdns: JmDNS

    // 开始发现服务
    fun discoverService(serviceType: String) {
        try {
            jmdns = JmDNS.create()
            jmdns.addServiceListener(serviceType, object : ServiceListener {
                override fun serviceAdded(event: ServiceEvent) {
                    println("Service added: ${event.info}")
                }

                override fun serviceRemoved(event: ServiceEvent) {
                    println("Service removed: ${event.info}")
                }

                override fun serviceResolved(event: ServiceEvent) {
                    println("Service resolved: ${event.info}")
                }
            })
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    // 停止发现
    fun stopDiscovery() {
        if (::jmdns.isInitialized) {
            jmdns.removeServiceListener("*", object : ServiceListener {})
            jmdns.close()
            println("Discovery stopped")
        }
    }
}
代码解释:
  • discoverService:创建一个服务监听器来处理找到的新服务、已移除的服务和解析的服务。
  • 每个方法中都会打印服务的状态,用于调试和跟踪。

4. 处理结果

在你的 MainActivity 中调用服务和发现:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private val mdnsService = MdnsService()
    private val mdnsDiscovery = MdnsDiscovery()

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

        // 启动 mDNS 服务
        mdnsService.startService("MyService", "_http._tcp.local.", 9000)

        // 开始发现服务
        mdnsDiscovery.discoverService("_http._tcp.local.")
    }

    override fun onDestroy() {
        super.onDestroy()
        // 停止服务和发现
        mdnsService.stopService()
        mdnsDiscovery.stopDiscovery()
    }
}
代码解释:
  • onCreate: 启动时启动 mDNS 服务和发现。
  • onDestroy: 在活动销毁时停止服务和发现以避免内存泄漏。

三、序列图与类图

序列图

sequenceDiagram
    participant User
    participant MdnsService
    participant MdnsDiscovery

    User->>MdnsService: startService("MyService", "_http._tcp.local.", 9000)
    MdnsService->>MdnsService: registerService(ServiceInfo)
    MdnsService-->>User: Service registered

    User->>MdnsDiscovery: discoverService("_http._tcp.local.")
    MdnsDiscovery->>MdnsDiscovery: addServiceListener()
    MdnsDiscovery-->>User: Listening for services

类图

classDiagram
    class MdnsService {
        +startService(serviceName: String, serviceType: String, port: Int)
        +stopService()
    }

    class MdnsDiscovery {
        +discoverService(serviceType: String)
        +stopDiscovery()
    }

结尾

通过上述步骤,你不仅学习了如何在 Android 13 中实现 mDNS,还了解了 mDNS 服务的注册和发现。希望这篇文章能帮助你顺利入门。如果遇到问题,不妨查看相关文档或社区,寻求帮助。对于刚入行的小白来说,最佳的学习方法是通过实践,祝你在开发的道路上越走越远!