我在Android上工作,我需要在我的应用程序中进行少量套接字编程。我想使用NsdManager创建我自己的网络。我在网络中成功注册我的服务并且还与其他设备完成连接。我已成功传输数据介于设备之间。
问题
要求
我的代码简要说明
这里我有两个类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答案。
我希望你能解决我的问题。 和 在logCat中,什么都不会发生。而创建新的连接logcat将显示与我们在Previous连接时连接时相同。