【问题标题】:Address already in use (bind failed)地址已在使用中(绑定失败)
【发布时间】:2018-04-01 02:21:51
【问题描述】:

我正在使用这两个 java 源在 2 台 PC(linux 和 mac)之间交换文件。 该问题仅在 Linux 上显示。

我在一个我记得更多次的线程中使用这两个代码。

但我有这个错误:地址已在使用中(绑定失败)。 我在网上和这个论坛上搜索过,问题是 TCP 连接仍然处于活动状态,所以有一个名为 setReuseAddress(true) 的类服务器套接字的函数,它允许我重用地址。我在实例化 ServerSocket 后调用此函数,但问题仍然存在。 我该如何解决这个问题?

[编辑] 服务器

{

        final int SOCKET_PORT = 13267;
        final String FILE_TO_SEND = "/Users/jo/Desktop/cryptedSymmetric.key";
        boolean flag = true;
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        OutputStream os = null;
        ServerSocket servsock = null;
        Socket sock = null;

        try {
            servsock = new ServerSocket(); // create unbound ServerSocket
            servsock.setReuseAddress(true);
            servsock.bind(new InetSocketAddress(SOCKET_PORT));

            // while (flag) {
            System.out.println("SO_REUSEADDRESS is enabled: " + servsock.getReuseAddress());
            System.out.println("Waiting client B...");
            try {
                sock = servsock.accept();
                System.out.println("Connection : " + sock);
                // send file
                File myFile = new File(FILE_TO_SEND);
                byte[] mybytearray = new byte[(int) myFile.length()];
                fis = new FileInputStream(myFile);
                bis = new BufferedInputStream(fis);
                bis.read(mybytearray, 0, mybytearray.length);
                os = sock.getOutputStream();
                System.out.println("Invio del file " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)");
                os.write(mybytearray, 0, mybytearray.length);
                os.flush();
                System.out.println("Done.");
                flag = false;
            } finally {
                if (bis != null)
                    bis.close();
                if (os != null)
                    os.close();
                if (sock != null)
                    sock.close();
            }
            // }
        } finally {
            if (servsock != null)
                servsock.close();

            return flag;
        }
    }

编辑客户

{
        int SOCKET_PORT = 0;
        SOCKET_PORT = 13267;
        // final String SERVER = "192.168.1.2";
        final String FILE_TO_RECEIVED = "/Users/jo/Desktop/publicB.key";
        final int FILE_SIZE = 6022386;
        boolean flag = true;

        int bytesRead;
        int current = 0;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        Socket sock = null;
        try {
            sock = new Socket(address.getHostAddress(), SOCKET_PORT);
            System.out.println("Connessione...");

            // receive file
            byte[] mybytearray = new byte[FILE_SIZE];
            InputStream is = sock.getInputStream();
            fos = new FileOutputStream(FILE_TO_RECEIVED);
            bos = new BufferedOutputStream(fos);
            // bytesRead = is.read(mybytearray, 0, mybytearray.length);
            // current = bytesRead;
            int count;
            while ((count = is.read(mybytearray)) > 0) {
                bos.write(mybytearray, 0, count);
            }



            bos.flush();
            System.out.println("File " + FILE_TO_RECEIVED + " scaricato (" + current + " bytes letti)");
            flag = false;
        } finally {
            if (fos != null)
                fos.close();
            if (bos != null)
                bos.close();
            if (sock != null)
                sock.close();

            return flag;

        }

    }

【问题讨论】:

    标签: java linux sockets tcp bind


    【解决方案1】:

    我在 ServerSocket 实例化后调用了这个函数,但问题仍然存在。

    那是因为你打电话太晚了。您应该已经观察到在调用之前引发了异常。您需要将创建与绑定分开:

    servsock = new ServerSocket(); // create unbound ServerSocket
    servsock.setReuseAddress(true);
    servsock.bind(new InetSocketAddress(SOCKET_PORT));
    

    请注意,您的复制代码两端应相同,而不是像您使用的任何一个版本一样,这会出现各种问题和谬误:

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    

    【讨论】:

    • 我已经修改了代码(复制代码(客户端)和服务器),但问题仍然存在,你能看到新代码 EJP 吗?它第一次有效,但第二次无效。我听从了你的指示.....
    • 你想创建 两个 吗?你不能那样做。
    • 我必须将文件(密钥)从 A 发送到 B,B 必须将其密钥发送给 A。所以我创建了 2 个连接(因为我不太了解机制)。它第一次工作,但是当我重新启动线程时,我只在 LINUX 上遇到这个问题(因为端口仍然打开)
    • 如果您要关闭并重新打开服务器套接字,请不要这样做。让它保持打开状态或过程的生命周期。
    • 我有一台 Mac 和一台笔记本电脑。我第一次将文件从笔记本电脑发送到 mac(mac 是客户端,笔记本电脑是服务器)。我关闭了连接,第二次笔记本电脑是客户端,mac 是服务器,所以 mac 将文件发送到笔记本电脑(是文件交换)。所以在这项工作之后,我需要重新启动调用这个方法的线程......但它不起作用......在mac上没有这个问题,但在linux上是的,我看到了错误。是否有可能只使用一个连接并像点对点连接一样交换文件?
    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2013-12-02
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多