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) }