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