【问题标题】:How to transfer a file in a client/server Java application如何在客户端/服务器 Java 应用程序中传输文件
【发布时间】:2023-03-14 05:08:01
【问题描述】:

我目前正在做家庭作业,我完全陷入困境。我在最后一个问题上,我只是不知道如何完成最后一项任务。以下是我必须完成的任务:


  1. 客户端应该 将文件保存在“客户端”中 主目录的子目录。

  2. 测试您的程序。确保它有效 二进制文件,而不仅仅是文本 文件。确保两者都有效 程序在同一台机器上 以及当他们分开时 网络。


到目前为止,当我启动服务器时,它会询问我要使用的端口。然后我启动客户端,它会询问要使用的 IP 和端口。服务器立即发送主目录“服务器”文件夹中的文件列表。然后我用我希望下载的文件号回复客户。这就是我卡住的地方。我似乎找不到任何有关如何执行此操作的信息。因此,正如您在下面发布的代码中看到的那样,我正在尝试使用 FileInputReader 将文件转换为字节数组。然后我将其发送给客户。然后我尝试将 FileOutputReader 接收到的字节数组写入文件。但我似乎找不到正确的方法来做到这一点,或者即使我做得正确。

客户

        int i = 0;
        while(i < 1000){
        String modifiedSentence = inFromServer.readLine();
        System.out.println("From Server: " + modifiedSentence);
        i++;
        }

        while(j < 1000) {
        int byteString = inFromServer.read();
        ArrayList<byte[]> bytes = new ArrayList<byte[]>();
        bytes.add(byteString);
        }
        Integer byteInt = new Integer(byteString);
        FileOutputStream fo = new FileOutputStream(System.getProperty("user.home")+ "/client/text.txt");
        fo.write(byteInt.byteValue());

    }
}

服务器

            byte[] bytes = new byte[1024];
            FileInputStream fi = new FileInputStream(file.toString() + fileArray[userChoiceInt]);
            fi.read(bytes, 0, 1024);
            outToClient.write(bytes, 0, 1024);

        }
    }
}

如果有人可以提供任何建议或正确的类或方法来使用,我将不胜感激。

提前谢谢你。

【问题讨论】:

  • 既然这是作业,你可以使用第三方库吗?您基本上是在重新发明 FTP,Java 中存在有用的 FTP 库。
  • 是的,你是对的,我不能使用任何第三方库。 :(

标签: java sockets network-programming client-server


【解决方案1】:

在不破坏整个事情的情况下,这里有一些提示。

这可以通过使用 Socket(服务器和客户端)轻松完成。使用 byte[] 传输文件将确保您的程序可以同时处理 ascii 和二进制文件。

另一种方法是使用远程方法调用 (RMI) 中的构建。我没有使用这种方法传输文件,但我确信它是可行的。

如果您不知道,获取用户主目录是通过以下调用完成的:System.getProperty("user.home");

【讨论】:

    【解决方案2】:

    您可以查看 Sun (Oracle) 的 tutorial。这应该让您对套接字有一个基本的了解。

    我似乎注意到了,但是,在客户端,您迭代了特定的次数(1000),这不是一个好主意,因为通常,您不知道要发送的文件的大小,教程应该显示这一点以及如何进行适当的更改。此外,您不断在循环中创建结构,因此除了每次都创建新的数据结构之外,您会丢失收到的任何信息,这是低效的。

    您需要做的是从循环外部移动结构的初始化。此外,对于 modifiedSentence 变量,您可能希望将其从字符串更改为 StringBuilder

    【讨论】:

    • 哇,是的,这太可怕了。我每次都在不断地实例化一个新的 ArrayList 的事实确实违背了目的。感谢您指出了这一点。至于 while(i
    • 您应该读取直到套接字返回 -1(如果您正在读取字节)或 null(如果您正在读取字符串)
    【解决方案3】:

    如果您可以为此使用 IO 库,我建议您使用 Netty 或 Mina。这里有一些网络示例:http://jboss.org/netty/documentation.html
    即使您不能使用库,这些也可能有助于了解事情的完成方式。

    【讨论】:

      【解决方案4】:

      你可能不应该在这样的网站上问如何在课堂上做作业。这是不合适的。您的服务器看起来确实不错。不过,您的程序最多只能读取 1024 字节的文件。您应该更详细地查看 java.io.File。您可以使用长度方法来查找文件的长度,这样您就知道要发送多少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多