WiFi 局域网通信 - 发现服务和解析

1. nsdManager

nsdManager = requireContext().getSystemService(Context.NSD_SERVICE) as NsdManager

2.  NsdManager.DiscoveryListener

注意:在onStartDiscoveryFailed 和 onStopDiscoveryFailed里不要调用nsdManager.stopServiceDiscovery(this) 方法,会出现crash问题;如下方式调用:

if (discoveryListener != null) {
    Log.d(TAG, "start : loadData ")
    nsdManager.stopServiceDiscovery(discoveryListener)
}

discoveryListener = object : NsdManager.DiscoveryListener {
    override fun onDiscoveryStarted(regType: String) {
        Log.d(TAG, "Service discovery started")
    }

    override fun onServiceFound(service: NsdServiceInfo) {
        Log.d(TAG, "Service discovery success: $service")
        Log.d(TAG, "Service discovery serviceName: ${service.serviceName}")
        when {
            service.serviceType != SERVICE_TYPE ->
                Log.d(TAG, "Unknown Service Type: ${service.serviceType}")
            service.serviceType == SERVICE_TYPE -> {
                Log.d(TAG, "start : resolveListener ")
                resolveService(service)
            }
        }
    }

    override fun onServiceLost(service: NsdServiceInfo) {
        // When the network service is no longer available.
        Log.e(TAG, "service lost: $service")
    }

    override fun onDiscoveryStopped(serviceType: String) {
        Log.i(TAG, "Discovery stopped: $serviceType")
    }

    override fun onStartDiscoveryFailed(serviceType: String, errorCode: Int) {
        Log.e(TAG, "onStart Discovery failed: Error code:$errorCode")
    }

    override fun onStopDiscoveryFailed(serviceType: String, errorCode: Int) {
        Log.e(TAG, "onStop Discovery failed: Error code:$errorCode")
    }
}
//SERVICE_TYPE 为你自定义的服务名称,比如 const val SERVICE_TYPE = "_test-rct._tcp."
nsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, discoveryListener)

3. NsdManager.ResolveListener

private fun resolveService(service: NsdServiceInfo) {
    val resolveListener = object : NsdManager.ResolveListener {
        override fun onResolveFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
            Log.e(TAG, "Resolve failed: $errorCode")
        }

        override fun onServiceResolved(serviceInfo: NsdServiceInfo) {
            val port: Int = serviceInfo.port
            val host =serviceInfo.host.hostAddress
            Log.d(TAG, "Resolve port: $port")
            Log.d(TAG, "Resolve host: $host")
        }
    }
    nsdManager.resolveService(service, resolveListener)
}
  • 24
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值