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