EOF Исключение в Java при отправке нескольких файлов через соединение с одним сокетом

Я пытаюсь отправить несколько файлов через сокеты Java. После успешного получения первого файла выдается исключение EOFexception. Я не могу понять, что происходит не так. (Все файлы успешно отправлены со стороны отправителя)

Код отправителя:

    sendToServer = new Socket(receiver,port);
    DataOutputStream out = new DataOutputStream(sendToServer.getOutputStream());

    for(File f: file_to_send){

        sendMessage = f.getName() + "\n"+ f.length() + "\n";
        out.writeUTF(sendMessage);

        FileInputStream requestedfile = new FileInputStream(f.getPath());
        System.out.println("file path: "+f.getPath());

        int count;
        byte[] buffer = new byte[8192];
        while ((count = requestedfile.read(buffer)) > 0)
        {
            out.write(buffer, 0, count);
        }

        System.out.println("File transfer completed!! voila! :)");
        requestedfile.close();
    }

    out.close();
    sendToServer.close();

Код получателя:

System.out.println("File Count : " + fileCount);
for (int count =0; count<fileCount; count++){
            String fileName = dis.readUTF();
            int length = Integer.parseInt(fileName.split("\n")[1]);
            fileName = fileName.split("\n")[0];
            System.out.println("File Name : " + fileName);
            System.out.println("Length : " + length);
            System.out.println("File Data : ");
            FileOutputStream fos = new FileOutputStream(new File(fileName));
            int c;
            byte[] buffer = new byte[8192];
            while ((c = dis.read(buffer)) > 0)
            {
                fos.write(buffer, 0, c);
                fos.flush();
            }
            fos.close();
            System.out.println("\nFile received successfully!!! voila !! :)");               
        }

И вывод такой:

Files Count : 2
File Name : Belly Dance.3gp
Length : 15969978
File Data : 

File received successfully!!! voila !! :)
java.io.EOFException
at java.base/java.io.DataInputStream.readUnsignedShort(DataInputStream.java:345)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:594)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
at App.java.DiscoveryClient.HandleInputMessage(DiscoveryClient.java:130)
at App.java.DiscoveryClient.run(DiscoveryClient.java:44)
at java.base/java.lang.Thread.run(Thread.java:834)

1 ответ

Решение

Код, который получает файл, не останавливается после прочтения первого файла, но продолжает читать до конца потока, записывая все, что отправлено в тот же файл.

Вам необходимо отслеживать, сколько байтов вы уже прочитали и / или сколько байтов вам еще нужно прочитать:

        int remainingBytes = length;
        while (remainingBytes > 0 && (c = dis.read(buffer, 0, Math.min(buffer.length, remainingBytes))) > 0)
        {
            remainingBytes -= c;
            fos.write(buffer, 0, c);
            // fos.flush(); this is not really necessary
        }

Кстати, используя int для длины файла ограничивает вас файлы не более 2 ГБ. Если это проблема, используйте long вместо int,

Другие вопросы по тегам