Java TCP 文件传输应用程序

标签 java file tcp udp client-server

您好,在此先感谢您花时间阅读。我正在尝试使用 TCP 开发一个简单的 Java 文件传输应用程序。到目前为止,使用我的客户端和服务器类,我已经设法向它添加了一个有效的上传方法(将文件上传到运行服务器的计算机)。

我对这方面还没有经验,所以我会慢慢来。我还需要添加一个下载选项(从服务器获取文件),列出服务器中的所有文件,以及一个允许我从服务器删除任何文件的选项。

对于服务器和客户端,我都使用特定的默认文件夹(在本例中为 C:/Sharedfolder)。目前我的问题是:

  1. 在我当前的服务器代码中,上传到它的文件被重命名为“newfile”。我怎样才能将文件名更改为类似“oldfile_new”的名称(oldfile 是实际原始文件的名称)?
  2. 使用下面我当前的服务器代码,我可以制作一个客户端类来从服务器下载文件吗?我该怎么做?上传部分对我来说很有意义,但我仍在尝试找出从服务器下载/列出文件的方法。
  3. 我目前使用的是预定义的主机 IP,但我最终需要修改应用程序,以便客户端发出 UDP 广播以找到专用网络上的服务器。任何人都可以指出如何执行此操作的任何方向吗?

我目前的服务器代码如下:

public class Server {

public static void main(String[] args) throws IOException {

    ServerSocket serverSocket = null;

    try {
        serverSocket = new ServerSocket(4555);
    } catch (IOException ex) {
        System.out.println("Can't setup server on this port number.\n");
    }

    Socket socket = null;
    InputStream is = null;
    OutputStream fos = null;
    BufferedOutputStream bos = null;
    int bufferSize = 0;
    System.out.println("Ready...");

    try {
        socket = serverSocket.accept();
    } catch (IOException ex) {
        System.out.println("Can't accept client connection.\n");
    }

    try {
        is = socket.getInputStream();

        bufferSize = socket.getReceiveBufferSize();
        System.out.println("Buffer size: " + bufferSize);
    } catch (IOException ex) {
        System.out.println("Can't get socket input stream.\n");
    }

    try {
        fos = new FileOutputStream("C:\\Sharedfolder\\newfile");
        bos = new BufferedOutputStream(fos);

    } catch (FileNotFoundException ex) {
        System.out.println("File not found.\n");
    }

    byte[] bytes = new byte[bufferSize];

    int count;

    while ((count = is.read(bytes)) > 0) {
        bos.write(bytes, 0, count);
    }

    bos.flush();
    bos.close();
    is.close();
    socket.close();
    serverSocket.close();

}

任何帮助将不胜感激。谢谢:)

最佳答案

许多工具已经可以做到这一点,但这是一个很好的学习练习。

通常,您不仅需要传输数据,还需要传输有关文件本身的一些信息:

  1. 将文件名从服务器发送到客户端
  2. 将文件的大小从服务器发送到客户端
  3. 将文件的数据发送给客户端。客户端可以使用步骤中收到的大小来计算进度
  4. 将文件的修改时间从服务器发送到客户端。客户端用修改时间标记接收到的文件

所有这些都可以通过您实例化的流对象发送,您只需确保客户端/服务器之间的事件顺序是正确的。

关于Java TCP 文件传输应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137223/

相关文章:

java - GridBagLayout gridheight 约束不影响结果

java - onComplete() 在成功下载 pdf (Rxjava) 后永远不会被调用,但在使用 AsyncTask 时可以工作

file - 戈兰 : Getting "fatal error: all goroutines are asleep - deadlock" on waitGroup. 等待()

java - 使用外部文件的空指针异常

c - 在c中通过套接字发送结构

c - 套接字编程将多个客户端连接到一台服务器并列出它们 C

java - 链表实现java

Java I/O 到 .txt 文件

node.js - Node (或其他语言)中基于网络的应用程序是否有 'middleware' 库?

java - 将本地目录的内容复制到hdfs中的目录