【问题标题】:How to transfer files from one computer to another over the network using Java?如何使用 Java 通过网络将文件从一台计算机传输到另一台计算机?
【发布时间】:2009-07-10 12:44:28
【问题描述】:

我需要一个简单的应用程序,最好是跨平台的应用程序,它可以在两台计算机之间发送文件。

它只需要接受和发送文件,并显示一个进度条。我可以使用哪些应用程序或如何编写一个?

【问题讨论】:

  • 你是推还是拉文件?上传还是下载?

标签: java file networking


【解决方案1】:

发送和接收文件

文件的发送和接收基本上分解为两段简单的代码。

接收代码:

ServerSocket serverSoc = new ServerSocket(LISTENING_PORT);

Socket connection = serverSoc.accept();

// code to read from connection.getInputStream();

发送代码:

File fileToSend;
InputStream fileStream = new BufferedInputStream(fileToSend);

Socket connection = new Socket(CONNECTION_ADDRESS, LISTENING_PORT);
OutputStream out = connection.getOutputStream();

// my method to move data from the file inputstream to the output stream of the socket
copyStream(fileStream, out);

当他们想要发送文件时,发送代码将在发送代码的计算机上运行。

接收代码需要放在一个循环中,这样每当有人想连接服务器时,服务器就可以处理请求,然后返回等待 serverSoc.accept()。

为了允许在两台计算机之间发送文件,每台计算机都需要运行服务器(接收代码)来监听传入的文件,并且它们都需要在想要发送文件时运行发送代码。

进度条

Swing 中的JProgressBar 很容易使用。但是,让它正常工作并显示文件传输的当前进度稍微困难一些。

要让进度条显示在表单上,​​只需将其放到JFrame 上,或许还可以设置setIndeterminate(false),这样它就表明您的程序正在运行。

要正确实现进度条,您需要创建自己的SwingWorker 实现。 Java 教程在他们的lesson in concurrency 中有一个很好的例子。

不过,这本身就是一个相当困难的问题。如果您需要更多帮助,我建议您在自己的问题中提出这个问题。

【讨论】:

  • @jjinguy 如果计算机不在局域网中,我们应该为 CONNECTION_ADDRESS 设置什么 IP 地址?例如,我的外部 IP 地址是 1.2.3.4,但如果您将 1.2.3.4 作为 CONNECTION_ADDRESS,路由器如何知道将数据包转发到哪台计算机(在我的家庭网络中)?
  • @Pacerier 您的路由器应该为您处理地址转换。
  • @jjinguy,是的,但是发件人应该如何知道将数据包发送到的哪个端口以便正确路由?更多关于superuser.com/questions/483033/…
  • @Pacerier 我相信它应该与您在套接字上指定的端口相同。不幸的是,我不是网络专家,所以我无法提供更多信息。
  • @jjinguy,假设Router-A通过端口30000(预先配置)向Router-B发送一个数据包,Router-B收到了这个数据包,但是它怎么知道这个数据包要转发到计算机 A,而不是计算机 B?
【解决方案2】:

Woof 是一个很酷的 Python 脚本,可能对你有用:

http://www.home.unix-ag.org/simon/woof.html

【讨论】:

    【解决方案3】:

    我强烈考虑使用 FTP。 Apache 有一个 FTP client 和一个 server

    编辑:spdenne 对 HTTP 的建议也不错,尤其是如果每个人都有 Java 6。如果没有,您可以使用 Tiny Java Web Server 之类的东西。

    【讨论】:

    • 是的,我可以......但我想要一些尽可能简单的东西,这样初学者就不需要安装任何东西......除了安装我认为大多数人已经拥有的 Java。
    • 您肯定需要 JRE 之上的代码。唯一的问题是您是自己编写代码还是使用现有库。如果你自己写,它可能是非标准的,你必须自己维护它。
    【解决方案4】:

    您可以使用 Java 中的 Socket 编程来编写一个。您将需要编写一个服务器和一个客户端程序。服务器会使用 ServerSocket 来监听连接,而客户端会使用 Socket 连接到指定端口上的服务器。

    这里有一个教程:http://www.javaworld.com/jw-12-1996/jw-12-sockets.html

    【讨论】:

    • 为什么不呢?做起来非常快,而且是用 Java 编写的。
    • 一开始做起来很快(而且学习经验很好),但在生产中维护起来很慢。
    【解决方案5】:

    Sun 的 Java 6 包括一个轻量级的 HTTP server API 和实现。您可以很容易地使用它来提供您的文件,使用 URLConnection 来获取它。

    【讨论】:

      【解决方案6】:

      查看this 教程,这是一个非常基本的示例。您可能还希望在发送实际文件之前发送控制标头,其中包含文件大小、文件名等。

      或者,将其基于现有协议,例如 this 项目。

      【讨论】:

      • 谢谢,这正是我想要的。
      【解决方案7】:

      你能在你的(一台)机器上安装 FTP 服务器吗?

      如果可以,您只需使用 FTP 客户端(例如 FileZilla,它有一个进度条)。

      【讨论】:

        【解决方案8】:

        两个流行的应用程序是“scp”和“rsync”。这些在 Linux 上是标准的,通常在 Unix 上可用,并且可以在 cygwin 下的 Windows 上运行,尽管您可能能够找到也可以做到这一点的 Windows 原生应用程序。 (PuTTY 可以作为 SCP 客户端)。

        对于任何类型的 pc 到 pc 文件传输,您需要在目标 PC 上安装一个侦听器。这可以是守护程序应用程序(或 Windows 系统进程),也可以是 Unix 风格的“超级服务器”,配置为在有人联系侦听端口时加载并运行实际的文件复制应用程序。

        SCP 和其中一种 rsync 模式确实需要某种远程登录功能。 Rsync 还可以发布它将处理目录的资源。由于 Windows“远程登录”的概念不像在 Linux 下那样成熟,这可能更可取。此外,它还限制了对目标机器上定义的源/目标的远程访问,而不是允许访问文件系统的任何(授权)部分。

        【讨论】:

          【解决方案9】:

          更有效地通过网络传输。看看this article,它解释了通过零拷贝实现高效数据传输

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-07
            • 1970-01-01
            相关资源
            最近更新 更多