我最近开始研究由Android提供的网络服务发现。
我在同一个网络上连接了两个应用程序。其中一个将在这个类中注册服务:
public class NsdRegister {
private Context mContext;
private NsdManager mNsdManager;
private NsdManager.RegistrationListener mRegistrationListener;
public String mServiceName = "NsdServer1";
public static final String SERVICE_TYPE = "_http._tcp.";
public NsdHelper(Context context) {
mContext = context;
mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
}
public void initializeRegistrationListener() {
mRegistrationListener = new NsdManager.RegistrationListener() {
@Override
public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
mServiceName = NsdServiceInfo.getServiceName();
System.out.println(mServiceName);
}
@Override
public void onRegistrationFailed(NsdServiceInfo arg0, int arg1) {
System.out.println(arg0.toString());
System.out.println("Failed " + arg1);
}
@Override
public void onServiceUnregistered(NsdServiceInfo arg0) {
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
}
};
}
public void registerService() {
initializeRegistrationListener();
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setPort(5906);
serviceInfo.setServiceName(mServiceName);
serviceInfo.setServiceType(SERVICE_TYPE);
mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
}
public void tearDown() {
mNsdManager.unregisterService(mRegistrationListener);
}
}另一个应用程序将使用这个类发现网络上的所有服务:
public class NsdHelper {
public static final String SERVICE_TYPE = "_http._tcp.";
public static final String TAG = "NsdHelper";
public static final String SERVER_AIO = "NsdServer1";
private Context mContext;
private NsdManager mNsdManager;
private NsdManager.DiscoveryListener mDiscoveryListener;
private NsdServiceInfo mService;
public NsdHelper(Context context) {
mContext = context;
mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
}
private void initializeDiscoveryListener() {
mDiscoveryListener = new NsdManager.DiscoveryListener() {
@Override
public void onDiscoveryStarted(String regType) {
Log.d(TAG, "Service discovery started");
}
@Override
public void onServiceFound(NsdServiceInfo service) {
if (service.getServiceName().equals(SERVER_AIO)) {
mNsdManager.resolveService(service, new NsdManager.ResolveListener() {
@Override
public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) {
System.out.println("Failed to resolve");
}
@Override
public void onServiceResolved(NsdServiceInfo nsdServiceInfo) {
stopDiscovery();
System.out.println(nsdServiceInfo.getHost().getHostAddress());
}
});
}
}
@Override
public void onServiceLost(NsdServiceInfo service) {
Log.e(TAG, "service lost" + service);
if (mService == service) {
mService = null;
}
}
@Override
public void onDiscoveryStopped(String serviceType) {
Log.i(TAG, "Discovery stopped: " + serviceType);
}
@Override
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, "Discovery failed: Error code:" + errorCode);
mNsdManager.stopServiceDiscovery(this);
}
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, "Discovery failed: Error code:" + errorCode);
mNsdManager.stopServiceDiscovery(this);
}
};
}
public void discoverServices() {
initializeDiscoveryListener();
mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}
public void stopDiscovery() {
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
}
}登记簿很好,但发现没有找到我的服务。我在同一个网络上连接两个应用程序。
我不知道问题出在哪里。
请帮帮我,
谢谢
发布于 2018-01-16 12:15:10
这对我来说是完美的。
客户
public class ClientActivity extends Activity {
private String SERVICE_NAME = "Client Device";
private String SERVICE_TYPE = "_http._tcp.";
private InetAddress hostAddress;
private int hostPort;
private NsdManager mNsdManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// set content view and other stuff
// NSD Stuff
mNsdManager = (NsdManager) getSystemService(ClientActivity.NSD_SERVICE);
mNsdManager.discoverServices(SERVICE_TYPE,
NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}
@Override
protected void onPause() {
if (mNsdManager != null) {
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
}
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
if (mNsdManager != null) {
mNsdManager.discoverServices(
SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}
}
@Override
protected void onDestroy() {
if (mNsdManager != null) {
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
}
super.onDestroy();
}
NsdManager.DiscoveryListener mDiscoveryListener = new NsdManager.DiscoveryListener() {
// Called as soon as service discovery begins.
@Override
public void onDiscoveryStarted(String regType) {
System.out.println("Listening Service discovery started");
}
@Override
public void onServiceFound(NsdServiceInfo service) {
// A service was found! Do something with it.
System.out.println("Listening Service discovery success : " + service);
System.out.println("Listening Host = "+ service.getServiceName());
System.out.println("Listening port = " + String.valueOf(service.getPort()));
if (!service.getServiceType().equals(SERVICE_TYPE)) {
// Service type is the string containing the protocol and
// transport layer for this service.
System.out.println("Listening Unknown Service Type: " + service.getServiceType());
} else if (service.getServiceName().equals(SERVICE_NAME)) {
// The name of the service tells the user what they'd be
// connecting to. It could be "Bob's Chat App".
System.out.println("Listening Same machine: " + SERVICE_NAME);
} else {
System.out.println("Listening Diff Machine : " + service.getServiceName());
// connect to the service and obtain serviceInfo
mNsdManager.resolveService(service, mResolveListener);
}
}
@Override
public void onServiceLost(NsdServiceInfo service) {
// When the network service is no longer available.
// Internal bookkeeping code goes here.
System.out.println("Listening service lost" + service);
}
@Override
public void onDiscoveryStopped(String serviceType) {
System.out.println("Listening Discovery stopped: " + serviceType);
}
@Override
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
System.out.println("Listening failed: Error code:" + errorCode);
mNsdManager.stopServiceDiscovery(this);
}
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
System.out.println("Listening failed: Error code:" + errorCode);
mNsdManager.stopServiceDiscovery(this);
}
};
NsdManager.ResolveListener mResolveListener = new NsdManager.ResolveListener() {
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
// Called when the resolve fails. Use the error code to debug.
System.out.println("Listening Resolve failed " + errorCode);
System.out.println("Listening serivce = " + serviceInfo);
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
System.out.println("Listening . " + serviceInfo.getServiceName());
if (serviceInfo.getServiceName().equals(SERVICE_NAME)) {
System.out.println("Listening port " + serviceInfo);
return;
}
// Obtain port and IP
hostPort = serviceInfo.getPort();
hostAddress = serviceInfo.getHost();
System.out.println("Listening port " + hostPort);
System.out.println("Listening ip " + hostAddress);
}
};服务器
public class ServerActivity extends Activity {
private String SERVICE_NAME = "Server device";
private String SERVICE_TYPE = "_http._tcp.";
private NsdManager mNsdManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView and other stuff
mNsdManager = (NsdManager) getSystemService(ServerActivity.NSD_SERVICE);
registerService(9000);
}
@Override
protected void onPause() {
if (mNsdManager != null) {
mNsdManager.unregisterService(mRegistrationListener);
}
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
if (mNsdManager != null) {
registerService(9000);
}
}
@Override
protected void onDestroy() {
if (mNsdManager != null) {
mNsdManager.unregisterService(mRegistrationListener);
}
super.onDestroy();
}
public void registerService(int port) {
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName(SERVICE_NAME);
serviceInfo.setServiceType(SERVICE_TYPE);
serviceInfo.setPort(port);
mNsdManager.registerService(serviceInfo,
NsdManager.PROTOCOL_DNS_SD,
mRegistrationListener);
}
NsdManager.RegistrationListener mRegistrationListener = new NsdManager.RegistrationListener() {
@Override
public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
String mServiceName = NsdServiceInfo.getServiceName();
SERVICE_NAME = mServiceName;
System.out.println("Listening Registered name : " + mServiceName);
}
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo,
int errorCode) {
System.out.println("Listening Registered failed : " + errorCode);
}
@Override
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
// Service has been unregistered. This only happens when you
// call
// NsdManager.unregisterService() and pass in this listener.
System.out.println("Listening Service Unregistered : " + serviceInfo.getServiceName());
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo,
int errorCode) {
// Unregistration failed. Put debugging code here to determine
// why.
System.out.println("Listening Unregistration failed : " + errorCode);
}
};https://stackoverflow.com/questions/39077624
复制相似问题