Как передать куски с разных клиентов и воссоздать весь файл на сервере, используя Java? - PullRequest
0 голосов
/ 14 ноября 2018

Итак, я работаю в чате с функцией передачи файлов. Это вроде как близко, но я изо всех сил пытаюсь сделать перевод так, как мне нужно. Мне нужно добиться следующего:

если файл «A» находится ТОЛЬКО в клиенте «2», то клиент «2» должен отправить 100% файла клиенту «1»

если файл «A» находится в клиенте «2» и клиент «3» также имеет файл «A», то клиент «2» должен отправить 50% файла клиенту «1», а клиент «3» должен отправить остальные 50%.

(если файл находится в 4 клиентах, я должен быть 25% каждый .... и так далее ...)

Итак, мне удалось сделать перевод один-к-одному (100%), но теперь я не могу сделать общий перевод много-к-одному. Я пытался адаптировать эти методы, которые я нашел в интернете (я уже внес несколько изменений в методы), чтобы я мог использовать переменную «pos» для управления количеством чанков, которое отправит клиент, а затем я создал бы Переменная dinamic int для хранения количества клиентов, с которыми мне пришлось поделиться файлом, и использовать его для управления передачей.

private static void writeFile(File file, OutputStream outStream, long fileSize) {
    FileInputStream reader = null;
    try {
        reader = new FileInputStream(file);
        byte[] buffer = new byte[CHUNK_SIZE];
        int pos = 0;
        int bytesRead;
        while ((bytesRead = reader.read(buffer, 0, CHUNK_SIZE)) >= 0) {
            outStream.write(buffer, 0, bytesRead);
            outStream.flush();
            pos += bytesRead;
            System.out.println(pos + " bytes (" + bytesRead + " bytes read)");

        }
    } catch (IndexOutOfBoundsException e) {
        System.err.println("Error while reading file");
        e.printStackTrace();
    } catch (IOException e) {
        System.err.println("Error while writing " + file.toString() + " to output stream");
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    }


private static void saveFile(File file, InputStream inStream, long fileSize) {
    FileOutputStream fileOut = null;
    try {
        fileOut = new FileOutputStream(file);
        byte[] buffer = new byte[CHUNK_SIZE];
        int bytesRead;
        int pos = 0;
        while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {

            pos += bytesRead;
            System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
            fileOut.write(buffer, 0, bytesRead);

            if (pos == fileSize) {
                break;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fileOut != null) {
            try {
                fileOut.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    System.out.println("Finished, filesize = " + file.length());
}

Но эта идея, похоже, работает только для первой передачи. Я изменил цикл while в saveFile таким образом, чтобы он сохранял только 50% файла от первого клиента, и, как и ожидалось, я получил половину файла .png, который я использовал для тестирования.

while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {
            pos += bytesRead;
            System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
            fileOut.write(buffer, 0, bytesRead);

            if (pos >= fileSize/2) {
                break;
            }
        }

Но я знаю, что не могу завершить .png! Второй клиент не может отправить чуки, где "(pos >= sizeFile/2)", и я получаю следующую ошибку при попытке сделать это:

java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at tor.Client.run(Client.java:109)

Строка 109:

Socket requester = new Socket("192.168.3.114", 2007);

Может кто-нибудь пролить мне свет на эту проблему?

...