简体   繁体   English

如何解决java.net.BindException:绑定失败:EADDRINUSE(地址已在使用中)

[英]How to resolve java.net.BindException: bind failed: EADDRINUSE (Address already in use)

I am transfer files using socket from Android to Android using WiFi Direct. 我使用套接字从Android到Android使用WiFi Direct传输文件。 I am starting service for sending files in 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 is: 服务代码是:

 @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();
                }
            }
        }
    }
}

Sending files 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();
    }
}

Receiving side code is: 接收方代码是:

@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 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, 但在第二次文件传输失败的接收端,

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

Third line from above code serverSocket.bind(new InetSocketAddress(8988)); 代码serverSocket.bind(new InetSocketAddress(8988))上面的第三行; throws exception java.net.BindException: bind failed: EADDRINUSE (Address already in use) How to resolve this exception? 抛出异常java.net.BindException:绑定失败:EADDRINUSE(地址已在使用中)如何解决此异常? Any suggestion will be appreciated. 任何建议将不胜感激。 Thanks 谢谢

I am starting service every time to send files but not stop it, is there any need to stop the service before sending again? 我每次都开始服务发送文件而不是停止它,是否需要在再次发送之前停止服务?

Yes, of course there is, otherwise it is still listening at port 8988, so you can't start another instance. 是的,当然有,否则它仍在侦听端口8988,所以你无法启动另一个实例。

if yes then what is the best way to do that? 如果是,那么最好的方法是什么?

Kill the old one. 杀死旧的。 But why are you starting it when it's already running? 但是,为什么你在它已经运行时启动它?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.net.BindException:EADDRINUSE(地址已在使用中) - java.net.BindException: EADDRINUSE (Address already in use) java.net.BindException:绑定失败:EADDRINUSE - java.net.BindException: bind failed: EADDRINUSE 如何解决“java.net.BindException:地址已在使用:JVM_Bind”错误? - How do I resolve the "java.net.BindException: Address already in use: JVM_Bind" error? java.net.BindException:地址已在使用中:JVM_Bind - java.net.BindException: Address already in use: JVM_Bind java.net.BindException:已在使用的地址:无法绑定 - java.net.BindException: Address already in use: Cannot bind 无法启动namenode:java.net.BindException:地址已在使用中 - Failed to start the namenode: java.net.BindException: Address already in use 遇到java.net.BindException:服务器客户端套接字应用程序上已在使用的地址(绑定失败) - Running into an java.net.BindException: Address already in use (Bind failed) on server- client socket app java.net.BindException:地址已在使用中 - java.net.BindException: Address already in use 如何解决java.net.BindException:地址已在使用中 - How to solve java.net.BindException: Address already in use 如何避免java.net.BindException:地址已在使用中 - How to avoid java.net.BindException: Address already in use
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM