我正在尝试通过网络中的网络服务发现 API (NSD) 连接两个 Android 设备。在实施过程中,我关注了官方的 Android 网页。其中一台设备充当服务器,另一台充当客户端。我向网络询问下一个空闲端口。但是只要我通过 registerService(nsdsInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener) 在网络中注册服务器,nsdsInfo 中的参数就是空的。因此,在调用这行代码之前,nsdsInfo 对象包含正确的端口和正确的主机等。在调用此方法后,监听器 onServiceRegistered() 中的回调方法包含 Port = 0 和 Host = null。
是否有任何猜测为什么在注册过程中端口和主机名丢失但注册仍然成功?另一方面,即使触发了注册回调“onServiceRegistrered()”,其他设备也无法发现服务器。
提前谢谢各位!
//Const
private static final String SERVICE_TYPE = "_speech._tcp";
private static final String SERVICE_NAME = "speech";
public WiFiServiceRegistry(Context ctx) throws IOException {
this.context = ctx;
initializeSocketAndPort();
initializeNsdService();
initializeRegistrationListener();
if (nsdManager == null)
nsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
System.out.println("nsdsinfo host" + nsdsInfo.getServiceName());
System.out.println("nsdsinfo port" + nsdsInfo.getPort());
nsdManager.registerService(nsdsInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
}
/**
* Initializes the NsdServiceInfo.
*/
private void initializeNsdService(){
nsdsInfo = new NsdServiceInfo();
nsdsInfo.setServiceName(SERVICE_NAME);
nsdsInfo.setServiceType(SERVICE_TYPE);
nsdsInfo.setPort(mLocalPort);
}
/**
* Initializes the socket and port. Parameter 0 means that the next available port is used (dynamic).
* @throws IOException
*/
private void initializeSocketAndPort() throws IOException {
mServerSocket = new ServerSocket(0);
mLocalPort = mServerSocket.getLocalPort();
}
/**
* Inizializes the registrationListener. Keeps track of the registration status.
*/
private void initializeRegistrationListener(){
mRegistrationListener = new NsdManager.RegistrationListener() {
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
System.out.println("WiFiServiceRegistry: Registration failed");
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
System.out.println("WiFiServiceRegistry: Unregistration failed");
}
@Override
public void onServiceRegistered(NsdServiceInfo serviceInfo) {
System.out.println("WiFiServiceRegistry: Registered service");
System.out.println("WiFiServiceRegistry: Port " + serviceInfo.getPort());
System.out.println("WiFiServiceRegistry: Host " + serviceInfo.getHost());
System.out.println("WiFiServiceRegistry: ServiceName " + serviceInfo.getServiceName());
}
@Override
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
System.out.println("WiFiServiceRegistry: Unregistered service");
}
};
}