2017-04-13 70 views
0

注册的结果不应该为空,这是我从logcat获得的成功注册的回调。Android NSD:注册为null服务类型

registerService 46518 
onServiceRegistered name: mytest, type: null, host: null, port: 0, txtRecord:  

一切都是空的,由系统生成的端口46518,类型,txtrecord。

下面的代码是从official guide

private String mServiceName = "mytest"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    try { 
     // Initialize a server socket on the next available port. 
     ServerSocket mServerSocket = new ServerSocket(0); 
     int mLocalPort = mServerSocket.getLocalPort(); 
     registerService(mLocalPort); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void registerService(int port) { 
    Log.i(tag, "registerService " + port); 
    // Create the NsdServiceInfo object, and populate it. 
    NsdServiceInfo serviceInfo = new NsdServiceInfo(); 
    // The name is subject to change based on conflicts with other services advertised on the same network. 
    serviceInfo.setServiceName(mServiceName); 
    serviceInfo.setServiceType("_mytest._tcp"); 
    serviceInfo.setPort(port); 
    serviceInfo.setAttribute("info", android.os.Build.MODEL); 

    NsdManager mNsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE); 
    mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener); 
} 

NsdManager.RegistrationListener mRegistrationListener = new NsdManager.RegistrationListener() { 

    @Override 
    public void onServiceRegistered(NsdServiceInfo nsdServiceInfo) { 
     // Save the service name. Android may have changed it in order to 
     // resolve a conflict, so update the name you initially requested 
     // with the name Android actually used. 
     mServiceName = nsdServiceInfo.getServiceName(); 
     Log.i(tag, "onServiceRegistered " + nsdServiceInfo); 
    } 

    @Override 
    public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { 
     // Registration failed! Put debugging code here to determine why. 
     Log.i(tag, "onRegistrationFailed code " + errorCode + "\n" + serviceInfo); 
    } 

    @Override 
    public void onServiceUnregistered(NsdServiceInfo arg0) { 
     // Service has been unregistered. This only happens when you call 
     // NsdManager.unregisterService() and pass in this listener. 
     Log.i(tag, "onServiceUnregistered " + arg0); 
    } 

    @Override 
    public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { 
     // Unregistration failed. Put debugging code here to determine why. 
     Log.i(tag, "onRegistrationFailed code " + errorCode + "\n" + serviceInfo); 
    } 
}; 

回答

1

得到了我的LG G5(安卓7.0)

中检查MDNS信息包在Wireshark的出现和他们做一样的! 即使在onServiceRegistered()中的NsdServiceInfo说了一些不同的东西,看起来该服务是通过正确的ip和端口 宣布的。