Отображение нулевого значения при использовании информации о сетевой службе в NSD
Чтобы найти список служб с помощью класса NSDManager, я реализовал некоторый код со ссылкой Google, но не могу получить адрес хоста, когда пытаюсь обнаружить службы. Это показывает ноль, когда началось открытие. Я сослался на эту ссылку, чтобы найти список устройств, подключенных к той же сети, за которой следовал этот блог, чтобы получить все услуги при подключении к той же сети.
Правильный ли мой подход для получения списка сервисов / устройств, подключенных к той же сети?
Я попробовал следующий код, чтобы найти список
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView)findViewById(R.id.mytext);
mylist=new List<NsdManager.DiscoveryListener>() {
@Override
public int size() {
return s;
}
@Override
public boolean add(NsdManager.DiscoveryListener discoveryListener) {
return true;
}
@Override
public NsdManager.DiscoveryListener get(int i) {
return mDiscoveryListener;
}
@Override
public NsdManager.DiscoveryListener set(int i, NsdManager.DiscoveryListener discoveryListener) {
return mDiscoveryListener;
}
@Override
public NsdManager.DiscoveryListener remove(int i) {
return mDiscoveryListener;
}
};
nsdList=new ArrayList<>();
nsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE);
//broadcaster = LocalBroadcastManager.getInstance(mContext);
registerService(port);
initializeResolveListener();
discoverServices();
}
public void initializeDiscoveryListener() {
mDiscoveryListener = new NsdManager.DiscoveryListener() {
@Override
public void onDiscoveryStarted(String regType) {
Log.d(TAG, "Service discovery started");
}
@Override
public void onServiceFound(NsdServiceInfo service) {
Log.d(TAG, "Service discovery success : " + service);
String serviceType = service.getServiceType();
mylist.add(mDiscoveryListener);
nsdList.add(service.getServiceName());
s++;
Log.d(TAG, "Service discovery success: " + service.getServiceName());
boolean isOurService = serviceType.equals(SERVICE_TYPE) || serviceType.equals(SERVICE_TYPE);
if (!isOurService) {
Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
} else if (service.getServiceName().equals(SERVICE_NAME)) {
Log.d(TAG, "Same machine: " + SERVICE_NAME);
} else if (service.getServiceName().contains(SERVICE_NAME)) {
Log.d(TAG, "different machines. (" + service.getServiceName() + "-" +
SERVICE_NAME+ ")");
nsdManager.resolveService(service, mResolveListener);
}
}
Зарегистрированный сервис с
public void registerService(int port) {
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName(SERVICE_NAME);
serviceInfo.setServiceType(SERVICE_TYPE);
serviceInfo.setPort(port);
nsdManager.registerService(serviceInfo,
NsdManager.PROTOCOL_DNS_SD,
registrationListener);
}
мой решительный слушатель
public void initializeResolveListener() {
mResolveListener = new NsdManager.ResolveListener() {
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
Log.e(TAG, "Resolve failed" + errorCode);
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
Log.v(TAG, "Resolve Succeeded. " + serviceInfo);
if (serviceInfo.getServiceName().equals(mService)) {
Log.d(TAG, "Same IP.");
return;
}
mService = serviceInfo;
int port = mService.getPort();
InetAddress host = mService.getHost(); }
};
}
1 ответ
Когда вы обнаруживаете услугу, это просто запись PTR:
_http._tcp.local. type PTR, class IN, myService._http._tcp.local.
Если вам нужна информация о хосте / порте, вы должны разрешить эту запись, даже если она была объявлена вами.