Java 使用NsdManager连接多个设备

Java 使用NsdManager连接多个设备,java,android,Java,Android,我在Android上工作,我需要在我的应用程序中进行一些套接字编程。我想使用NsdManager创建我自己的网络。我成功地在网络中注册了我的服务,并与其他设备进行了连接。我已经成功地在设备之间传输数据 问题 一切正常,也可以在两台设备之间传输消息,但在连接两台以上设备时出现问题 要求 我想连接两个以上的设备并在所有连接的设备中共享数据 我的代码的简要说明 这里我有两个类聊天连接和NsdHalper。 ChatConnection仅用于在两台设备之间传输数据,NsdHalper是NsdMa

我在Android上工作,我需要在我的应用程序中进行一些套接字编程。我想使用NsdManager创建我自己的网络。我成功地在网络中注册了我的服务,并与其他设备进行了连接。我已经成功地在设备之间传输数据

问题

  • 一切正常,也可以在两台设备之间传输消息,但在连接两台以上设备时出现问题
要求

  • 我想连接两个以上的设备并在所有连接的设备中共享数据
我的代码的简要说明

这里我有两个类聊天连接和NsdHalper。 ChatConnection仅用于在两台设备之间传输数据,NsdHalper是NsdManger的实用程序

首先,我在网络中注册我的服务

public void registerService(int port) {
    NsdServiceInfo serviceInfo  = new NsdServiceInfo();
    serviceInfo.setPort(port);
    serviceInfo.setServiceName(mServiceName);
    serviceInfo.setServiceType(SERVICE_TYPE);
    
    mNsdManager.registerService(
            serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
    
}
而不是发现我的服务

 public void discoverServices() {
    mNsdManager.discoverServices(
            SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}
我正在制作一个自定义适配器,用于列出网络中所有可用的设备

  class DeviceListAdpater extends ArrayAdapter<NsdServiceInfo> {

    private List<NsdServiceInfo> items;
    private Context context;


    public DeviceListAdpater(Context context,
                             List<NsdServiceInfo> objects) {
        super(context, 0, 0, objects);
        this.context = context;
        items = objects;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) context.getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row_device_list, parent, false);


        }
        NsdServiceInfo device = items.get(position);
        if (device != null) {
            TextView top = (TextView) v.findViewById(R.id.txt_devicename);

            if (top != null) {
                top.setText(device.getServiceName());
            }

        }

        return v;

    }
}
我希望你们都清楚我的代码

我真的需要你的帮助来解决这个问题。 如果有人使用NsdManager连接多个设备,请提供帮助

我已经使用代码引用制作了这个应用程序

谢谢

Onik答案。

  • 假设我有3台设备A1 A2和A3。当所有设备成功在网络中注册并相互显示设备时。当A1被请求连接A2而不是A2时,如果A2点击连接,则弹出接受连接或拒绝连接,而这两台设备连接成功。在此会话期间,A3也希望连接A2而不是A3请求与A2连接,而不是再次请求A2获取连接的pop。 问题发生时 而A2点按连接按钮比上一次连接会丢失。 但我对先前连接的要求仍然存在,而A3连接A2
我希望你能明白我的问题。 和
在logCat中不会发生任何事情。创建新连接时,logCat将显示与我们在上一次连接时相同的内容。

检查编辑…我希望您对此清楚。检查编辑…我希望您对此清楚。
public void initializeDiscoveryListener() {
    mDiscoveryListener = new NsdManager.DiscoveryListener() {

        @Override
        public void onDiscoveryStarted(String regType) {
            Log.d(TAG, "Service discovery started");
        }

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            Log.d(TAG, "Service discovery success" + service);
            if (!service.getServiceType().equals(SERVICE_TYPE)) {
                Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
            } else if (service.getServiceName().equals(mServiceName)) {
                Log.d(TAG, "Same machine: " + mServiceName);
            } else //if (service.getServiceName().contains(mServiceName))
            {
                getCallback().DeviceUpdate(service);

            }
        }

        @Override
        public void onServiceLost(NsdServiceInfo service) {
            Log.e(TAG, "service lost" + service);
            getCallback().ConnectionDone(service,false);
            if (mService == service) {
                mService = null;
            }
        }
        
        @Override
        public void onDiscoveryStopped(String serviceType) {
            Log.i(TAG, "Discovery stopped: " + serviceType);
        }

        @Override
        public void onStartDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }

        @Override
        public void onStopDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }
    };
}

public void initializeResolveListener() {
    mResolveListener = new NsdManager.ResolveListener() {

        @Override
        public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
            Log.e(TAG, "Resolve failed" + errorCode);
            getCallback().ConnectionDone(serviceInfo,false);
        }

        @Override
        public void onServiceResolved(NsdServiceInfo serviceInfo) {
            Log.e(TAG, "Resolve Succeeded. " + serviceInfo);

            if (serviceInfo.getServiceName().equals(mServiceName)) {
                Log.d(TAG, "Same IP.");
                return;
            }
            mService = serviceInfo;
            getCallback().ConnectionDone(serviceInfo,true);
        }
    };
}

public void initializeRegistrationListener() {
    mRegistrationListener = new NsdManager.RegistrationListener() {

        @Override
        public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
            mServiceName = NsdServiceInfo.getServiceName();
            discoverServices();

        }
        
        @Override
        public void onRegistrationFailed(NsdServiceInfo arg0, int arg1) {
        }

        @Override
        public void onServiceUnregistered(NsdServiceInfo arg0) {
        }
        
        @Override
        public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
        }
        
    };
}