How to resolve java.net.BindException: communication failed: EADDRINUSE (address already in use)

I am transferring files using socket from Android to Android using WiFi Direct. I am starting a service to send files in the following 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);

      

Service 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<File> filesList = new ArrayList<File>();
            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();
                }
            }
        }
    }
}

      

File sending method:

public void send(ArrayList<File> 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();
    }
}

      

Incoming party 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<File> files = new ArrayList<File>(number);
            System.out.println("Number of Files to be received: " + number);
            //read file names, add files to arraylist
            for (int i = 0; i < 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 > 0 && (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();
                }
            }
        }
    }

      

All code works fine and when I run the app in both apps for the first time, the files are transferred successfully. But the second time, the file transfer failed on the receiving side,

            ServerSocket serverSocket = new ServerSocket();
            serverSocket.setReuseAddress(true);
            serverSocket.bind(new InetSocketAddress(8988));

      

Third line from the top of the serverSocket.bind code (new InetSocketAddress (8988)); java.net.BindException exception: communication failed: EADDRINUSE (address already in use) How do I resolve this exception? Any suggestion will be greatly appreciated. Thanks to

+3


source to share


1 answer


I start the service every time to send files but not stop them, is there a need to stop the service before sending again?

Yes, of course it is, otherwise it is still listening on port 8988, so you cannot start another instance.



if so what is the best way to do it?

Kill the old one. But why do you run it when it is already running?

+5


source







All Articles