Java scoket DataInput не читает, пока не заполнится буфер - PullRequest
0 голосов
/ 30 апреля 2020

Я делаю программу обмена файлами для моей локальной сети и отправляю данные с клиента 1 на сервер, который отправляет их клиенту 2.

Проблема в том, что размер моего буфера 8192 байта, и когда я читаю определенный файл, если он не идеально делится с размером буфера, оставшаяся часть будет зависать в потоке, пока не будет добавлен другой файл, и объем данных, наконец, достигнет размера буфера .

Есть ли способ остановить блокировку read () до достижения порогового значения? Или просто обойти всю ситуацию?

Я знаю, что все пакеты отправлены, потому что я их посчитал, и при подсчете количества пакетов, обработанных сервером, он на единицу меньше полученного.

Вот код сервера:

public void processFile(DataInputStream input){
        try {
            int iteration = 0;
            byte[] buffer = new byte[bufferSize];
            int count;
            while ((count = input.read(buffer)) > 0){
                input.read(buffer);
                for (DataOutputStream output : outputs)
                    output.write(buffer, 0, count);
                System.out.println("batch n. " + iteration);
                iteration++;    
            }

            System.out.println("DONE");
        } catch (IOException io){
            io.printStackTrace();
        }
    }

Код клиента (для отправки, получения во многом совпадает с сервером):

                fileInput = new FileInputStream(file);
                byte[] fileName = file.getName().getBytes();
                // dataOutput.write(fileName, 0, fileName.length);
                System.out.println(new String(fileName));
                while ((count = fileInput.read(buffer)) > 0){
                    System.out.println("Send n. " + iteration);

                    dataOutput.write(buffer, 0, count);
                    iteration++;
                }
                System.out.println("finished sending");
                fileInput.close();
...