【发布时间】:2009-07-10 12:44:28
【问题描述】:
我需要一个简单的应用程序,最好是跨平台的应用程序,它可以在两台计算机之间发送文件。
它只需要接受和发送文件,并显示一个进度条。我可以使用哪些应用程序或如何编写一个?
【问题讨论】:
-
你是推还是拉文件?上传还是下载?
标签: java file networking
我需要一个简单的应用程序,最好是跨平台的应用程序,它可以在两台计算机之间发送文件。
它只需要接受和发送文件,并显示一个进度条。我可以使用哪些应用程序或如何编写一个?
【问题讨论】:
标签: java file networking
发送和接收文件
文件的发送和接收基本上分解为两段简单的代码。
接收代码:
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 中有一个很好的例子。
不过,这本身就是一个相当困难的问题。如果您需要更多帮助,我建议您在自己的问题中提出这个问题。
【讨论】:
Woof 是一个很酷的 Python 脚本,可能对你有用:
【讨论】:
我强烈考虑使用 FTP。 Apache 有一个 FTP client 和一个 server
编辑:spdenne 对 HTTP 的建议也不错,尤其是如果每个人都有 Java 6。如果没有,您可以使用 Tiny Java Web Server 之类的东西。
【讨论】:
您可以使用 Java 中的 Socket 编程来编写一个。您将需要编写一个服务器和一个客户端程序。服务器会使用 ServerSocket 来监听连接,而客户端会使用 Socket 连接到指定端口上的服务器。
这里有一个教程:http://www.javaworld.com/jw-12-1996/jw-12-sockets.html
【讨论】:
Sun 的 Java 6 包括一个轻量级的 HTTP server API 和实现。您可以很容易地使用它来提供您的文件,使用 URLConnection 来获取它。
【讨论】:
你能在你的(一台)机器上安装 FTP 服务器吗?
如果可以,您只需使用 FTP 客户端(例如 FileZilla,它有一个进度条)。
【讨论】:
两个流行的应用程序是“scp”和“rsync”。这些在 Linux 上是标准的,通常在 Unix 上可用,并且可以在 cygwin 下的 Windows 上运行,尽管您可能能够找到也可以做到这一点的 Windows 原生应用程序。 (PuTTY 可以作为 SCP 客户端)。
对于任何类型的 pc 到 pc 文件传输,您需要在目标 PC 上安装一个侦听器。这可以是守护程序应用程序(或 Windows 系统进程),也可以是 Unix 风格的“超级服务器”,配置为在有人联系侦听端口时加载并运行实际的文件复制应用程序。
SCP 和其中一种 rsync 模式确实需要某种远程登录功能。 Rsync 还可以发布它将处理目录的资源。由于 Windows“远程登录”的概念不像在 Linux 下那样成熟,这可能更可取。此外,它还限制了对目标机器上定义的源/目标的远程访问,而不是允许访问文件系统的任何(授权)部分。
【讨论】:
更有效地通过网络传输。看看this article,它解释了通过零拷贝实现高效数据传输
【讨论】: