2017-04-13 3 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 - 패킷을 와이어 샤크에 표시 확인란을 선택하면 그들이 한에서 동일한있어입니다! onServiceRegistered()의 NsdServiceInfo가 다른 경우에도 올바른 ip 및 포트, 으로 서비스가 발표 된 것으로 보입니다.

관련 문제