Long story short, my problem is the same of that question.
Even if I dont close the jmNDS service my client only discover the server when it start first. If not it only discover my printer (That should have another protocol by the way)
Server.java
public class Server {
public static void main(String[] args) {
System.out.println("--- Starting Enjoy Your Meal Server Service ---");
Thread serverThread = new Thread(new ClientCoection());
serverThread.start();
}
}
ClientCoection.java
public class ClientCoection implements Ruable {
private static final String mServiceName = "EnjoyYourMeal";
private static final String SERVICE_TYPE = "_http._tcp.local";
private ServerSocket mServerSocket;
private JmDNS jmDNS;
public ClientCoection() {
try {
System.out.println("-- Creating Server Socket...");
mServerSocket = new ServerSocket(0); // Take the next port available
} catch (IOException e) {
System.err.println("Error while creating Server Socket");
System.err.println(e.getMessage());
}
int mPort = mServerSocket.getLocalPort(); // Get the port taken
System.out.println("-- Creating jmDNS service...");
try {
jmDNS = JmDNS.create(); // Create jmDNS service
} catch (IOException e) {
System.err.println("Error while creating jmDNS service");
System.err.println(e.getMessage());
}
System.out.println("-- Creating jmDNS info...");
ServiceInfo info = ServiceInfo.create(SERVICE_TYPE, mServiceName, mPort, "B"); // Create info about the service
System.out.println("-- Registering jmDNS service...");
try {
jmDNS.registerService(info); // Register the service
} catch (IOException e) {
System.err.println("Error while registering jmDNS service");
System.err.println(e.getMessage());
}
System.out.println("-- jmDNS service registered: ntHost: " + jmDNS.getHostName() + "ntPort: " + mPort);
};
@Override
public void run() {
Socket clientSocket;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
System.out.println("-- Waiting for message...");
try {
clientSocket = mServerSocket.accept();
System.out.println("Message received");
inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
System.out.println(bufferedReader.readLine());
bufferedReader.close();
inputStreamReader.close();
clientSocket.close();
jmDNSClose();
System.out.println("-- End Server Service");
} catch (IOException e) {
System.err.println("Error while accepting client coection");
System.err.println(e.getMessage());
}
}
private void jmDNSClose() throws IOException {
System.out.println("Unregistering jmDNS service...");
jmDNS.unregisterAllServices();
jmDNS.close();
}
}
Client
public class MainActivity extends AppCompatActivity {
public static final String TAG = "NSD_DISCOVER";
public static final String SERVICE_TYPE = "_http._tcp.";
public static final String SERVICE_NAME = "EnjoyYourMeal";
NsdManager mNsdManager;
NsdManager.DiscoveryListener mDiscoveryListener;
NsdManager.ResolveListener mResolveListener;
int port;
InetAddress host;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate");
mNsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE);
initializeResolveListener();
initializeDiscoveryListener();
mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}
public void initializeDiscoveryListener() {
mDiscoveryListener = new NsdManager.DiscoveryListener() {
@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);
}
@Override
public void onDiscoveryStarted(String serviceType) {
Log.d(TAG, "onDiscoveryStarted Service discovery started");
}
@Override
public void onDiscoveryStopped(String serviceType) {
Log.i(TAG, "Discovery stopped: " + serviceType);
}
@Override
public void onServiceFound(NsdServiceInfo serviceInfo) {
Log.d(TAG, "Service discovery success: " + serviceInfo);
if (!serviceInfo.getServiceType().equals(SERVICE_TYPE)) {
Log.d(TAG, "onServiceFound Unknown Service Type: " + serviceInfo.getServiceType());
} else if ( serviceInfo.getServiceName().contains(SERVICE_NAME)) {
mNsdManager.resolveService(serviceInfo, mResolveListener);
}
}
@Override
public void onServiceLost(NsdServiceInfo serviceInfo) {
Log.e(TAG, "service lost" + serviceInfo);
}
};
}
public void initializeResolveListener() {
mResolveListener = new NsdManager.ResolveListener() {
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
Log.e(TAG, "onResolveFailed Resolve failed" + errorCode);
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
Log.v(TAG, "onServiceResolved Resolve Succeeded. " + serviceInfo);
port = serviceInfo.getPort();
host = serviceInfo.getHost();
SendMessage sendMessageTask = new SendMessage();
sendMessageTask.execute();
}
};
}
private class SendMessage extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
Socket client;
PrintWriter printwriter;
client = new Socket(host, port);
printwriter = new PrintWriter(client.getOutputStream(), true);
printwriter.write("hello world");
printwriter.flush();
printwriter.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
retu null;
}
}
}
On Fail:
Android Monitor
D/NSD_DISCOVER: onCreate
D/NSD_DISCOVER: onDiscoveryStarted Service discovery started
D/NSD_DISCOVER: Service discovery success: name: Canon MG3500 series, type: _http._tcp., host: null, port: 0
Java Console
--- Starting Enjoy Your Meal Server Service ---
-- Creating Server Socket...
-- Creating jmDNS service...
-- Creating jmDNS info
-- Registering jmDNS service...
-- jmDNS service registered:
Host: Camera-Fede.local.
Port: 58441
-- Waiting for message...
On success
Android Monitor
D/NSD_DISCOVER: onCreate
D/NSD_DISCOVER: onDiscoveryStarted Service discovery started
D/NSD_DISCOVER: Service discovery success: name: Canon MG3500 series, type: _http._tcp., host: null, port: 0
D/NSD_DISCOVER: Service discovery success: name: EnjoyYourMeal, type: _http._tcp., host: null, port: 0
D/NSD_DISCOVER: onServiceFound Know Service Name: EnjoyYourMeal
V/NSD_DISCOVER: onServiceResolved Resolve Succeeded. name: EnjoyYourMeal, type: ._http._tcp, host: /192.168.1.101, port: 58441
Java Console
--- Starting Enjoy Your Meal Server Service ---
-- Creating Server Socket...
-- Creating jmDNS service...
-- Creating jmDNS info
-- Registering jmDNS service...
-- jmDNS service registered:
Host: Camera-Fede.local.
Port: 58441
-- Waiting for message...
Message received
hello world
Unregistering jmDNS service...
-- End Server Service
