title: How to resolve java.net.BindException: bind failed: EADDRINUSE (Address already in use)
body: <p>I am transfer files using socket from Android to Android using WiFi Direct. I am starting service for sending files in following code</p>
  
  <pre><code>        String[] filesPath = data.getStringArrayExtra("all_path");
          Intent serviceIntent = new Intent(getActivity(), FileTransferService.class);
          serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE);
          serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, filesPath);
          serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, info.groupOwnerAddress.getHostAddress());
          serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988);
          getActivity().startService(serviceIntent);
  </code></pre>
  
  <p>Service code is:</p>
  
  <pre><code> @Override
  protected void onHandleIntent(Intent intent)
  {
  
      Context context = getApplicationContext();
      if (intent.getAction().equals(ACTION_SEND_FILE))
      {
          //String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);
          String[] files = intent.getExtras().getStringArray(EXTRAS_FILE_PATH);
          String host = intent.getExtras().getString(EXTRAS_GROUP_OWNER_ADDRESS);
          Socket socket = new Socket();
          int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT);
  
          try
          {
              Log.d(WiFiDirectActivity.TAG, "Opening client socket - ");
              socket.bind(null);
              socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);
  
              Log.d(WiFiDirectActivity.TAG, "Client socket - " + socket.isConnected());
  
              ArrayList&lt;File&gt; filesList = new ArrayList&lt;File&gt;();
              for (String file : files)
              {
                  filesList.add(new File(Uri.parse("file://" + file).getPath()));
              }
              send(filesList, socket);
          }
          catch (IOException e)
          {
              e.printStackTrace();
              Log.e(WiFiDirectActivity.TAG, e.getMessage());
          }
          finally
          {
  
              if (socket.isConnected())
              {
                  try
                  {
                      socket.close();
                  }
                  catch (IOException e)
                  {
                      // Give up
                      e.printStackTrace();
                  }
              }
          }
      }
  }
  </code></pre>
  
  <p>Sending files method:</p>
  
  <pre><code>public void send(ArrayList&lt;File&gt; files, Socket socket)
  {
      try
      {
          //DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
          DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
          System.out.println(files.size());
          //write the number of files to the server
          dos.writeInt(files.size());
          dos.flush();
          //write file names
          for (File file1 : files)
          {
              dos.writeUTF(file1.getName());
              dos.flush();
          }
          //buffer for file writing, to declare inside or outside loop?
          int n;
          byte[] buf = new byte[1024 * 8];
          //outer loop, executes one for each file
          for (File file : files)
          {
              System.out.println(file.getName());
              FileInputStream fis = new FileInputStream(file);
              dos.writeLong(file.length());
              dos.flush();
              while ((n = fis.read(buf)) != -1)
              {
                  dos.write(buf, 0, n);
                  dos.flush();
              }
          }
          dos.close();
      }
      catch (IOException e)
      {
          e.printStackTrace();
      }
  }
  </code></pre>
  
  <p>Receiving side code is:</p>
  
  <pre><code>@Override
      protected String doInBackground(Void... params)
      {
          try
          {
              ServerSocket serverSocket = new ServerSocket();
              serverSocket.setReuseAddress(true);
              serverSocket.bind(new InetSocketAddress(8988));
              //ServerSocket serverSocket = new ServerSocket(8988);
              Log.d(WiFiDirectActivity.TAG, "Server: Socket opened");
              Socket client = serverSocket.accept();
              Log.d(WiFiDirectActivity.TAG, "Server: connection done");
              receive(client);
              return "";
          }
          catch (IOException e)
          {
              e.printStackTrace();
              return null;
          }
      }
  
      public void receive(Socket socket)
      {
          try
          {
              DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
              //read the number of files from the client
              int number = dis.readInt();
              ArrayList&lt;File&gt; files = new ArrayList&lt;File&gt;(number);
              System.out.println("Number of Files to be received: " + number);
              //read file names, add files to arraylist
              for (int i = 0; i &lt; number; i++)
              {
                  File file = new File(dis.readUTF());
                  files.add(file);
              }
              int n;
              byte[] buf = new byte[1024 * 8];
  
              for (File file : files)
              {
                  System.out.println("Receiving file: " + file.getName());
                  final File f = new File(Environment.getExternalStorageDirectory() + "/WiFiDirect/" + file.getName());
                  File dirs = new File(f.getParent());
                  if (!dirs.exists())
                  {
                      dirs.mkdirs();
                  }
                  f.createNewFile();
                  FileOutputStream fos = new FileOutputStream(f);
                  long fileSize = dis.readLong();
                  while (fileSize &gt; 0 &amp;&amp; (n = dis.read(buf, 0, (int) Math.min(buf.length, fileSize))) != -1)
                  {
                      fos.write(buf, 0, n);
                      fileSize -= n;
                  }
                  fos.close();
              }
          }
          catch (IOException e)
          {
              e.printStackTrace();
          }
          finally
          {
              if (socket.isConnected())
              {
                  try
                  {
                      socket.close();
                  }
                  catch (IOException e)
                  {
                      // Give up
                      e.printStackTrace();
                  }
              }
          }
      }
  </code></pre>
  
  <p>All the code is working fine and when I launch app on both app for first time, files transferred successfully. But in second time files transferring failed on receiving side, </p>
  
  <pre><code>            ServerSocket serverSocket = new ServerSocket();
              serverSocket.setReuseAddress(true);
              serverSocket.bind(new InetSocketAddress(8988));
  </code></pre>
  
  <p>Third line from above code serverSocket.bind(new InetSocketAddress(8988)); throws exception
  java.net.BindException: bind failed: EADDRINUSE (Address already in use)
  How to resolve this exception? Any suggestion will be appreciated.
  Thanks</p>