1

注册的结果不应该为空,这是我从logcat得到的,也是注册成功的回调。

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

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

以下代码来自官方指南

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

1 回答 1

1

在我的 LG G5 (Android 7.0) 上得到了同样的结果

检查 MDNS 数据包是否出现在 Wireshark 中,它们确实出现了!即使 onServiceRegistered() 中的 NsdServiceInfo 说明了不同的内容,该服务似乎也使用正确的 ip 和端口进行了宣布。

于 2017-10-13T18:44:57.753 回答