首页 > 解决方案 > 将文件从服务器传输到客户端时出现无限循环和损坏的文件

问题描述

我有一个使用 Sockets 的项目要做。我能够将数据从客户端传输到服务器,但必须有一个错误,因为我没有关闭套接字。有没有办法解决这个问题?

此外,主要问题是尝试从服务器下载文件时。它最终被破坏了。我还怀疑我的程序必须能够处理从服务器到客户端的多个文件传输,反之亦然。启动传输时,套接字已经打开。

下面是从客户端下载的代码(在客户端的应用程序中选择下载选项,然后在服务器中处理):

try {
    out.writeUTF(entree);
    final int TEMPS_DE_PAUSE = 5000;
    Thread.sleep(TEMPS_DE_PAUSE);

    FileOutputStream fos = new FileOutputStream(new File(uploadPath + "\\" + name));
    BufferedOutputStream outBuffer = new BufferedOutputStream(fos);
    byte[] buffer = new byte[1024];
    int count;
    InputStream inputStream = socket.getInputStream();
    while((count = inputStream.read(buffer)) >= 0){
        fos.write(buffer, 0, count);
    }
    fos.close();
    System.out.println("Tentative de telechargement du serveur reussie!");
}
catch(Exception e) {
    System.out.println("Une erreur lors de la reception du serveur est survenue...");
}

这是服务器部分:

try {
    String path = currentPath + "\\" + name;
    /*
     * Source: https://github.com/WittCode/java-send-and-download-a-file/blob/main/Client/src/Client.java
     */
    // S'assurer que la grandeur est assez grande pour des gros fichiers!!!
    File fichierAEnvoyer = null;

    try {
        fichierAEnvoyer = new File(path);
    }
    catch(Exception e) {
        out.writeUTF("Le fichier n'existe pas! Veuillez entrer son nom de nouveau!");
    }

    out.writeUTF("Tentative de televersement du serveur au client.");

    final short TAILLE_OCTET_MAXIMUM = 1024;
    byte[] buffer = new byte[TAILLE_OCTET_MAXIMUM];
    int count;

    OutputStream outputStream = socket.getOutputStream();
    BufferedInputStream input = new BufferedInputStream(new FileInputStream(fichierAEnvoyer));
    while ((count = input.read(buffer)) >= 0) {
        outputStream.write(buffer, 0, count);
        outputStream.flush();
    }
}catch(Exception e) {
    out.writeUTF("Une erreur est survenue lors du televersement du serveur au client.");
    e.printStackTrace();
}

任何关于为什么存在无限循环的帮助将不胜感激。

此外,如果网上有关于进行文件传输的“典型方式”的资源,我愿意咨询它们,因为我似乎找到了不同的方式。

标签: loopssocketsservertcpdata-transfer

解决方案


当文件传输完成时,您的服务器不会向客户端指示任何内容,因此客户端不知道何时停止读取,它只是继续读取直到断开连接或出错。

处理此问题的一种方法是让服务器在发送文件字节之前发送文件大小,然后客户端可以先读取大小,然后再读取指定的字节数。


推荐阅读