android注册服务,Android NSD注册服务,发现服务

import android.content.Context;

import android.net.nsd.NsdManager;

import android.net.nsd.NsdServiceInfo;

import android.util.Log;

public class NSDHelper {

private static final String TAG = NSDHelper.class.getSimpleName();

private NsdManager.RegistrationListener mRegistrationListener;

private NsdManager.DiscoveryListener mDiscoveryListener;

private NsdManager mNsdManager;

private String mServiceName;

public NSDHelper(Context context) {

mNsdManager = (NsdManager) context.getApplicationContext().getSystemService(Context.NSD_SERVICE);

}

/**

* 注册NSD 服务,用来广播自己的服务

*/

public void registerService(String serviceName, int port, NsdManager.RegistrationListener listener) {

mServiceName = (serviceName == null) ? Constants.NSD_SERVER_DEFAULT_NAME : serviceName;

NsdServiceInfo serviceInfo = new NsdServiceInfo();

serviceInfo.setPort(port);

serviceInfo.setServiceName(mServiceName);

serviceInfo.setServiceType(Constants.NSD_SERVER_TYPE);

initRegisterationListener(listener);

mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);

}

/**

* 取消注册服务

*/

public void unRegisterService() {

mNsdManager.unregisterService(mRegistrationListener);

}

private void initRegisterationListener(NsdManager.RegistrationListener listener) {

if (listener == null) {

createDefaultListener();

} else {

mRegistrationListener = listener;

}

}

private void createDefaultListener() {

mRegistrationListener = new NsdManager.RegistrationListener() {

@Override

public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {

Log.i(TAG, "onRegistrationFailed,errCode = " + errorCode);

}

@Override

public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {

Log.i(TAG, "onUnregistrationFailed,errCode = " + errorCode);

}

@Override

public void onServiceRegistered(NsdServiceInfo serviceInfo) {

Log.i(TAG, "onServiceRegistered,serviceInfo=" + serviceInfo.toString());

}

@Override

public void onServiceUnregistered(NsdServiceInfo serviceInfo) {

Log.i(TAG, "onServiceUnregistered,serviceInfo=" + serviceInfo.toString());

}

};

}

/**

* 开始设备发现服务

*/

public void startDiscoveryService(NsdManager.DiscoveryListener discoveryListener, NsdManager.ResolveListener resolveListener) {

initDiscoveryListener(discoveryListener);

mNsdManager.discoverServices(Constants.NSD_SERVER_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);

}

/**

* 停止设备发现服务

*/

public void stopDiscoveryService() {

mNsdManager.stopServiceDiscovery(mDiscoveryListener);

}

private void initDiscoveryListener(NsdManager.DiscoveryListener discoveryListener) {

if (discoveryListener == null) {

createDefaultDiscoveryListener();

} else {

mDiscoveryListener = discoveryListener;

}

}

private void createDefaultDiscoveryListener() {

mDiscoveryListener = new NsdManager.DiscoveryListener() {

@Override

public void onStartDiscoveryFailed(String serviceType, int errorCode) {

}

@Override

public void onStopDiscoveryFailed(String serviceType, int errorCode) {

}

@Override

public void onDiscoveryStarted(String serviceType) {

}

@Override

public void onDiscoveryStopped(String serviceType) {

}

@Override

public void onServiceFound(NsdServiceInfo serviceInfo) {

Log.i(TAG, "onServiceFound,serviceInfo= " + serviceInfo.toString());

if(serviceInfo.getServiceName().equalsIgnoreCase(mServiceName)){

mNsdManager.resolveService(serviceInfo, new NsdManager.ResolveListener() {

@Override

public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {

}

@Override

public void onServiceResolved(NsdServiceInfo serviceInfo) {

Log.i(TAG, "onServiceResolved,serviceInfo= " + serviceInfo.toString());

}

});

}

}

@Override

public void onServiceLost(NsdServiceInfo serviceInfo) {

Log.i(TAG, "onServiceLost,serviceInfo= " + serviceInfo.toString());

}

};

}

}

下面是打印的日志:

onServiceRegistered,serviceInfo=name: dy.com.alphad.nsd, type: null, host: null, port: 0

I/NSDHelper: onServiceFound,serviceInfo= name: dy.com.alphad.nsd, type: _http._tcp., host: null, port: 0

I/NSDHelper: onServiceResolved,serviceInfo= name: dy.com.alphad.nsd, type: ._http._tcp, host: .....165, port: 1008

可以看出来,1.自己注册的服务也可以在被自己在发现服务的时候找到

2.serviceinfo 在解析之前只能读取到名称,解析之后才能看到全部信息。

另外(发现服务)和(向外广播自己的服务)据说比较耗电,记得开启INTENET权限。

dd6aabf4b683efe4976b328de5036fe8.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用程序中搜索MDNS服务,可以使用Android网络框架中的Network Service Discovery(NSD)API。以下是搜索MDNS服务的一般步骤: 1. 创建NsdManager实例: ``` NsdManager nsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); ``` 2. 创建NsdManager.DiscoveryListener实例,并实现onDiscoveryStarted、onServiceFound、onServiceLost和onDiscoveryStopped等回调方法: ``` NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() { @Override public void onDiscoveryStarted(String regType) { // 发现服务 } @Override public void onServiceFound(NsdServiceInfo serviceInfo) { // 找到服务 } @Override public void onServiceLost(NsdServiceInfo serviceInfo) { // 丢失服务 } @Override public void onDiscoveryStopped(String serviceType) { // 停止搜索 } @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { // 开始搜索失败 } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { // 停止搜索失败 } }; ``` 3. 创建NsdManager.ResolveListener实例,并实现onServiceResolved回调方法: ``` NsdManager.ResolveListener resolveListener = new NsdManager.ResolveListener() { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { // 解析服务信息失败 } @Override public void onServiceResolved(NsdServiceInfo serviceInfo) { // 解析服务信息成功 } }; ``` 4. 开始搜索MDNS服务: ``` nsdManager.discoverServices("_http._tcp", NsdManager.PROTOCOL_DNS_SD, discoveryListener); ``` 其中,第一个参数是服务的类型,可以根据实际情况进行修改。第二个参数是协议类型,NSD API支持DNS-SD协议和mDNS协议,这里使用DNS-SD协议。第三个参数是DiscoveryListener实例。 5. 在onServiceFound回调方法中,获取到NsdServiceInfo实例,然后调用它的resolve方法解析服务信息: ``` nsdManager.resolveService(serviceInfo, resolveListener); ``` 其中,第一个参数是NsdServiceInfo实例,第二个参数是ResolveListener实例。 6. 在onServiceResolved回调方法中,获取到服务的IP地址和端口号等信息,然后可以使用它们来连接服务。 注意,搜索MDNS服务需要在AndroidManifest.xml中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> ``` 同时,如果应用程序运行在Android 9.0及以上版本的设备上,则需要在AndroidManifest.xml中添加以下配置: ``` <application ... android:usesCleartextTraffic="true" ... > ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值