Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android NSD:registerService返回端口0和主机null_Java_Android_Networking_Service_Nsd - Fatal编程技术网

Java Android NSD:registerService返回端口0和主机null

Java Android NSD:registerService返回端口0和主机null,java,android,networking,service,nsd,Java,Android,Networking,Service,Nsd,我正试图通过网络服务发现API(NSD)连接两台Android设备。在实现过程中,我遵循了Android的官方网页。其中一个设备充当服务器,另一个充当客户端。我请求网络提供下一个自由端口。但是,只要我通过registerService(nsdsInfo、NsdManager.PROTOCOL\u DNS\u SD、MRRegistrationListener)在网络中注册服务器,nsdsInfo中的参数就为空。因此,在调用这行代码之前,nsdsInfo对象包含正确的端口和正确的主机等。在调用此方

我正试图通过网络服务发现API(NSD)连接两台Android设备。在实现过程中,我遵循了Android的官方网页。其中一个设备充当服务器,另一个充当客户端。我请求网络提供下一个自由端口。但是,只要我通过registerService(nsdsInfo、NsdManager.PROTOCOL\u DNS\u SD、MRRegistrationListener)在网络中注册服务器,nsdsInfo中的参数就为空。因此,在调用这行代码之前,nsdsInfo对象包含正确的端口和正确的主机等。在调用此方法之后,侦听器onServiceRegistered()中的回调方法包含端口=0和主机=null

是否有人猜测为什么在注册过程中端口和主机名丢失,但注册仍然成功? 另一方面,即使启动了注册回调“onServiceRegistreed()”,其他设备也无法发现服务器

提前谢谢各位

//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");
            }
        };
    }

解决:问题是NSD基于多播流量。由于安全问题,我登录的网络不支持多流量…)我也有同样的行为,但没有找到原因。有趣的是,如果我将IP和端口放入服务名称中,那么我可以将该信息传输到另一个设备并成功打开套接字。解决了:问题是NSD是基于多播流量的。由于安全问题,我登录的网络不支持多流量…)我也有同样的行为,但没有找到原因。有趣的是,如果我将IP和端口放入服务名称中,那么我可以将该信息传输到另一个设备并成功打开套接字。古怪的