Итак, я работаю в чате с функцией передачи файлов. Это вроде как близко, но я изо всех сил пытаюсь сделать перевод так, как мне нужно.
Мне нужно добиться следующего:
если файл «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);
Может кто-нибудь пролить мне свет на эту проблему?