title: Connection between android and java server using Network service discover
body: <p>I'm working on a connection between an android application and a server in java, I use <a href="http://jmdns.sourceforge.net/" rel="nofollow noreferrer">Jmdns</a> on the server and the <a href="https://developer.android.com/training/connect-devices-wirelessly/nsd" rel="nofollow noreferrer">Discover Network Service</a> on android to perform the communication. However the Android keeps always looking for a service to connect and never finds my service. Both are on the same network (not localhost).</p>
  
  <p>I have taken as an example the question answered here: 
  <a href="https://stackoverflow.com/questions/32190749/communication-between-java-server-and-android-client-using-network-service-disco">communication between Java server and Android client using Network Service Discovery</a></p>
  
  <p><strong>Server Code</strong></p>
  
  <pre><code>public class Server {
  
  public static String mServiceName = "NsdApp";
  public static final String SERVICE_TYPE = "_http._tcp.";
  
  static ServerSocket mServerSocket;
  
  
  public static void main(String[] args) throws IOException {
  
      System.out.println("START");
  
  try {
      mServerSocket = new ServerSocket(0);
  } catch (IOException e) {
      System.out.println("ServerSocket(0) FAILED");
  }
  
  int mPort = mServerSocket.getLocalPort();
  
  JmDNS jmdns = JmDNS.create();
  ServiceInfo info = ServiceInfo.create(SERVICE_TYPE, mServiceName, mPort, "B");
  jmdns.registerService(info);
  
  System.out.println("REGISTERED");
  
  jmdns.close();
  
  Thread mReceiveMessage = new Thread(new ReceiveMessage());
  mReceiveMessage.start();
  
  System.out.println("END"); }
  
  public static class ReceiveMessage implements Runnable {
  
  public void run() {
      System.out.println("WAITING_FOR_MESSAGE");
      try {
  
          Socket clientSocket = mServerSocket.accept(); 
          InputStreamReader inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
          BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
          String message = bufferedReader.readLine();
          System.out.println(message);
  
          bufferedReader.close();
          inputStreamReader.close();
          clientSocket.close();
          System.out.println("END_THREAD");
  
      } catch (IOException ex) {
          System.out.println("Problem in message reading");
      } } } }
  </code></pre>
  
  <p><strong>Cliente Code</strong></p>
  
  <pre><code>    public class MainActivity extends Activity {
  
  public static final String TAG = "NSD_DISCOVER";
  public static final String SERVICE_TYPE = "_http._tcp.";
  NsdManager.DiscoveryListener mDiscoveryListener;
  NsdManager.ResolveListener mResolveListener;
  NsdManager mNsdManager;
  int port;
  InetAddress host;
  
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      Log.v(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 onDiscoveryStarted(String regType) {
              Log.v(TAG, "onDiscoveryStarted Service discovery started");
          }
  
          @Override
          public void onServiceFound(NsdServiceInfo service) {
              if (!service.getServiceType().equals(SERVICE_TYPE)) {
                  Log.v(TAG, "onServiceFound Unknown Service Type: " + service.getServiceType());
              } else {
                  Log.v(TAG, "onServiceFound Known Service Type: " + service.getServiceType());
                  mNsdManager.resolveService(service, mResolveListener);
              }
          }
  
          @Override
          public void onServiceLost(NsdServiceInfo service) {
              Log.e(TAG, "service lost" + service);
          }
  
          @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, "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&lt;Void, Void, Void&gt; {
  
      @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 (UnknownHostException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
          return null;
      }
  }
  </code></pre>