使用NsdManager连接多个设备

时间:2015-09-21 12:18:27

标签: java android

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

问题

  • Everthing工作正常还在两台设备之间传输消息但出现问题当我连接两台以上的设备时。

要求

  • 我想连接两台设备并在所有连接的设备中共享数据。

我的代码简要说明

这里我有两个类ChatConnection和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);
}

我正在制作一个Custome适配器,用于列出我网络中的所有可用设备。

  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;

    }
}

我已经完成以下正确连接

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) {
        }

    };
}

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

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

我使用this Code Referance创建此应用程序。

谢谢,

Onik答案。

  • 假设我有3个设备A1 A2和A3。当所有设备成功注册到网络并相互显示设备时。A1是请求连接A2而不是A2弹出接受连接或拒绝如果A2连接连接比这两个设备连接成功.Durinng此会话A3也想要与A2连接,而不是A3请求连接A2而不是再次A2获取弹出连接。 比出现问题 虽然A2 Tapped on Connect按钮比以前的连接会损失。 但是当A3与A2连接时,我对以前连接的要求仍然存在。

我希望你能解决我的问题。 和 在logCat中,什么都不会发生。而创建新的连接logcat将显示与我们在Previous连接时连接时相同。

0 个答案:

没有答案