передача файлов с клиента на сервер любой длинны Java-Socket API
Я могу сейчас передавать файлы меджу клиентом и сервером следующим образом:
Клиент связан с сервером с помощью ТСП подключения, и клиент высылает на сервер байты файла в виде переменной String таким образом:
// получаю файл
Path file = Paths.get(fileName);
// записываю байты файла в таблицу байтов
byte[] data = Files.readAllBytes(file);
// получаю байты в виде строки
String dataStr = Base64.getEncoder().encodeToString(data);
Дальше сервер передает эти байты в микросервис который нужен что бы принять байты, создать новый файл, и записать в него полученные байты. Вот как то так выглядт код в микросервисе для передачи файлов:
// создаю пустой файл
FileOutputStream file = new FileOutputStream(login + "/" + serverNameFile);
// записываю полученные байты от клиента в виде строки в таблицу байтов
byte[] data = Base64.getDecoder().decode(dataFile);
// записываю байты в новый файл
file.write(data);
У меня все работает, но для файлов с ограниченной длинной. Как можна было бы улучшить мой код для файлов любой длинны? То есть, можно ли высылать байты в цикле, до тех пор пока они будут считываться с файла и так же в цикле по чуть-чуть их записывать в файл?
У меня сейчас все так работает что клиент подключается у серверу, сервер подключается к микросервису "Передача файлов" - этот микросервис записывает байты и возвращает ответ серверу, а сервер возвращает ответ клиенту, как то так. И когда микросервис вернул ответ серверу, то между ними соединения опять нету, нужно ждать пока клиента опять захочет выслать файл, и сервер заново покдлючится к микросервису "Передача файлов".
Ответы (1 шт):
Этот код я использую для отправки файла с сервера.
File file = new File(file_name);
long length = file.length();
byte[] bytes = new byte[4000 * 1024];
InputStream in1 = new FileInputStream(file);
OutputStream out1 = connection.clientSocket.getOutputStream();
ByteBuffer buf = ByteBuffer.allocate(Long.BYTES);
buf.putLong(length);
System.out.println(length);
// И отправляем
out1.write(buf.array());
System.out.println(buf.array());
int count;
while ((count = in1.read(bytes)) != -1) {
out1.write(bytes, 0, count);
System.out.println(count);
}
out1.close();
in1.close();
System.out.println("file send");
break;
А этот для приема на телефоне
InputStream in = s.getInputStream();
// Читаем размер файл
byte[] fileSizeBuf = new byte[8];
in.read(fileSizeBuf, 0, 8);
// Преобразовываем в long
ByteBuffer buf = ByteBuffer.allocate(Long.BYTES);
buf.put(fileSizeBuf);
buf.flip();
long fileSize = buf.getLong();
File internalStorageDir = getFilesDir();
alice = new File(internalStorageDir,"папка на
телефоне"+"/"+List.file_name + ".zip");
FileOutputStream fos = new FileOutputStream(alice);
byte[] bytes = new byte[4000 * 1024];
int count;
double size=0;
while (fileSize >0 && (count = in.read(bytes)) > 0) {
size += count;
double all = (size / fileSize)*100;
//проерить целостность файла
System.out.println(all);
System.out.println("пришло за цикл: "+count);
System.out.println("всего пришло: "+size);
// Write a line to the file
//fos.write(bytes, 0, count);
fos.write(bytes, 0, count);
}
fos.close();
in.close();
output.close();
break;
надеюсь алгоритм вам понятен.